當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]對于串口就不多羅嗦了, 雖然串口是一種比較古老的接口, 速度較慢, 在計(jì)算機(jī)上早已淘汰, 但是由于它結(jié)構(gòu)簡單, 使用方便, 或許也由于在計(jì)算機(jī)上使用過有基礎(chǔ)支撐(單片機(jī)就是在走曾經(jīng)電腦走過的路), 在嵌入式系統(tǒng)中依然

對于串口就不多羅嗦了, 雖然串口是一種比較古老的接口, 速度較慢, 在計(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 != '