Перейти к содержимому

#5.4. Запускаем «blink» (Расширенная версия)

Основные этапы инициализации, необходимые для использования любой из периферийных устройств STM32:

  1. Включить тактирование на периферию
  2. Настроить контакты, необходимые для периферийных устройств
  3. Настроить периферийное оборудование

Все процессоры STM32, как члены семейства Cortex-M3, имеют системный таймер ядра, который можно использовать для обеспечения регулярного тактового «тика». Мы используем этот таймер для обеспечения постоянной частоты мигания в нашем примере. Программа начинается с включения соответствующих заголовков библиотеки встроенного программного обеспечения — в данном случае для конфигурации часов и выводов. Основная процедура следует этапам инициализации, а затем входит в цикл, в котором она переключает светодиод и ожидает 250 мс. За основной процедурой следует код, реализующий функцию задержки, которая использует системный таймер. Наконец, предоставляется вспомогательная функция для обработки нарушений утверждений в библиотеке встроенного программного обеспечения (требуется, если при компиляции модулей библиотеки встроенного программного обеспечения определено значение USE_FULL_ASSERT). Хотя обработчик assert_failed ничего не делает, он очень полезен при отладке новых проектов, поскольку библиотека микропрограммного обеспечения выполняет обширную проверку параметров.

#include <stm32f10x.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
void Delay(uint32_t nTime);
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Enable Peripheral Clocks
... (1) ...
// Configure Pins
... (2) ...
// Configure SysTick Timer
... (3) ...
while (1) {
static int ledval = 0;
// toggle led
... (4) ...
Delay(250); // wait 250ms
}
}
// Timer code
... (5) ...

Плата STM32 имеет светодиод, управляемый выводом ввода-вывода PC13. Чтобы настроить этот вывод, необходимо сначала включить тактирование для порта C GPIO с помощью следующей команды библиотеки:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE); // (1)

После включения тактирования необходимо настроить все необходимые контакты. В этом случае один вывод (PC13) должен быть настроен как выход.

/* (2) */
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC , &GPIO_InitStructure);

После завершения настройки, можно установить или сбросить пин с помощью следующего кода:

/* (4) */
GPIO_WriteBit(GPIOC , GPIO_Pin_13 , (ledval) ? Bit_SET : Bit_RESET);
ledval = 1 - ledval;

Демонстрация blink’а также использует « timer tick » для измерения времени. Ядро Cortex-M3, используемое в процессорах STM32, имеет специальный таймер для этой функции. Таймер, кратный системному такту (который определяется в тиках / секундах) — здесь мы настраиваем его для прерываний в 1 мсек (константа SystemCoreClock определяется в библиотеке встроенного программного обеспечения как число циклов системных тактов в секунду):

/* (3) */
if (SysTick_Config(SystemCoreClock / 1000))
while (1);

Каждые 1 мс таймер запускает вызов SysTick_Handler. Для демонстрации blink’а мы просто уменьшаем общий счетчик, объявленный как __IO, чтобы компилятор не выполнял нежелательную оптимизацию.

Полный код программы:

/* (5) */
static __IO uint32_t TimingDelay;
void Delay(uint32_t nTime){
TimingDelay = nTime;
while(TimingDelay != 0);
}
void SysTick_Handler(void){
if (TimingDelay != 0x00)
TimingDelay --;
}

Эта простая программа blink’а требует поддержки двух библиотечных модулей (stm32_gpio.c, stm32_rcc.c).

#include <stm32f10x.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
void Delay(uint32_t nTime);
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Enable Peripheral Clocks
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
// Configure Pins
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC , &GPIO_InitStructure);
// Configure SysTick Timer
if (SysTick_Config(SystemCoreClock / 1000))
while (1);
while (1) {
static int ledval = 0;
// toggle led
GPIO_WriteBit(GPIOC , GPIO_Pin_13 , (ledval) ? Bit_SET : Bit_RESET);
ledval = 1 - ledval;
Delay(250); // wait 250ms
}
}
// Timer code
static __IO uint32_t TimingDelay;
void Delay(uint32_t nTime){
TimingDelay = nTime;
while(TimingDelay != 0);
}
void SysTick_Handler(void){
if (TimingDelay != 0x00)
TimingDelay --;
}
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x