STM32F407 串列埠資料傳送

2021-10-01 21:12:07 字數 2704 閱讀 2406

1.常用的串列埠相關暫存器

2.串列埠操作相關庫函式(省略入口引數)

void usart_init(); //串列埠初始化:波特率,資料字長,奇偶校驗,硬體流控以及收發使能

void usart_cmd();//使能串列埠

void usart_itconfig();//使能相關中斷

void usart_senddata();//傳送資料到串列埠,

dr uint16_t usart_receivedata();//接受資料,從dr讀取接受到的資料

flagstatus usart_getflagstatus();//獲取狀態標誌位

void usart_clearflag();//清除狀態標誌位

itstatus usart_getitstatus();//獲取中斷狀態標誌位

void usart_clearitpendingbit();//清除中斷狀態標誌位

3.狀態暫存器

第10-31位保留,硬體強制為0

第5位:rxne(讀資料暫存器非空),當該位被置 1 的時候,就是提示已經有資料被接收到了,並且可以讀出來了。這時候我們要做的就是盡快去讀取 usart_dr,通過讀 usart_dr 可以將該位清零,也可以向該位寫 0,直接清除。

第6位:tc(傳送完成),當該位被置位的時候,表示 usart_dr 內的資料已經被傳送完成了。如果設定了這個位的中斷,則會產生中斷。該位也有兩種清零方式:1)讀 usart_sr,寫usart_dr。2)直接向該位寫 0。

讀取串列埠狀態的函式是:flagstatus usart_getflagstatus(usart_typedef* usartx, uint16_t usart_flag);

例如:判斷讀暫存器是否非空(rxne),操作庫函式的方法是:usart_getflagstatus(usart1, usart_flag_rxne);

4.資料暫存器

5.串列埠配置的一般步驟

①串列埠時鐘使能:rcc_apbxperiphclockcmd();      

gpio時鐘使能:rcc_ahb1periphclockcmd();

② 引腳復用對映:      gpio_pinafconfig();

③gpio埠模式設定:gpio_init(); 模式設定為gpio_mode_af

④串列埠引數初始化:usart_init();

⑤開啟中斷並且初始化nvic(如果需要開啟中斷才需要這個步驟)       nvic_init();       usart_itconfig();

⑥使能串列埠:usart_cmd(); ⑦編寫中斷處理函式:usartx_irqhandler();

⑧串列埠資料收發:

void usart_senddata();//傳送資料到串列埠,dr uint16_t usart_receivedata();//接受資料,從dr讀取接受到的資料

⑨串列埠傳輸狀態獲取: flagstatus usart_getflagstatus(); void usart_clearitpendingbit();

二、例項編寫

1.巨集觀變數定義

#define usart_rec_len   200      //定義最大接收位元組數 200  

u8  usart_rx_buf[usart_rec_len];               //接收緩衝,最大usart_rec_len個位元組.末位元組為換行符  

u16 usart_rx_sta;                 //接收狀態標記    

在這裡定義了16位的usart_rx_sta,其中0-13位用於接收資料,第14位用於進行判斷0x0d標誌,若接收到了置1,反之置0,第15位用於判斷接收完成標誌,即第14位確定收到0x0d標誌後,再進行判斷,若收到了0x0a標誌,則將該位置為1

2.main函式編寫

int main(void){  

u8 t;

u8 len;

u16 times=0;

nvic_prioritygroupconfig(nvic_prioritygroup_2);//將中斷優先順序分組2,2位響應,2位搶斷

delay_init(168); //延時初始化

uart_init(115200); //波特率兩邊要一致,這裡設定為115200,若不一致則會產生亂碼

led_init(); //初始化led

while(1)

{ //sta為16位,與0x8000與,即判斷接收到的資料第15位是否為1,即是否接收到完成

if(usart_rx_sta&0x8000)

{

len=usart_rx_sta&0x3fff;//接收到的資料長度儲存到len中

printf("\r\n您傳送的訊息為:\r\n");

亂碼示例:

STM32F407 串列埠顯示跑馬燈狀態

main.c include sys.h include delay.h include usart.h include led.h include beep.h include key.h include exti.h extern u8 onoff,dir,speed,change,flag e...

基於stm32f407建立stm32F427工程

分為三個部分 1.啟動檔案 2.fwilib 包含兩個資料夾inc和src。src裡面是stm32資源的c檔案,inc則是32資源的h檔案 3.user這也是我不太理解的部分 ddbugconfig只包含了用於debug的初始化,則是f4的系統檔案。我是在f407的基礎上改的 總的來說 1.改了晶元...

STM32F407上除錯freeRTOS問題

是在正點原子的阿波羅stm32f429開發板上的例子改來的,他們的編譯沒有問題,我編譯時出現如下問題 定位到出錯的地方,是 再追 configmax syscall interrupt priority 的定義是 define configmax syscall interrupt priority...