使用CubeMX配置串口1配置引腳 我的板子上使用插針引出了串口1,串口1連接PA8與PA9。

 配置串口通信參數(shù) 使能串口1,并配置為同步模式,波特率為115200,模式8N1。
 使能串口中斷 查看生成的代碼 引腳與中斷的初始化在stm32f4xx_hal_msp.c

而通信用到的參數(shù),如波特率校驗(yàn)方式等初始化在main.c。

同樣是串口初始化的代碼,為什么要分開(kāi)寫?
可能是分層思想,換板子的話,只用修改引腳與中斷的函數(shù),用戶函數(shù)不用修改。比如用戶關(guān)心波特率,不用關(guān)心引腳。 按鍵控制串口發(fā)送代碼編寫 通過(guò)串口打印按鍵的信息。 //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 */ }}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
HAL_UART_Transmit是HAL庫(kù)提供的串口發(fā)送函數(shù)。在HAL庫(kù)的手冊(cè)中,或者在代碼中跳轉(zhuǎn)到函數(shù)可以找到函數(shù)的說(shuō)明信息。

根據(jù)說(shuō)明,這個(gè)發(fā)送函數(shù)是阻塞式的。參數(shù)Timeout是超時(shí)時(shí)間,代表某次執(zhí)行函數(shù),最多占用串口的時(shí)間,單位是毫秒。簡(jiǎn)單來(lái)說(shuō),在本次數(shù)據(jù)發(fā)送完之前,不能發(fā)送別的數(shù)據(jù)。所以,調(diào)用函數(shù)的時(shí)候要指明參數(shù),本次發(fā)送占用多長(zhǎng)時(shí)間,在此期間,由于串口資源被獨(dú)占,不能成功調(diào)用發(fā)送函數(shù)。如果在規(guī)定的時(shí)間內(nèi),數(shù)據(jù)發(fā)送完畢,那就釋放占用的串口資源;如果到了時(shí)間,即便數(shù)據(jù)還沒(méi)有發(fā)送完畢,(比如數(shù)據(jù)量很大),仍需要?dú)w還串口資源的控制權(quán),讓別人來(lái)用。
在正確連接硬件,并配置串口助手以后,可以看到按鍵信息如下,說(shuō)明串口數(shù)據(jù)發(fā)送成功。

需要說(shuō)明的是,HAL庫(kù)提供的發(fā)送函數(shù)不止一個(gè),還有中斷方式和DMA方式,這是這個(gè)函數(shù)用法最簡(jiǎn)單。 重映射Printf功能 在剛剛的例子中,需要把字符裝填到數(shù)組中,再通過(guò)數(shù)組來(lái)發(fā)送數(shù)據(jù),比較麻煩,能否直接打印字符串?可以通過(guò)重映射C語(yǔ)言中的printf函數(shù)來(lái)實(shí)現(xiàn)。
建立一個(gè)UART.c文件,添加到工程中。輸入以下代碼: #include "stdio.h"#include "main.h"#ifdef __GNUC_#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif//重映射printf的功能PUTCHAR_PROTOTYPE{ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch;}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
注意在適當(dāng)?shù)牡胤揭衕uart1的外部聲明。我寫在了main.h中
extern UART_HandleTypeDef huart1;
然后在主函數(shù)中可以調(diào)用printf。 //main() while(1) if(key) { LED1 = !LED1; printf("return value is %d! \r\n",key); HAL_UART_Transmit(&huart1,UART_BUF,12,0xffff); //發(fā)送接收到的數(shù)據(jù) } 引腳復(fù)用與功能重映射 如果在STM32CubeMX中將PB6設(shè)置為串口功能,可以發(fā)現(xiàn)PA9變?yōu)榱似胀ㄒ_。

這說(shuō)明PA9和PB6都可以作為串口1的TX引腳,但不能同時(shí)用。引腳有點(diǎn)像外設(shè)的出口,外設(shè)可以從前門出,也可以從后門出,但不能同時(shí)從前門和后門出去。
引腳的功能不止一個(gè),我們可以稱之為引腳的復(fù)用;比如既可以作為普通的IO,用于操作LED或按鍵,又可以用作串口。
某個(gè)外設(shè)不但可以連接到引腳x,也可以用到引腳y,我們稱之為重映射。STM32單片機(jī)的功能比較強(qiáng)大,有很多外設(shè)。外設(shè)默認(rèn)對(duì)應(yīng)某個(gè)引腳,可以通過(guò)重映射的方法把一個(gè)外設(shè)映射到其它的引腳上,來(lái)充分利用片內(nèi)資源。
詳細(xì)的引腳重映射情況可以查看數(shù)據(jù)手冊(cè)表格9。 引用鏈接:https://blog.csdn.net/geek_monke ... 1001.2014.3001.5501
|