移植正點的printf

一、用STM32CubeMX生成基本MDK工程

  生成工程時,需要使能三個中斷和2個初始化,中斷優先級要大於5
1、DMA接收中斷
2、DMA發送中斷
3、串口中斷
4、初始化一個二值信號量uart2_busy, 只有等到該信號量時,才能使用串口。使用串口DMA發送,在發送完中斷中,釋放該信號量。定義一個消息隊列,txQueue, 需要發送的atkp_t類型數據包先發送到這個隊列裏。然後由任務從這個隊列裏取出來發送。
5、定義一個synch信號量,fputc(int ch, FILE *f)往一箇中間變量的數據包messageToPrint填數據時同步用。好像不用也可以。
在這裏插入圖片描述

二、爲什麼要設置串口中斷呢?

  因爲DMA發送完成中斷,並沒有直接調用回調函數釋放uart2_busy,而是觸發串口發送完成中斷,串口中斷中再調用回調函數釋放uart2_busy。
在這裏插入圖片描述
  當然,也可以不要串口中斷,修改底層,在DMA發送完成中斷中,直接調用回調函數。回調函數中釋放串口忙標誌,不然只能發送一次。不過速度也沒有加快。
在這裏插入圖片描述
在這裏插入圖片描述

三、加入console.c和radiolink.c文件到工程

A、console.c

1、void consoleInit(),初始化全局變量messageToPrint的ID和創建信號量

2、int consolePutchar(int ch)主要是給fputc(int ch, FILE *f)調用,把發送的內容一個字符一個字符填入一個臨時數據包messageToPrint,它是一個全局變量。
當遇到\n字符時,認爲一幀數據已填完。把messageToPrint發送到隊列txQueue裏。

3、int consolePutcharFromISR(int ch)如果當前運行在中斷函數裏,用這個函數填充臨時數據包messageToPrint

B、radiolink.c

1、radiolinkTask(void const * argument)串口發送任務,從txQueue取出數據包。

2、static void uartSendPacket(atkp_t *p) 把上一步取出的數據包,加上幀頭和校驗,複製到sendBuffer[36]臨時數組裏, 然後調用DMA把sendBuffer[36]發送出去
在這裏插入圖片描述
3、重定義fputc(int ch, FILE *f)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章