我的板子上使用插針引出了串口1,串口1連接PA8與PA9。
使能串口1,并配置為同步模式,波特率為115200,模式8N1。
引腳與中斷的初始化在stm32f4xx_hal_msp.c
而通信用到的參數(shù),如波特率校驗方式等初始化在main.c。
同樣是串口初始化的代碼,為什么要分開寫?
可能是分層思想,換板子的話,只用修改引腳與中斷的函數(shù),用戶函數(shù)不用修改。比如用戶關心波特率,不用關心引腳。
通過串口打印按鍵的信息。
//main.cint main(void){ /* USER CODE BEGIN 2 */ u8 UART_BUF[12 = "you press A!"; u8 key; /* USER CODE END 2 */ while (1) { key = KEY_Scan(0); switch(key) { case KEY_A_PRES: UART_BUF[10 = 'A'; break; case KEY_B_PRES: UART_BUF[10 = 'B'; break; case KEY_C_PRES: UART_BUF[10 = 'C'; break; case KEY_D_PRES: UART_BUF[10 = 'D'; break; default: break; } if(key) { LED1 = !LED1; HAL_UART_Transmit(&huart1,UART_BUF,12,0xffff); } /* USER CODE END WHILE */ }} HAL_UART_Transmit是HAL庫提供的串口發(fā)送函數(shù)。在HAL庫的手冊中,或者在代碼中跳轉到函數(shù)可以找到函數(shù)的說明信息。
根據(jù)說明,這個發(fā)送函數(shù)是阻塞式的。參數(shù)Timeout是超時時間,代表某次執(zhí)行函數(shù),最多占用串口的時間,單位是毫秒。簡單來說,在本次數(shù)據(jù)發(fā)送完之前,不能發(fā)送別的數(shù)據(jù)。所以,調用函數(shù)的時候要指明參數(shù),本次發(fā)送占用多長時間,在此期間,由于串口資源被獨占,不能成功調用發(fā)送函數(shù)。如果在規(guī)定的時間內,數(shù)據(jù)發(fā)送完畢,那就釋放占用的串口資源;如果到了時間,即便數(shù)據(jù)還沒有發(fā)送完畢,(比如數(shù)據(jù)量很大),仍需要歸還串口資源的控制權,讓別人來用。
在正確連接硬件,并配置串口助手以后,可以看到按鍵信息如下,說明串口數(shù)據(jù)發(fā)送成功。
需要說明的是,HAL庫提供的發(fā)送函數(shù)不止一個,還有中斷方式和DMA方式,這是這個函數(shù)用法最簡單。
在剛剛的例子中,需要把字符裝填到數(shù)組中,再通過數(shù)組來發(fā)送數(shù)據(jù),比較麻煩,能否直接打印字符串?可以通過重映射C語言中的printf函數(shù)來實現(xiàn)。
建立一個UART.c文件,添加到工程中。輸入以下代碼:
注意在適當?shù)牡胤揭衕uart1的外部聲明。我寫在了main.h中
extern UART_HandleTypeDef huart1;
然后在主函數(shù)中可以調用printf。
如果在STM32CubeMX中將PB6設置為串口功能,可以發(fā)現(xiàn)PA9變?yōu)榱似胀ㄒ_。
這說明PA9和PB6都可以作為串口1的TX引腳,但不能同時用。引腳有點像外設的出口,外設可以從前門出,也可以從后門出,但不能同時從前門和后門出去。
引腳的功能不止一個,我們可以稱之為引腳的復用;比如既可以作為普通的IO,用于操作LED或按鍵,又可以用作串口。
某個外設不但可以連接到引腳x,也可以用到引腳y,我們稱之為重映射。STM32單片機的功能比較強大,有很多外設。外設默認對應某個引腳,可以通過重映射的方法把一個外設映射到其它的引腳上,來充分利用片內資源。
詳細的引腳重映射情況可以查看數(shù)據(jù)手冊表格9。
引用鏈接:https://blog.csdn.net/geek_monke ... 1001.2014.3001.5501
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |