Search
Write a publication
Pull to refresh

STM32, Hello world!

В данной теме будет рассмотрено начало работы с USART-ом в микроконтроллерах серии stm32 (плата stm32discovery).




Для начала


Предполагается, что читатель уже дело с микроконтроллерами.
Лично я имел дело только с МК серии avr.
У вас должна быть установленная среда ColIde и плата моргающая лампочками.

Замеченные проблемы

Я использую студию версии 1.2.3. Cтолкнулся с такой проблемой: плата никак не прошивалась.

Такое-же сообщение сообщение об ошибке мне выдавала и сама ide.
Для решения этой проблемы надо взять dll-ку (STLinkUSBDriver.dll) из IAR-a и сунуть в директорию «bin» самой студии.

Hello World, черт возьми!


Запуск UART.

Подключаем плату, средствами любого переходника, usb-uart к компьютеру где: PA10 = rx, PA9 = tx.
Открываем документацию «Standard Peripherals Firmware Library», открываем раздел «примеры» и ищем пример пример заполнения структуры USART_InitTypeDef:

RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);

Инициализируем порты:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* Configure USART1 Rx (PA10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Tx (PA9) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);


Свой printf, с блэкджеком и куртизанками

void print(const char* str)
{
for(unsigned int i = 0; str[i]; i++)
{
while(!USART_GetFlagStatus(USART1,USART_FLAG_TC));
USART_SendData(USART1,str[i]);
}
}

Перед отправкой следующего байта необходимо подождать флаг TC (передача окончена).

Profit

int main()
{
SetupUSART();
print("Hell Habraworld\n");
return 0;
}

Открываем терминал, открываем порт, жмем пару раз reset на плате и…



Вместо постскриптума


USART в данном МК имеет ещё много режимов работы, на практике разница только в инициализации.
Подобным образом работает большая часть периферии во всей серии STM8/32.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.