Предлагаю двигаться дальше...
5. Запускаем первую программу...В части 3 мы вплотную подошли к запуску 1-й программы на нашем МК. Однако, чтобы она заработала на STM32F050F, необходимо ее немного подправить, т.к. у нас нет ножек C8 и C9, использованных в примере.
Откроем наш МК в STM32CubeMX и выберем парочку ножек. Для начала советую выбрать что-нибудь из GPIOA 0-10. Остальные тоже можно использовать, но с ними будут свои заморочки.
Я для примера возьму A0 и A4:
Посмотрим наш код (функция main в файле main.c):
int main(void)
{
GPIO_InitTypeDef InitGpio;
unsigned int i = 0;
// Initialises the system clock
SystemInit();
// Enables the clock for GPIOC
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
// Configures the GPIOC pin8 and pin9, since leds are connected
// to PC8 and PC9 of GPIOC
InitGpio.GPIO_Pin = (GPIO_Pin_8 | GPIO_Pin_9);
InitGpio.GPIO_Mode = GPIO_Mode_OUT;
InitGpio.GPIO_Speed = GPIO_Speed_Level_1;
InitGpio.GPIO_OType = GPIO_OType_PP;
InitGpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
// Initialises the GPIOC
GPIO_Init(GPIOC, &InitGpio);
while(1)
{
// Turn ON the Leds
GPIO_SetBits(GPIOC, (GPIO_Pin_8 | GPIO_Pin_9));
// Delay
for (i = 0; i < 0x0FFFFF; i++);
// Turn OFF the Leds
GPIO_ResetBits(GPIOC, (GPIO_Pin_8 | GPIO_Pin_9));
// Delay
for (i = 0; i < 0x0FFFFF; i++);
}
}
То, где надо внести изменения, выделено красным цветом. Меняем все GPIOC на GPIOA и (GPIO_Pin_8 | GPIO_Pin_9) на нужные номера пинов, в моем случае - (GPIO_Pin_0 | GPIO_Pin_4).
Компилируем (F7), подключаем ST-Link к МК если еще не подключен, и заливаем нашу прошивку (Flash->Program Download).
Теперь напряжение на выбранных нами ножках периодически будет менять значение с 0В на 3.3В и обратно. Если подключить к этим ножкам СД через резисторы (думаю не нужно объяснять как это сделать
), то они будет мигать.
NB!: при расчете резисторов стоит учесть, что по даташиту максимальный ток через 1 ножку ввода-вывода не должен превышать 25 мА, и через все в сумме не более 80 мА. Если надо больше - через транзистор.
Разберем теперь по порядку, что же мы делаем в программе:
- Код: выделить все
SystemInit();
Вызываем функцию начальной инициализации МК (установка источника тактирования, множителей и частоты, инициализация некоторых регистров). Строго говоря необязательно, но так мы точно можем узнать что у нас и как настроено. Можно переопределить на свою функцию инициализации.
- Код: выделить все
// Enables the clock for GPIOA
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
Включаем тактирование ножек ввода-вывода порта А. Здесь остановимся поподробнее, т.к. это частая ошибка, особенно у тех кто переходит с AVR.
В отличие от AVR у STM32 при включении питания выключено тактирование всей периферии с целью экономии энергии, и если мы хотим использовать какой либо блок, будь то порт ввода-вывода, таймер или часы реального времени, первым делом надо его включить!
- Код: выделить все
// Configures the GPIOA pin8 and pin9, since leds are connected
// to PC8 and PC9 of GPIOA
InitGpio.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_4);
InitGpio.GPIO_Mode = GPIO_Mode_OUT;
InitGpio.GPIO_Speed = GPIO_Speed_Level_1;
InitGpio.GPIO_OType = GPIO_OType_PP;
InitGpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
// Initialises the GPIOA
GPIO_Init(GPIOA, &InitGpio);
Тут идет настройка самого порта. Определяем пины какие хотим настроить, режим - выход, скорость - минимальная:
GPIO_Speed_Level_1 = 0x00, /*!< I/O output speed: Low 2 MHz */
GPIO_Speed_Level_2 = 0x01, /*!< I/O output speed: Medium 10 MHz */
GPIO_Speed_Level_3 = 0x03 /*!< I/O output speed: High 50 MHz */
чем меньше установлена скорость тем более гладкие фронты и меньше энергопотребление.
Тип вывода - Push-Pull, подтяжки - нет.
Ну и запускается собственно процедура инициализации порта GPIOA с установленными выше параметрами.
Далее идет бесконечный цикл
while(1)
- Код: выделить все
GPIO_SetBits(GPIOA, (GPIO_Pin_0 | GPIO_Pin_4));
устанавливаем высокое напряжение (3.3В) на пинах 0 и 4
- Код: выделить все
for (i = 0; i < 0x0FFFFF; i++);
задержка
- Код: выделить все
GPIO_ResetBits(GPIOA, (GPIO_Pin_0 | GPIO_Pin_4));
устанавливаем низкое напряжение
и опять задержка
В общем-то ничего сложного, нужно только базовое знание Си и знать где искать требуемую функцию.
Я не буду писать курс по базовому программированию, их в интернете предостаточно и очень хороших, лучше мне не написать. Советую в первую очередь обратить внимание на:
ARM. Учебный курс на easyelectronics.ru,
STM32 - учебный курс от robocraft.ru,
Для начинающих - курс от easystm32.ru,
STM32 с нуля от microtechnics.ru
Я же со следующей статьи думаю сосредоточиться на изучении ChibiOS, хотя и иные предложения и пожелания принимаются. Если что не понятно - пишите!