在STM32開發(fā)中,串口是我們最常用的接口。通過串口,我們很方便地把數(shù)據(jù)輸出到電腦,方便我們進行程序調(diào)試。下面我們來看看STM32的串口通訊代碼。要實現(xiàn)串口通訊,我們要進行下面幾個步驟:
本文引用地址:http://m.butianyuan.cn/article/201611/320922.htm首先:要打開GPIO口的時鐘和串口模塊時鐘。在圓點博士小四軸中,我們用的是GPIOA和COM1模塊。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
其次:要指定GPIO口,即確定哪些IO是用于串口通訊的。記得使用GPIO_Mode_AF_PP模式
GPIO_InitStructure.GPIO_Pin = BS004_COM1_TX;//圓點博士:設(shè)置PA9管腳為串口TX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //圓點博士:設(shè)置串口TX最大允許輸出速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //圓點博士:設(shè)置串口TX為輸出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//
GPIO_InitStructure.GPIO_Pin = BS004_COM1_RX;//圓點博士:設(shè)置PA9管腳為串口RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //圓點博士:設(shè)置串口RX為輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);
第三步:設(shè)置串口模塊參數(shù),如波特率,奇偶校驗這些。
USART_InitStructure.USART_BaudRate = 115200;//圓點博士:設(shè)置串口波特率為115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //圓點博士:設(shè)置串口數(shù)據(jù)長度為8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //圓點博士:設(shè)置串口停止位長度為1位
USART_InitStructure.USART_Parity = USART_Parity_No ;//圓點博士:設(shè)置串口奇偶校驗為無
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //圓點博士:設(shè)置串口數(shù)據(jù)流控制為無
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//圓點博士:設(shè)置串口為發(fā)送和接收模式
USART_Init(USART1, &USART_InitStructure);//圓點博士:設(shè)置串口參數(shù)
第四步:如果使用串口中斷的話,還要設(shè)置中斷優(yōu)先級。下面例子設(shè)置為最高優(yōu)先級0。
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
最后一步,就是打開中斷,并使能串口模塊拉。
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//圓點博士:允許接收中斷
USART_Cmd(USART1, ENABLE);
上面例子只啟動了接收中斷。這樣,當STM32串口接收到數(shù)據(jù)的時候,代碼就會自動跳轉(zhuǎn)到中斷代碼里面執(zhí)行對應(yīng)的操作。
那么,對于發(fā)送,怎么辦呢? 我們采用查詢的方式來發(fā)送。
void BS004_COM1_Send_Char(unsigned char ascii_code) //圓點博士:發(fā)送一個字符
{
USART_SendData(USART1,ascii_code);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}//圓點博士:等待直到發(fā)送完成
}
如過要發(fā)送單字符,使用下面的方法:
BS004_COM1_Send_Char(/);//圓點博士:發(fā)送字符/
BS004_COM1_Send_Char(13);//圓點博士:發(fā)送回車字符
如過要發(fā)送字符串,則使用下面的方法。
void BS004_COM1_Send_Str_Body(unsigned char* str_buf)//圓點博士:發(fā)送一個指定長度的字符串
{
unsigned char i,str_len;
str_len=0;
for(i=0;i<64;i++)
{
str_len++;
if(str_buf[i]==.) break;
}
for(i=0;i
}
在上面的例子中,使用了符號.作為字符串結(jié)束標志。
評論