嵌入式軟件這個(gè)行業(yè)涉及甚廣,從我們身邊的電視、冰箱、洗衣機(jī),到我們的手機(jī),再到交通、到醫(yī)療、軍事無(wú)處不在。
在項(xiàng)目的開(kāi)發(fā)過(guò)程中,使用調(diào)試工具是必不可少的。
串口簡(jiǎn)單靈活的特性常被工程師用作代碼的調(diào)試工具,它的另一個(gè)名字叫uart。
說(shuō)到uart,相信很多工程師都熟透了,掌握一個(gè)uart,可以說(shuō)是已經(jīng)邁進(jìn)了嵌入式軟件的殿堂,所以u(píng)art也常被用作嵌入式入門的必備功課。
那既然都熟了,那為什么還拿出來(lái)說(shuō)呢,帶著這樣的一個(gè)問(wèn)題,跟著我一起深入的了解我們的這個(gè)項(xiàng)目,一起探討uart背后那些不為人知的故事。
目的意義在我們的開(kāi)發(fā)測(cè)試中,uart通常扮演者信息輸出,人機(jī)交互和下載程序的功能,有些場(chǎng)景下可能有線的串口不是很方便或者不能實(shí)現(xiàn)信息的輸出,比如調(diào)平衡車,有線串口對(duì)這種遠(yuǎn)距離的調(diào)試顯得有些力不足。有些場(chǎng)景或者我們根本不可以把數(shù)據(jù)直接讀出來(lái),比如車廠,整車的CAN數(shù)據(jù)是汽車的血液,一些ECU的出廠前身體狀況,全靠采集can數(shù)據(jù)來(lái)診斷,即使整車有can數(shù)據(jù)的存儲(chǔ)功能,一些測(cè)試調(diào)試不一定能很方便的拿到,所以這個(gè)無(wú)線的數(shù)據(jù)采集儀就能派上用場(chǎng),這就是我本次項(xiàng)目的主要意義。
本期內(nèi)容可以了解到以下幾個(gè)方面:
1、模塊化代碼的設(shè)計(jì)思路,開(kāi)發(fā)思想和獨(dú)立模塊開(kāi)發(fā)模型;
2、uart等串行板級(jí)通信的設(shè)計(jì)原理及其注意事項(xiàng);
3、項(xiàng)目中常用的測(cè)試方法和測(cè)試手段;
4、通信協(xié)議的制定和協(xié)議棧的開(kāi)發(fā);
項(xiàng)目簡(jiǎn)介:項(xiàng)目采用雙mcu-STM32F030C8T6和RF24L01無(wú)線模塊實(shí)現(xiàn)主從設(shè)備的上下行數(shù)據(jù)傳輸,在此基礎(chǔ)上增加與pc的通信和數(shù)據(jù)記錄功能,實(shí)現(xiàn)離線數(shù)據(jù)同步功能;
基礎(chǔ)功能:
實(shí)現(xiàn)雙mcu數(shù)據(jù)的上下行無(wú)線傳輸,波特率為115200;
實(shí)現(xiàn)主設(shè)備與pc機(jī)的通信,并實(shí)現(xiàn)uart調(diào)試功能;
擴(kuò)展功能:1、can數(shù)據(jù)、spi 、iic的數(shù)據(jù)的采集傳輸;2、離線存儲(chǔ)功能;
開(kāi)發(fā)準(zhǔn)備及其環(huán)境硬件環(huán)境:具備RF24L01模塊接口的STM32開(kāi)發(fā)板2塊、RF20L01無(wú)線模塊2塊;開(kāi)發(fā)工具:STM32J-link仿真器、串口TTL轉(zhuǎn)換小板各1;軟件環(huán)境 :KIEL-MDK 、串口助手 ;
開(kāi)發(fā)計(jì)劃節(jié)點(diǎn)1:完成技術(shù)指標(biāo)的確定,開(kāi)發(fā)板、硬件模塊及其調(diào)試器采購(gòu)到位,完成軟硬件的架構(gòu)設(shè)計(jì);
節(jié)點(diǎn)2:調(diào)試接口與pc的交互程序的開(kāi)發(fā);
初建工程,完成uart1調(diào)試接口程序的開(kāi)發(fā);
完成uart2與pc機(jī)的交互程序的設(shè)計(jì);
節(jié)點(diǎn)3:定制NRF24L01的傳輸協(xié)議,并完成開(kāi)發(fā)
驅(qū)動(dòng)的開(kāi)發(fā)與BSP的開(kāi)發(fā);
協(xié)議的開(kāi)發(fā);
節(jié)點(diǎn)4:整體調(diào)試、測(cè)試;
節(jié)點(diǎn)5:編寫(xiě)項(xiàng)目總結(jié)。
項(xiàng)目設(shè)計(jì)
Part 01
項(xiàng)目概述及其環(huán)境的搭建
項(xiàng)目簡(jiǎn)介:
項(xiàng)目采用雙mcu-STM32F030C8T6和RF24L01無(wú)線模塊實(shí)現(xiàn)主從設(shè)備的上下行數(shù)據(jù)傳輸,在此基礎(chǔ)上增加與pc的通信和數(shù)據(jù)記錄功能,實(shí)現(xiàn)離線數(shù)據(jù)同步功能;功能指標(biāo)
基礎(chǔ)功能:
1、為了盡快上手軟件,硬件系統(tǒng)采用現(xiàn)成模塊, RF24L01模塊接口的STM32開(kāi)發(fā)板2塊和RF20L01無(wú)線模塊2塊,STM32系統(tǒng)板2塊分為主板和從板,從板信息通過(guò)24l01無(wú)線模塊發(fā)送到主板,主板通過(guò)uart與pc交互;硬件部分后續(xù)獨(dú)立部分說(shuō)明分享。
2、軟件方面是重點(diǎn)研究對(duì)象,軟件主要分為driver、hal、bsp、service、app五個(gè)部分。Driver層是和硬件直接相關(guān),hal層是隔離層,bsp是驅(qū)動(dòng)相關(guān)芯片的板級(jí)支持層、服務(wù)層主要是一些任務(wù)相關(guān),App為應(yīng)用層。
擴(kuò)展功能:1、can數(shù)據(jù)、spi 、iic的數(shù)據(jù)的采集傳輸;2、離線存儲(chǔ)功能;
開(kāi)發(fā)準(zhǔn)備及其環(huán)境:1、硬件環(huán)境 :具備RF24L01模塊接口的STM32開(kāi)發(fā)板2塊、RF20L01無(wú)線模塊2塊;2、開(kāi)發(fā)工具 :STM32J-link仿真器、串口TTL轉(zhuǎn)換小板各1;3、軟件環(huán)境 KIEL-MDK 、串口助手 ;
Part 02
軟件設(shè)計(jì)-外設(shè)uart
導(dǎo)言u(píng)art外設(shè)是開(kāi)發(fā)調(diào)試的重要手段,也是板級(jí)通信常用的通信方式。
對(duì)于耳熟能詳?shù)膗art,你了解多少呢?
它的用法的注意事項(xiàng)和難點(diǎn)又有哪些呢?
本期內(nèi)容讓我?guī)е蠹抑攸c(diǎn)探討一下uart的軟件設(shè)計(jì)。
內(nèi)容提要1、uart的基本概述和STM32中uart驅(qū)動(dòng)HAL層的配置;2、調(diào)試打印中,uart的數(shù)據(jù)發(fā)送策略;3、通信中,uart的策略與架構(gòu)。
軟件實(shí)戰(zhàn)1、外設(shè)與系統(tǒng)
與傳統(tǒng)寫(xiě)驅(qū)動(dòng)程序相比,STM32CubeMX代碼生成器讓驅(qū)動(dòng)變得更簡(jiǎn)單、快速,大大提高了開(kāi)發(fā)效率。
STM32CubeMX不僅支持外設(shè)配置,還支持freeRTOS,不過(guò)很可惜,考慮到片子的成本,8KRAM的片子僅能跑2個(gè)靜態(tài)的線程,而且從板有集成到項(xiàng)目中的需求,所以從設(shè)備不使用freeRTOS。
從設(shè)備主頻48MHZ,uart外設(shè)需要對(duì)GPIO/NVIC/DMA/UART進(jìn)行配置,主設(shè)備還需要配置freeRTOS。
2、調(diào)試神器-uart不管哪個(gè)項(xiàng)目,printf的輸出是必不可少的!
實(shí)現(xiàn)的關(guān)鍵點(diǎn)是數(shù)據(jù)通過(guò)printf函數(shù)收集到debug_pool后如何發(fā)送。
下面內(nèi)容圍繞這個(gè)問(wèn)題展開(kāi)討論。
無(wú)os的情況下,若是需要實(shí)時(shí)性要求較高的情況下,發(fā)送需要直接調(diào)用uart驅(qū)動(dòng)發(fā)送接口拋出,這種方式,效率低,cpu占用高。
一般情況下是要開(kāi)一片空間,當(dāng)數(shù)據(jù)收集滿后通過(guò)DMA送到uart硬件然后發(fā)出去。不過(guò)這種方式是需要一個(gè)Task,周期的拋數(shù)據(jù)。
有os的系統(tǒng),這里需要加消息隊(duì)列或者內(nèi)存池,還需要一個(gè)獨(dú)立的線程進(jìn)行處理。
比較復(fù)雜,這里不展開(kāi)討論。
對(duì)上圖思想進(jìn)行解釋:1、接收部分首先考慮如何接收數(shù)據(jù),是采用run_buf的形式還是一個(gè)字節(jié)中斷的方式;
2、數(shù)據(jù)接收后,要思考幀識(shí)別,確定一幀數(shù)據(jù)后進(jìn)入CRC校驗(yàn);
3、校驗(yàn)通過(guò)后再進(jìn)行協(xié)議的解析和處理;
5、數(shù)據(jù)發(fā)送部分先對(duì)數(shù)據(jù)進(jìn)行打包。記住多線程的處理要對(duì)數(shù)據(jù)進(jìn)行保護(hù),防止tx_buf里的數(shù)據(jù)被刷寫(xiě);
6、通過(guò)打包后的數(shù)據(jù)要CRC加碼校驗(yàn),然后再發(fā)出去;
值得注意的是:要將這些公共的CRC和收發(fā)任務(wù)單獨(dú)提出來(lái),與協(xié)議相關(guān)的內(nèi)容獨(dú)立出來(lái),這樣協(xié)議層的變得不會(huì)引起程序大的改動(dòng);
Part 03
軟件設(shè)計(jì)-外設(shè)uart
引言:相信很多工程師們都曉得:調(diào)試串口不僅扮演打印信息的角色,還得有配置設(shè)備、設(shè)備參數(shù)輸入等功能。如果開(kāi)發(fā)window上位機(jī)界軟件是成本上和時(shí)間上都不劃算;要是在Linux這種跨平臺(tái)下還得開(kāi)發(fā)一套軟件。所以做一個(gè)類似Linux命令這樣的串口軟件就顯得很有必要!
直接用像SecureCRT這類軟件連接串口即可調(diào)試,與設(shè)備進(jìn)行交互,把這個(gè)軟件命名為mshel。
另外,直接與pc進(jìn)行這樣的數(shù)據(jù)流存在亂碼和丟數(shù)據(jù)的現(xiàn)象,這里使用了為二者制定的私有協(xié)議。
本期內(nèi)容:1、mshell的原理與結(jié)構(gòu);2、pc交互的通信協(xié)議;
軟件實(shí)戰(zhàn):mshell的設(shè)計(jì)原理和思路:mshell是設(shè)備開(kāi)發(fā)人員與設(shè)備進(jìn)行配置管理的交互接口,主要功能如下:1)設(shè)備log打印顯示功能;
2)可對(duì)設(shè)備進(jìn)行配置和控制;
3)具有Linux的終端控制臺(tái)類似的功能,可以顯示功能菜單和參數(shù)輸入等功能,給出功能菜單示例;
SecureCRT軟件的串口數(shù)據(jù)交互特點(diǎn):
1)對(duì)與窗口輸入的字母和數(shù)字,是以ASCII的形式通過(guò)串口下發(fā)到設(shè)備;
2)窗口輸入一個(gè)字符,串口會(huì)下發(fā)一個(gè)字符,回車、退格和空格都是一個(gè)字節(jié),左右上下鍵是2字節(jié);
3)軟件接收到字符后回顯到窗口,回車0x0D回顯沒(méi)有反應(yīng), 行跳轉(zhuǎn);
4)給出用到的一些雙字節(jié)按鍵:
KEY_UP = 0x5B410000,
KEY_DOWN = 0x5B420000,
KEY_LEFT = 0x5B440000,
KEY_RIGHT = 0x5B430000,
根據(jù)以上特點(diǎn)可知,實(shí)現(xiàn)mshell進(jìn)行需要回顯功能,就是收到啥發(fā)啥,提示程序員設(shè)備收到所下發(fā)的字符。
需要對(duì)收到的字符進(jìn)行存儲(chǔ)和解析,需要設(shè)計(jì)命令解析器。
命令解析器處理完指令及其數(shù)據(jù)后,交給執(zhí)行單元。
執(zhí)行單元的設(shè)計(jì)包括一級(jí)指令執(zhí)行,即選擇功能模塊,比如uart相關(guān)指令,之后進(jìn)入到子模塊處理程序。
核心模塊的功能如下:
1)echo回顯模塊是將pc發(fā)來(lái)的字符實(shí)時(shí)的發(fā)回到pc的終端,提示輸入有效;
2)cmd_analysis命令解析器是將收到的字符進(jìn)行處理,要知道輸入?yún)?shù)的個(gè)數(shù),指令以及數(shù)據(jù);
3)cmd_dispatch命令調(diào)度器是對(duì)注冊(cè)的命令塊進(jìn)行回調(diào)處理;
1)物理層主要是硬件線路數(shù)據(jù),軟件驅(qū)動(dòng)的收發(fā);采用標(biāo)準(zhǔn)3線制 Uart 物理接口、波特率待定、 8個(gè)數(shù)據(jù)位,無(wú)校驗(yàn),1個(gè)停止位。
2)數(shù)據(jù)鏈路層是對(duì)接收一包數(shù)據(jù)的完整性已經(jīng)正確的保證,這里使用crc校驗(yàn);
3)傳輸層是實(shí)現(xiàn)數(shù)據(jù)包的順序傳輸,和穩(wěn)定性,具體的協(xié)議幀定義如下:
應(yīng)答幀在應(yīng)用層payload中進(jìn)行,counter計(jì)數(shù)避免幀重復(fù),對(duì)于協(xié)議的實(shí)現(xiàn),僅mcu部分,上位機(jī)部分使用Linux,將數(shù)據(jù)存到文件中即可。
本次更新內(nèi)容如下:
Part 04
無(wú)線通信模塊的協(xié)議
引言: 前面的uart相關(guān)的開(kāi)發(fā)主要的功能是連接采集設(shè)備和上位機(jī)的接口功能,設(shè)備想要實(shí)現(xiàn)無(wú)線數(shù)據(jù)傳輸,離不開(kāi)NRF24L01,這個(gè)模塊的傳輸方式是半雙工模式,也就是同一時(shí)刻僅能單側(cè)傳輸數(shù)據(jù),所以如何準(zhǔn)確的實(shí)現(xiàn)數(shù)據(jù)雙向的收發(fā),本期的通信協(xié)議就非常關(guān)鍵了。
本期內(nèi)容:
1、NRF24L01模塊的重要理解;
2、數(shù)據(jù)收發(fā)原理;
項(xiàng)目實(shí)戰(zhàn):
一、模塊的重要理解
1、關(guān)于頻率:
2.4GWiFi頻段和和nrf24l01有很大一塊重疊,如果出現(xiàn)嚴(yán)重的丟包,很有可能受到了WiFi的的干擾,將nrf2401的頻段設(shè)置為高于2490MHz可以顯著降低丟包率。nrf2401做了3種固定的波特率,分別是 250Kbps/1Mbps/2Mbps,在使用時(shí)指定一個(gè)即可。需要注意的是,當(dāng)nrf2401正處于接收數(shù)據(jù)或發(fā)送數(shù)據(jù)的工作狀態(tài)時(shí),不要修改波特率,否則會(huì)數(shù)據(jù)包會(huì)出錯(cuò)。
2、關(guān)于功耗:
掉電模式,nrf2401消耗的電流為900nA,比全火力狀態(tài)低了4個(gè)數(shù)量級(jí),所以為了省電,大多數(shù)情況下是可以讓模塊處于此模式,當(dāng)有數(shù)據(jù)收發(fā)的時(shí)候再開(kāi)機(jī)。就這樣讓模塊關(guān)機(jī)也有個(gè)缺點(diǎn),就是當(dāng)對(duì)數(shù)據(jù)實(shí)時(shí)性要求很高的情況下,nrf24l01啟動(dòng)時(shí)要一次開(kāi)啟各個(gè)關(guān)閉的模塊,相對(duì)來(lái)說(shuō)有點(diǎn)耗時(shí),容易丟數(shù)或者延遲發(fā)送。
熱待機(jī)模式(Standby),相對(duì)掉電模式相比,熱待機(jī)模式下僅僅是將射頻相關(guān)電路停掉來(lái)達(dá)到省電的目的,這樣的話,這個(gè)模塊即達(dá)到節(jié)點(diǎn)的目的又加快的啟動(dòng)時(shí)間,但它的功耗交完全掉電相比還是要高,大約在30-300uA這個(gè)范圍,但是也算很省電了。
射頻功耗控制,全火力模式下(也就是模塊處于正常收發(fā)數(shù)據(jù)的狀態(tài)下),模塊也有對(duì)射頻功耗控制的手段,達(dá)到省電的目的。nrf2401模塊的射頻功耗被劃分為4個(gè)檔次,分別為0/1/2/3,分別對(duì)應(yīng)的-18/-12/-6/0dBm。其他方面同等條件下,功率越小傳輸距離越小,可以根據(jù)實(shí)際情況自行選擇使用什么功率配置。值得注意的是,射頻功率控制只能控制對(duì)外發(fā)送數(shù)據(jù),接收數(shù)據(jù)的功率是沒(méi)辦法控制的。
nfr24l01的通信類型屬于半雙工,就是說(shuō)再同一時(shí)刻,一個(gè)模塊僅能收數(shù)或者發(fā)數(shù),無(wú)法做到同時(shí)收發(fā)。為了保證數(shù)據(jù)的準(zhǔn)確穩(wěn)定的傳輸,雙方做了一個(gè)約定,即通信流程。
二、數(shù)據(jù)收發(fā)原理
1、設(shè)備地址:
與mac地址一樣,每一個(gè)nrf2401設(shè)備有一個(gè)唯一的地址(可理解為設(shè)備ID)來(lái)充當(dāng)設(shè)備的身份證,地址長(zhǎng)度可以設(shè)3/4/5的任選一。設(shè)備發(fā)送時(shí),先發(fā)對(duì)端的設(shè)備地址,然后再發(fā)數(shù)據(jù)。若配置了硬件ack應(yīng)答,則每次收到數(shù)據(jù)后,會(huì)像對(duì)端回復(fù)ack應(yīng)答。
Nrf2401有6個(gè)地址通道,也就是說(shuō)模塊有6個(gè)數(shù)據(jù)通道,同時(shí)可和6個(gè)設(shè)備進(jìn)行交互也可以是6個(gè)通道的多路數(shù)據(jù)轉(zhuǎn)發(fā)等設(shè)計(jì)。6個(gè)通道的地址寬度配置是要保持一致,不支持6個(gè)同通道下的不同地址寬度的配置。
* channel0和channel1地址寬帶可隨意配置,最大寬度為5,低字節(jié)兼容3/4寬度的地址;
* channel2-channel5,最低字節(jié)可隨意配置其他字節(jié)與channel共享;
* 向同一設(shè)備發(fā)送數(shù)據(jù),即使信道(地址)不同,也會(huì)存在干擾可能接收數(shù)據(jù)失??;
2、數(shù)據(jù)校驗(yàn):
nrf2401支持CRC8/CRC16,通過(guò)配置寄存器的方式,二選一。發(fā)送設(shè)備將要發(fā)送的數(shù)據(jù)(包括地址)進(jìn)行CRC計(jì)算后,添加到發(fā)送包中發(fā)出去。接收設(shè)備收到數(shù)據(jù)將數(shù)據(jù)計(jì)數(shù)后,和數(shù)據(jù)中的CRC值進(jìn)行校驗(yàn),如果不匹配就丟棄;
3、長(zhǎng)幀數(shù)據(jù):
模塊發(fā)送最大長(zhǎng)度為32字節(jié),要想發(fā)送長(zhǎng)幀,就需要分包發(fā)送,發(fā)送的數(shù)據(jù)除了周期的數(shù)據(jù)還有事件數(shù)據(jù)。周期數(shù)據(jù)一般采用單包數(shù)據(jù),比如心跳信號(hào)。長(zhǎng)幀數(shù)據(jù)的用來(lái)做事件發(fā)送,而且需要一包數(shù)據(jù)發(fā)送的單幀計(jì)數(shù)器來(lái)防止數(shù)據(jù)發(fā)亂發(fā)錯(cuò)。設(shè)備本身替我們做了CRC校驗(yàn)和地址自動(dòng)匹配,如果需要一對(duì)多的收發(fā),可以在設(shè)備的數(shù)據(jù)域再加一個(gè)地址,把硬件地址當(dāng)作信道使用。
說(shuō)明:
*短幀的數(shù)據(jù)可以直接使用,最大長(zhǎng)度32byte,可以周期,也可以事件;
*長(zhǎng)幀數(shù)據(jù)不建議周期發(fā)送,一般用作事件發(fā)送類型使用;
幀格式解析:
*長(zhǎng)幀數(shù)據(jù)為了提高數(shù)據(jù)的安全性,需要對(duì)長(zhǎng)幀數(shù)據(jù)再次進(jìn)行CRC校驗(yàn);
*count計(jì)數(shù)器是避免數(shù)據(jù)包不丟失;
*flag標(biāo)識(shí)
bit 0 ,0=非ACK幀, 1=ACK幀, 若是接收幀,則是表示ACK數(shù)據(jù)或者正常數(shù)據(jù);
bit 1, 0=非ACK幀, 1=ACK幀, 若是發(fā)送幀,這位表示告訴接收方是否需要回復(fù)ACK應(yīng)答,
bit 2, 0=短幀, 1=長(zhǎng)幀, 標(biāo)識(shí)是否為長(zhǎng)幀或者單幀;
bit3-bit4,0=第一幀,1=流控幀,2=結(jié)束幀;
4、單幀的數(shù)據(jù)
單幀比較簡(jiǎn)單,沒(méi)有再次CRC校驗(yàn)和count計(jì)數(shù),幀格式如下:
*flag標(biāo)識(shí)
bit 0 ,0=非ACK幀, 1=ACK幀, 若是接收幀,則是表示ACK數(shù)據(jù)或者正常數(shù)據(jù);
bit 1, 0=非ACK幀, 1=ACK幀, 若是發(fā)送幀,這位表示告訴接收方是否需要回復(fù)ACK應(yīng)答,
bit 2, 0=短幀, 1=長(zhǎng)幀, 標(biāo)識(shí)是否為長(zhǎng)幀或者單幀;
責(zé)任編輯:lq
-
模塊
+關(guān)注
關(guān)注
7文章
2728瀏覽量
47615 -
無(wú)線通信
+關(guān)注
關(guān)注
58文章
4589瀏覽量
143695 -
串口
+關(guān)注
關(guān)注
14文章
1557瀏覽量
76742
原文標(biāo)題:來(lái)實(shí)戰(zhàn)之《嵌入式UART項(xiàng)目開(kāi)發(fā)》步驟四:無(wú)線通信模塊的協(xié)議
文章出處:【微信號(hào):cirmall,微信公眾號(hào):電路設(shè)計(jì)技能】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論