目錄
1:概述
2:**
1:概述
1.1:本篇實現串列埠驅動,實現printf函式的重定向,實現串列埠的中斷接受和傳送,效仿modbus協議中的3.5t超時機制,判斷是否接受完畢;
1.2:如果串列埠僅僅是實現乙個控制台,列印一些debug資料,使用printf函式(串列埠傳送資料忙等待),如果是需要用串列埠進行外設裝置的控制,比如串列埠gprs模組,需使用串列埠中斷進行控制,因為受限於串列埠的傳輸速率,如果使用忙等待傳送資料,會阻塞主程式中的其它任務;
1.3:使用sysclk作為超時定時器,sysclk的中斷優先順序需高於串列埠中斷;
1.4:除過使用3.5t超時時間判斷接受資料是否完成外,還可使用ascll碼的形式,利用字元操作庫函式,自定義串列埠通訊協議;
1.5:開發板:stm32f103zert 軟體環境:keil mkd5
1.6:115200 波特率,間隔1ms傳送字串 "password",主程式將接收到"password"後返回"123456\r\n",測試主程式響應迅速,不丟幀;
unsigned int t_35 = 0; //串列埠傳送3.5個位元組的時間,由波特率得出,單位為ms
int main(void)
} }}
usart_init.c
#include "usart_init.h"
u8 usart_receive_ok = 0;
u8 start_receive_flag = 0;
u8 usart_tx_buff[tx_re_buff_length];
u8 usart_rx_buff[tx_re_buff_length];
comx_define cycle;
/*******************printf()函式重定向***************/
//傳送函式
int fputc(int ch, file *f)
//接受函式
int fgetc(file *f)
void usart_init(u32 baud)
void usart_send_byte(u8 data)
}/*串列埠傳送函式*/
void usart_send_data(u8 *ptr,u8 num)
} else //傳送num位元組資料 }
}/*串列埠接收函式,當接收到可用的資料幀時,對接收到的資料進行處理,main函式中呼叫*/
void usart_handle_func(void)
buff[i] = '\0';
// usart_send_data(buff,0);
// usart_send_data("\r\n",0);
if(memcmp(buff,"password",8) == 0) }
///*中斷處理函式*/
void usart2_irqhandler(void)
else
}else
if(usart_getitstatus(usart2, usart_it_rxne) != reset) //接收完成中斷
}
STM32串列埠通訊(基於緩衝區)
一 串列埠的初始化和中斷設定 1 初始化gpio 根據手冊的8.1.11節,我們可以找到下表 在全雙工的模式下,傳送引腳需要設定為推挽復用輸出,接收引腳則設定為浮空輸入或帶上拉的輸入。因為一般不用同步和流量控制的方式,所以ck rst cts引腳不作配置。當然啦,在使用stm32外設的時候不要忘記開...
stm32 環形緩衝區
ringbuff.h ifndef ringbuff h define user ringbuff 1 使用環形緩衝區形式接收資料 if user ringbuff 如果使用環形緩衝形式接收串列埠資料 define ringbuff len 200 最好是2 n,此時就可以進行用取模運算 defin...
stm32串列埠通訊
通訊方式 1 同步通訊 帶時鐘同步訊號傳輸 spi,iic等 2 非同步通訊 不帶時鐘用途訊號 usrt,單匯流排 stm32串列埠引腳表 串口號 rxd txd 1 pa10 pa9 2 pa3pa2 3 pb11 pb10 4 pc11 pc10 5 pd2pc12 通訊過程 接收過程 由rx入...