Найти тему
Astro-grad

Управление ножками в stm32

На всякий случай запишу, что меня смутило при первых попытках управления ножками на микроконтроллерах stm32. Возможно это пригодится кому-нибудь, кто делает самые первые шаги в освоении этих микроконтроллеров.

Обычно в примерах пишут как помигать светодиодом на плате. Для STM32F103C8T6 это пин C13. Код выглядит примерно так:

int main(void)
{
// Объявляем переменную GPIO_InitStructure типа GPIO_InitTypeDef
GPIO_InitTypeDef GPIO_InitStructure;
// Это функция из файла stm32f10x_rcc.c, включает тактирование на GPIOC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// Заполняем поля структуры нужными значениями
// Управлять будем пином – C13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
sysTickDalayInit();
while (1)
{
/* Меняем логическое значение на ножке C13*/
GPIOC->ODR ^= GPIO_Pin_13;
sysTickDalay(1000);
}
}

И ты думаешь, окей. С этим все понятно, светодиод мигает. Но подождите, ведь в основном ножки называются A0 - A15 и B0 - B15. А ножек C всего три C13, C14, C15.

stm32f103c8t6 распиновка
stm32f103c8t6 распиновка

И только спустя какое-то время доходит, что чтобы управлять ножками A нужно вместо GPIOC везде писать GPIOA, а чтобы ножками B - GPIOB.

Сейчас то это кажется очевидным, но сначала было не понятно.

То есть для пина A0 пример будет выглядеть так:

int main(void)
{
// Объявляем переменную GPIO_InitStructure типа GPIO_InitTypeDef
GPIO_InitTypeDef GPIO_InitStructure;
// Это функция из файла stm32f10x_rcc.c, включает тактирование на GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// Заполняем поля структуры нужными значениями
// Управлять будем пином – A0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
sysTickDalayInit();
while (1)
{
/* Меняем логическое значение на ножке A0*/
GPIOA->ODR ^= GPIO_Pin_0;
sysTickDalay(1000);
}
}

Для пина B0 код будет выглядеть так:

int main(void)
{
// Объявляем переменную GPIO_InitStructure типа GPIO_InitTypeDef
GPIO_InitTypeDef GPIO_InitStructure;
// Это функция из файла stm32f10x_rcc.c, включает тактирование на GPIOB
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// Заполняем поля структуры нужными значениями
// Управлять будем пином – B0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
sysTickDalayInit();
while (1)
{
/* Меняем логическое значение на ножке B0*/
GPIOB->ODR ^= GPIO_Pin_0;
sysTickDalay(1000);
}
}

Пример функций sysTickDalayInit() и sysTickDalay() подсмотрел вот здесь https://blog.avislab.com/stm32-systick_ru/

Кроме того, для работы примеров требуется подключить модули stm32f10x_gpio.h и stm32f10x_rcc.h