目前我總結了兩種串列埠通訊時用到的串列埠協議程式。均學習的原子哥的。
一、定義某個字元為一次接收資料完成,如/n/r。
二、定義兩個字元接收時間間隔,如10ms。超過即為第二次接收。
一、程式示意:
二、程式示意、
#include \"delay.h\"
#include \"usart2.h\"
#include \"stdarg.h\"
#include \"stdio.h\"
#include \"string.h\"
//
//本程式只供學習使用,未經作者許可,不得用於其它任何用途
//alientek戰艦stm32開發板
//串列埠2驅動**
//正點原子@alientek
//技術論壇:www.openedv.com
//修改日期:2013/2/22
//版本:v1.0
//
//串列埠傳送快取區
__align(8) u8 usart2_tx_buf[usart2_max_send_len]; //傳送緩衝,最大usart2_max_send_len位元組
#ifdef usart2_rx_en //如果使能了接收
//串列埠接收快取區
u8 usart2_rx_buf[usart2_max_recv_len]; //接收緩衝,最大usart2_max_recv_len個位元組.
//通過判斷接收連續2個字元之間的時間差不大於10ms來決定是不是一次連續的資料.
//如果2個字元接收間隔超過10ms,則認為不是1次連續資料.也就是超過10ms沒有接收到
//任何資料,則表示此次接收完畢.
//接收到的資料狀態
//[15]:0,沒有接收到資料;1,接收到了一批資料.
//[14:0]:接收到的資料長度
u16 usart2_rx_sta=0;
void usart2_irqhandler(void)
else
}
}
//初始化io 串列埠2
//pclk1:pclk1時鐘頻率(mhz)
//bound:波特率
void usart2_init(u32 pclk1,u32 bound)
//串列埠2,printf 函式
//確保一次傳送資料不超過usart2_max_send_len位元組
void u2_printf(char* fmt,...)
//定時器4中斷服務程式
void tim4_irqhandler(void)
}//設定tim4的開關
//sta:0,關閉;1,開啟;
void tim4_set(u8 sta)
else tim4->cr1&=~(1<<0);//關閉定時器4
}//通用定時器中斷初始化
//這裡始終選擇為apb1的2倍,而apb1為36m
//arr:自動重灌值。
//psc:時鐘預分頻數
void tim4_init(u16 arr,u16 psc)
#endif
///usart2 dma傳送配置部分//
//dma1的各通道配置
//這裡的傳輸形式是固定的,這點要根據不同的情況來修改
//從儲存器->外設模式/8位資料寬度/儲存器增量模式
//dma_chx:dma通道chx
//cpar:外設位址
//cmar:儲存器位址
void uart_dma_config(dma_channel_typedef*dma_chx,u32 cpar,u32 cmar)
//開啟一次dma傳輸
void uart_dma_enable(dma_channel_typedef*dma_chx,u8 len)
/
stm32串列埠通訊
通訊方式 1 同步通訊 帶時鐘同步訊號傳輸 spi,iic等 2 非同步通訊 不帶時鐘用途訊號 usrt,單匯流排 stm32串列埠引腳表 串口號 rxd txd 1 pa10 pa9 2 pa3pa2 3 pb11 pb10 4 pc11 pc10 5 pd2pc12 通訊過程 接收過程 由rx入...
STM32串列埠通訊
1.常用的串列埠相關暫存器 1 usart sr狀態暫存器,對應的庫函式 flagstatus usart getflagstatus usart typedef usartx,uint16 t usart flag 2 usart dr資料暫存器,對應的庫函式 void usart senddat...
STM32串列埠通訊
串列埠作為mcu最重要的外部介面,同時也是軟體開發重要的除錯手段,其重要性不言而喻。在這裡我們主要從庫函式的角度來講述如何設定串列埠,來達到最基本的通訊功能。串列埠的設定一般可以歸結為以下幾個步驟 1 串列埠時鐘使能,gpio時鐘使能。2 設定引腳復用器對映,呼叫gpio pinafconfig函式...