Кирпичики знаний

Наверно не только у меня одного было желание как-то малость систематизировать знания по использованию того или иного периферийного устройства в STM32 и выложить в общий доступ примеры коротких программ.

Одного желания мало. Нужно еще поработать в этом направлении. А что бы выработать годный к употреблению продукт, нужно достаточно много свободного времени. А его-то как раз и нет. Поэтому многие авторы (и я в том числе) публиковали в своих блоах неполные наборы кирпичей. То есть, мечты создать исчерпывающий набор простых программ так и остались мечтами.

Но сегодня в рассылке пришло сообщение от Компэла, что ST выложила в общий доступ то, о чем мы все мечтали — эти самые кирпичики знаний.

Вот здесь вы можете скачать бесплатно как сам сжатый архив файлов, так и 14-страничное руководство к нему:

http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF260157?icmp=pf260157_pron_pr-stm32snippets_mar2014#

Для примера, вот так выглядит пример использования портами ввода-вывода:

/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"

int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f0xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f0xx.c file
     */

  ConfigureGPIO();
  SysTick_Config(48000); /* 1ms config */
  LockGPIOA(1<<0 | 1<<8 | 1<<9); /* Locks PA0, PA8 and PA9 */
  ChangeGPIOA_Configuration();
  while (1) /* Infinite loop */
  {
  }
}

/**
  * @brief  This function enables the peripheral clocks on GPIO port A and port C,
  *         configures the green LED pin on GPIO PC9,
  *         configures the orange LED pin on GPIO PC8,
  *         keep default configuration for PA0 except select pull-down in PUPDR.
  * @param  None
  * @retval None
  */
__INLINE void  ConfigureGPIO(void)
{
  /* (1) Enable the peripheral clock of GPIOA and GPIOC */
  /* (2) Select output mode (01) on GPIOC pin 8 and 9 */
  /* (3) Select Pull-down (10) for PA0 */
  RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOCEN; /* (1) */
  GPIOC->MODER = (GPIOC->MODER & ~(GPIO_MODER_MODER8|GPIO_MODER_MODER9)) \
               | (GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0); /* (2) */
  GPIOA->PUPDR = (GPIOA->PUPDR & ~(GPIO_PUPDR_PUPDR0)); /* (3) */
}

/**
  * @brief  This function locks the targeted pins of Port A configuration
            This function can be easily modified to lock Port B
  * @param  lock contains the port pin mask to be locked
  * @retval None
  */
void  LockGPIOA(uint16_t lock)
{
  /* (1) Write LCKK bit to 1 and set the pin bits to lock */
  /* (2) Write LCKK bit to 0 and set the pin bits to lock */
  /* (3) Write LCKK bit to 1 and set the pin bits to lock */
  /* (4) Read the Lock register */
  /* (5) Check the Lock register (optionnal) */
  GPIOA->LCKR = GPIO_LCKR_LCKK + lock; /* (1) */
  GPIOA->LCKR = lock; /* (2) */
  GPIOA->LCKR = GPIO_LCKR_LCKK + lock; /* (3) */
  GPIOA->LCKR; /* (4) */
  if ((GPIOA->LCKR & GPIO_LCKR_LCKK) == 0) /* (5) */
  {
    error |= ERROR_LOCK_FAILED; /* Report an error */
  }
}

/**
  * @brief  This function writes in the protecting registers
  *         and check they are not modified
  * @param  None
  * @retval None
  */
__INLINE void  ChangeGPIOA_Configuration(void)
{
uint32_t mode, pupd, ospeed, afr;

  /* Store the current configuration */
  mode = GPIOA->MODER;
  pupd = GPIOA->PUPDR;
  ospeed = GPIOA->OSPEEDR;
  afr = GPIOA->AFR[1];

  /* (1) Select output mode on GPIOA pin 8 and 9 */
  /* (2) Select Pull-up for PA0 */
  /* (3) Select high speed for GPIOA pin 8 (max 50MHz) - OSPEEDR8 = 11*/
  /* (4) Select AFR2 for PA8 and AFR3 for PA9 */
  GPIOA->MODER |= (GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0); /* (1) */
  GPIOA->PUPDR |= GPIO_PUPDR_PUPDR0_0; /* (2) */
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8; /* (3) */
  GPIOA->AFR[1] |= 2 + (3 << ((9-8) *4)); /* (4) */

  /* Check each configuration register has not been modified */
  if ((GPIOA->MODER != mode) || (GPIOA->PUPDR != pupd) || (GPIOA->OSPEEDR != ospeed) || (GPIOA->AFR[1] != afr))
  {
    error |= ERROR_WRITING_OK; /* Report an error */
  }
}

