STM32F4 USART配置
對于串口就不多羅嗦了, 雖然串口是一種比較古老的接口, 速度較慢, 在計(jì)算機(jī)上早已淘汰, 但是由于它結(jié)構(gòu)簡單, 使用方便, 或許也由于在計(jì)算機(jī)上使用過有基礎(chǔ)支撐(單片機(jī)就是在走曾經(jīng)電腦走過的路), 在嵌入式系統(tǒng)中依然使用相當(dāng)廣泛.
在STM32F429中, 一共有8個(gè)串口, 4個(gè)USART, 4個(gè)UART.
今天要實(shí)現(xiàn)的目標(biāo), 就是讓STM32向串口發(fā)送數(shù)據(jù)到電腦, 讓它正真的輸出”Hello World!”!
還是使用以前的工程, 不過工程結(jié)構(gòu)略有更改, 如下圖:
不同于以前, 我現(xiàn)在選擇把整個(gè)固件庫復(fù)制到STM32F4xx_StdPeriph文件夾中, 在用到某個(gè)外設(shè)時(shí)將外設(shè)對應(yīng)的C文件添加進(jìn)來即可.
本次通訊使用查詢的方式實(shí)現(xiàn). 當(dāng)波特率為115200bps. 雖然對于168M的CPU主頻來說, 使用查詢的方式發(fā)送數(shù)據(jù)太過于浪費(fèi), 不過由于CPU沒有其它任務(wù), 而且我急于想看到結(jié)果, 相比配置中斷, 還有寫一個(gè)FIFO來說, 我覺得用查詢方式更容易讓我接受:)
USART1的初始化.
如同GPIO, USART也提供了一個(gè)初始化的結(jié)構(gòu)體, 填入對應(yīng)的數(shù)據(jù), 做為參數(shù)傳給USART_Init()就可以了.
除此之外, 還有兩點(diǎn)是需要注意的, 一是要使能USART的時(shí)鐘(這對于所有的外設(shè)都是一樣的), 二是因?yàn)橐_復(fù)用, 要做相關(guān)配置.
STM32F4系列串口引腳復(fù)用與STM32F1系列不一樣的一點(diǎn)地方:
STM32F1系列設(shè)置引腳模式為GPIO AF模式就可以了, STM32F4系列還要額外調(diào)用GPIO_PinAFConfig()函數(shù)配置相應(yīng)的復(fù)用引腳.
/**
* @brief UART1 初始化, 115200, 8, N, 1
*/
void USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 使能對應(yīng)的時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// 引腳復(fù)用功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
// 串口用到的引腳初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART1初始化
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);
return;
}
/**
* @brief 從串口發(fā)送一個(gè)字符串, 使用查詢方式
*
* @param str 要發(fā)送的字符串
*/
void USART1_Puts(uint8_t *str)
{
while (*str != '