В данной теме будет рассмотрено начало работы с 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.