Фрагмент кода не полный, я просто вырезал кусок кода из файла.

А вот кусок кода, вырезанный из примера использования UASRT:

int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f0xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f0xx.c file
     */

  Configure_GPIO_LED();
  Configure_GPIO_USART1();
  Configure_USART1();
  Configure_GPIO_Button();
  Configure_EXTI();

  /* Start transmission in button IRQ handler */

  /* Infinite loop */
  while (1)
  {

  }
}

/**
  * @brief  This function :
             - Enables GPIO clock
             - Configures the Green LED pin on GPIO PC9
             - Configures the Orange LED pin on GPIO PC8
  * @param  None
  * @retval None
  */
__INLINE void Configure_GPIO_LED(void)
{
  /* Enable the peripheral clock of GPIOC */
  RCC->AHBENR |= RCC_AHBENR_GPIOCEN;

  /* Select output mode (01) on PC8 and PC9 */
  GPIOC->MODER = (GPIOC->MODER & ~(GPIO_MODER_MODER8 | GPIO_MODER_MODER9)) \
                 | (GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0);
}

/**
  * @brief  This function :
             - Enables GPIO clock
             - Configures the USART1 pins on GPIO PB6 PB7
  * @param  None
  * @retval None
  */
__INLINE void Configure_GPIO_USART1(void)
{
  /* Enable the peripheral clock of GPIOA */
  RCC->AHBENR |= RCC_AHBENR_GPIOAEN;

  /* GPIO configuration for USART1 signals */
  /* (1) Select AF mode (10) on PA9 and PA10 */
  /* (2) AF1 for USART1 signals */
  GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER9|GPIO_MODER_MODER10))\
                 | (GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1); /* (1) */
  GPIOA->AFR[1] = (GPIOA->AFR[1] &~ (GPIO_AFRH_AFRH1 | GPIO_AFRH_AFRH2))\
                  | (1 << (1 * 4)) | (1 << (2 * 4)); /* (2) */
}

/**
  * @brief  This function configures USART1.
  * @param  None
  * @retval None
  */
__INLINE void Configure_USART1(void)
{
  /* Enable the peripheral clock USART1 */
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN;

  /* Configure USART1 */
  /* (1) oversampling by 16, 9600 baud */
  /* (2) 8 data bit, 1 start bit, 1 stop bit, no parity */
  USART1->BRR = 480000 / 96; /* (1) */
  USART1->CR1 = USART_CR1_TE | USART_CR1_UE; /* (2) */

  /* polling idle frame Transmission */
  while((USART1->ISR & USART_ISR_TC) != USART_ISR_TC)
  {
    /* add time out here for a robust application */
  }
  USART1->ICR |= USART_ICR_TCCF;/* clear TC flag */
  USART1->CR1 |= USART_CR1_TCIE;/* enable TC interrupt */

  /* Configure IT */
  /* (3) Set priority for USART1_IRQn */
  /* (4) Enable USART1_IRQn */
  NVIC_SetPriority(USART1_IRQn, 0); /* (3) */
  NVIC_EnableIRQ(USART1_IRQn); /* (4) */
}

Что приятно отметить — примеры не используют стандартные дурдуино-библиотеки для «девочек». Только хард-кор. Вот это по-нашему, по бойцовски!

Обратите внимание, что примеры даны для микроконтроллеров с ядром Cortex-M0. Примеры для Cortex-M3 и -M4, я так думаю, тоже появятся в ближайшее время.

Реклама

One response to “Кирпичики знаний

  1. Тоже очень радовался, когда увидел, что ST наконец-то выпустили нормальные примеры. До этого они даже на семинарах пропихивали свой HAL, попахивающий Ардуино, и потому совершенно не подходящий для чего-то серьезного. Жалко только, что, как всегда, знаковое событие случилось уже после того, как я самостоятельно почти во всем разобрался.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s