Статьи..


STM32. Первый проект.

При изучении нового семейства, как правило, пишут не сложную программу, которая мигает светодиодами. Так как кроме светодиодов на плате STM32VLDISCOVERY есть кнопка, то ее так же задействуем в нашей программе.

Алгоритм работы следующий: После инициализации программа начинает перемигиваться светодиодами и сканирует кнопку на факт нажатия. Если кнопка была нажата, то светодиод, который был включен в момент нажатия мигает пять раз (другой светодиод все это время выключен). Далее происходит возврат в начальное состояние.

Порты STM32 имеют очень гибкую настройку – для конфигурации каждого вывода порта выделено 4 бита. Если в оба бита в поле MODE[]=0, то линия порта настроена на ввод.

STM32F10x - GPIO

После сброса регистры GPIOx_CRL, GPIOx_CRH содержат значение 0x44444444, т.е. каждый вывод микроконтроллера настроен на ввод (MODE[1..0]=00) в режиме Input floating (CNF[1..0]=01). Запись GPIOx_CRL=0x44444445, например, переключит GPIOx_0 в состояние Open-drain выхода с частотой 10МHz.

Программа достаточно проста и написана без использования Standard Peripherals Library.

#define STM32F10X_MD_VL
#include <stm32f10x.h>

/* LED_Green - PC9
LED_Blue - PC8
Button - PA0 */

#define TIME_DELAY 800000
#define PULSE_CNT 5

uint8_t state, cnt;

// функция программной задержки
void Delay(uint32_t time_d){
while(time_d--);
}

// управление состоянием светодиодов
void Led(uint8_t stat){
GPIOC->ODR &= 0xFCFF; // LED_Blue,LED_Green Off
switch(stat){
case 0: // LED_Blue On
GPIOC->ODR |= 1 << 8;
break;
case 1: // LED_Green On
GPIOC->ODR |= 1 << 9;
}
}
// проверка состояния кнопки (1-нажата, 0-отпущена)
uint8_t Button(uint32_t time_d){
while(time_d--){ if(GPIOA->IDR & 0x0001){return 1;} }
return 0;
}

void SystemInit(){
// включим тактирование - портов A,C
RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN;
// настроим PC8,PC9 на вывод
GPIOC->CRH &= 0xFFFFFF00 ;
GPIOC->CRH |= (GPIO_CRH_MODE8_0 | GPIO_CRH_MODE9_0) ;
// настроим PА0 на ввод
// ( .. не обязательно, т.к. это состояние устанавливается автоматически при запуске)
GPIOA->CRL = 0x44444444 ;

int main(void){
state=0;
while(1){
blink:
Led(state);
if(Button(TIME_DELAY/2)){goto pulse;}
state++;
state &=1; // ограничим диапазоном 0..1
goto blink;
pulse:
cnt=PULSE_CNT;
while(cnt--){
Led(0x2); // LED_Off
Delay(TIME_DELAY);
Led(state); // LED_On
Delay(TIME_DELAY);}
}
}

Зеленый светодиод подключен к PC9, синий к PC8, кнопка к PA0. Вывод PA0 притянут через резистор к "земле", соответственно при отпущенной кнопке PA0=0, при нажатой PA0=1.

В целях уменьшения энергопотребления, большинство модулей STM32 находятся в выключенном состоянии. Чтобы включить модуль – нужно включить его тактирование. Т.е. без строки

RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN;

светодиоды переключаться не будут.
Для изменения скорости переключения диодов, в программе нужно поменять значение константы TIME_DELAY.

STM32VLDISCOVERY

Программа компилировалась в среде Keil.

Исходый код проекта.

На главную страницу...