首先要明確幾點(diǎn):使用STM32串口外設(shè)中的哪一個(gè)?串口發(fā)送或者接收數(shù)據(jù)?串口相關(guān)的參數(shù)配置?發(fā)送或接收是否使用到中斷?
下方為串口發(fā)送的配置。
1. RCC開(kāi)啟USART、串口TX/RX所對(duì)應(yīng)的GPIO口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //開(kāi)啟USART2的時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //開(kāi)啟GPIOA的時(shí)鐘
2. 初始化GPIO口
這里注意哈,根據(jù)自己的需求來(lái)配置GPIO口,發(fā)送和接收是都需要還是只需要其中一個(gè)。然后對(duì)應(yīng)的根據(jù)引腳定義表來(lái)初始化對(duì)應(yīng)的GPIO口。
USART2對(duì)應(yīng)的引腳
![圖片](//file1.elecfans.com/web2/M00/AD/80/wKgaomVN5C6ASwmnAACEGwhPI6Q875.jpg)
USART1對(duì)應(yīng)的引腳
![圖片](//file1.elecfans.com/web2/M00/AF/4D/wKgZomVN5C6AaiujAABzopcY4SM368.jpg)
這里根據(jù)手冊(cè)來(lái)看,RX引腳模式配置成浮空輸入或者上拉輸入。TX引腳模式配置成復(fù)用推挽輸出。
比如我這里只初始化TX發(fā)送端
//TX端
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //USART2對(duì)應(yīng)的TX端為GPIOA2
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50MhZ
GPIO_Init(GPIOA,&GPIO_InitStructure);
3. 串口初始化
注意哈,USART_Init()這個(gè)函數(shù),是用來(lái)配置串口的相關(guān)參數(shù)的。
* USART_BaudRate 串口通信使用的波特率 一般是9600或者是115200,這里我們給9600
* USART_HardwareFlowControl 是否選擇硬件流觸發(fā),一般這個(gè)我們也不選,所以選擇無(wú)硬件流觸發(fā)。
* USART_Mode 這個(gè)參數(shù)要注意了哈,串口的模式,發(fā)送模式還是接收模式,還是兩者都有
* USART_Parity 校驗(yàn)位,可以選擇奇偶校驗(yàn)和不校驗(yàn)。沒(méi)有需求就直接無(wú)校驗(yàn)
* USART_StopBits 停止位 有1、0.5、2位,我們這里選1位停止位
* USART_WordLength 數(shù)據(jù)位 有8位和9位可以選擇
//串口初始化
USART_InitTypeDef USART_InitStruct;
USART_StructInit(&USART_InitStruct); //初始默認(rèn)值
USART_InitStruct.USART_BaudRate=9600;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //不使用硬件流觸發(fā)
USART_InitStruct.USART_Mode=USART_Mode_Tx; //TX 發(fā)送模式
USART_InitStruct.USART_Parity=USART_Parity_No; //不選擇校驗(yàn)
USART_InitStruct.USART_StopBits=USART_StopBits_1; //停止位1位
USART_InitStruct.USART_WordLength=USART_WordLength_8b; //數(shù)據(jù)位8位
USART_Init(USART2,&USART_InitStruct);
4. 串口使能
//串口使能
USART_Cmd(USART2,ENABLE);
5. 串口發(fā)送數(shù)據(jù)
注意哈,我們要判斷TXE標(biāo)志位的狀態(tài)。0,數(shù)據(jù)還沒(méi)有被轉(zhuǎn)移到移位寄存器;1,數(shù)據(jù)已經(jīng)被轉(zhuǎn)移到移位寄存器。
當(dāng)TXE標(biāo)志位為1時(shí),就說(shuō)明可以發(fā)送下一個(gè)數(shù)據(jù)了。詳細(xì)過(guò)程可看上面串口發(fā)送的解釋。
void Serial_SendByte(uint16_t Byte)
{
USART_SendData(USART2,Byte);
//0 表示數(shù)據(jù)還未轉(zhuǎn)移到移位寄存器 循環(huán)等待 1 數(shù)據(jù)已經(jīng)被轉(zhuǎn)移到了移位寄存器可以發(fā)送數(shù)據(jù)
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET); //不需要手動(dòng)清零 再次寫(xiě)入TDR時(shí)會(huì)自動(dòng)清零
}
經(jīng)過(guò)上述五步的配置,單片機(jī)就可以通過(guò)串口發(fā)送數(shù)據(jù)了。
下方為發(fā)送數(shù)據(jù)圖例,STM32向串口發(fā)送0x16數(shù)據(jù)
![圖片](//file1.elecfans.com/web2/M00/AD/80/wKgaomVN5C6AehIXAADtGeauIak368.jpg)
-
STM32
+關(guān)注
關(guān)注
2270文章
10901瀏覽量
356224 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1734瀏覽量
131518 -
串口
+關(guān)注
關(guān)注
14文章
1555瀏覽量
76561 -
串口通信
+關(guān)注
關(guān)注
34文章
1626瀏覽量
55545
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論