uCOS-III跑起來了,但是溫濕度計(jì)和OLED還沒到,打算用這段空窗期把串口調(diào)出來,順便熟悉一下這塊板卡的外設(shè)。在調(diào)試串口這一點(diǎn)上不得不吐槽一下PIC的開發(fā)板了,以前接觸的大多數(shù)原廠出品的CortexM開發(fā)板(FRDM系列、SAM4N、LPC系列)基本都是將debug接口和調(diào)試串口合成到了一個(gè)USB口,有的甚至集成了drag&drop功能,用戶就用一根USB線就可以完成所有的調(diào)試。但是PIC32MX470這塊板子的USB debug口只有debug功能,想用調(diào)試串口只能再接一根USB轉(zhuǎn)TTL的線,不方便。
先在板子自帶的Information sheet上找到串口的管腳,有UART1和UART2,但是無(wú)奈我是個(gè)硬件老白,連根帶針的杜邦線都沒有,只有兩頭都是孔的,只能用X32接口上的USART2了。
1. 首先還是先打開MHC(MPLAB Harmony Configurator),找到串口對(duì)應(yīng)的driver選項(xiàng)打開并做相應(yīng)的配置,我的配置如下
但是配置之后串口沒有任何輸出,在論壇里搜了相關(guān)的文章后才發(fā)現(xiàn)我這個(gè)硬件老白居然連Pin Settings都沒有配就想用串口,后來參考了wudianjun2001大俠文章中串口的配置方法
mod=viewthread&tid=57147&highlight=pic32%2Buart
2. 按Information Sheet中的pin對(duì)應(yīng)關(guān)系修改了Pin Configurations如下
然后生成代碼,驚喜地發(fā)現(xiàn)使能了RTOS后,生成的USART驅(qū)動(dòng)代碼中有了mutex的操作。生成的代碼主要包含以下幾個(gè)源文件,我為了自己的調(diào)試打印又加了bsp_ser.c這個(gè)文件用來輸出字符串
學(xué)習(xí)代碼后可知在SYS_Initialize中已經(jīng)根據(jù)用戶的配置調(diào)用了USART相關(guān)的初始化函數(shù)
所以使用時(shí)只需要直接調(diào)用drv_usart_mapping.c中的其他API就可以了,我添加的bsp_ser.c和bsp_ser.h中的代碼如下
#include “system/common/sys_common.h”
#include “system_config.h”
#include “system_definitions.h”
#include “bsp_ser.h”
static DRV_HANDLE BSP_SerHandle;
void BSP_Ser_Tx_Callback (const SYS_MODULE_INDEX index);
void BSP_Ser_Init (CPU_INT32U baud_rate)
{
OS_ERR err;
OSSemCreate(&BSP_SerTxWait, “Serial Tx Wait”, 0, &err);
BSP_SerHandle = DRV_USART_Open(DRV_USART_INDEX_0, 0);
DRV_USART_ByteTransmitCallbackSet(BSP_SerHandle, BSP_Ser_Tx_Callback);
DRV_USART_BaudSet(BSP_SerHandle, baud_rate);
}
void BSP_Ser_Tx_Callback (const SYS_MODULE_INDEX index)
{
OS_ERR err;
OSSemPost(&BSP_SerTxWait, OS_OPT_POST_1, &err); /* Post to the semaphore */
}
int BSP_Ser_WrByte (int ch)
{
OS_ERR err;
DRV_USART_WriteByte(BSP_SerHandle, (CPU_INT08U)ch);
OSSemPend(&BSP_SerTxWait, 0, OS_OPT_PEND_BLOCKING, 0, &err);
return ch;
}
void BSP_Ser_WrStr (CPU_CHAR *p_str)
{
OS_ERR err;
if (p_str == (CPU_CHAR *)0) {
return;
}
while ((*p_str) != (CPU_CHAR )0) {
if (*p_str == ASCII_CHAR_LINE_FEED) {
BSP_Ser_WrByte(ASCII_CHAR_CARRIAGE_RETURN);
BSP_Ser_WrByte(ASCII_CHAR_LINE_FEED);
p_str++;
} else {
BSP_Ser_WrByte(*p_str++);
}
}
}
3. 在_SYS_Tasks任務(wù)中添加需要串口打印字符的代碼
后來又看了些文章,并做了實(shí)驗(yàn)才發(fā)現(xiàn),其實(shí)只需要在MHC中配置好串口生產(chǎn)代碼后就可以使用printf了,根本不需要用戶自己添加其他的驅(qū)動(dòng)代碼
串口和板子按如下方式連接,串口打印正常輸出
最后扯一點(diǎn)題外話,也是上篇文章最后留的一個(gè)梗。使能uCOS之后我就隱約地感覺到,用MHC配置工程,幾乎所有的代碼只需要在正確配置后點(diǎn)一下Generate Code按鈕就出來了,留給用戶做的就是按自己的需求寫app的代碼了。這種移植的活兒在以前都是要消耗數(shù)人天甚至數(shù)人周的工作,而現(xiàn)在一個(gè)新手也可以簡(jiǎn)單地改改配置就將RTOS移植過來(假如MHC做得更好);這讓我不由地感覺到了底層軟件工程師的職業(yè)生涯危機(jī)。尤其在添加了USART驅(qū)動(dòng)之后,更加覺得驅(qū)動(dòng)的工作就只剩下了在IDE里改配置了,因?yàn)榈侥壳盀橹梗?a href="http://www.ttokpm.com/v/tag/137/" target="_blank">芯片手冊(cè)我只看過memory map。這樣再發(fā)展些時(shí)日是不是就不需要做驅(qū)動(dòng)和BSP的工程師了?難道這就是人工智能對(duì)碼農(nóng)的影響?
-
PIC32MX470
+關(guān)注
關(guān)注
0文章
5瀏覽量
1801
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論