1. 程式人生 > >基於KEIL RTX CMSIS-RTOS在STM32微控制器上的一些使用心得

基於KEIL RTX CMSIS-RTOS在STM32微控制器上的一些使用心得

最近要做一款一頭USB接電腦模擬U盤, 一頭通過串列埠與終端裝置互動的裝置, 好久沒有接觸微控制器, 安裝最新的KEIL5.24a, 發現好多功能都不會用了, 在適應了幾天後開始著手進行開發, 在開發中遇到了一些問題和一些心得, 記錄一下.

現在KEIL的中介軟體比較豐富, 但相對於VS來說還是太弱太弱, 寫了兩個插入註釋的小工具外掛才算感覺好一點, 連插入當前時間的模板都沒有, 愁人......言歸正傳, 建立工程, 一開始我選擇了USB Device的大容量儲存器, 檔案系統, SPI, UART等裝置用到的中介軟體, 如果缺少依賴項則會有黃色提示, 點選提示自動定位選中即可, RTX選擇的是4.81, 沒有選擇RTX5, 跟USB中介軟體貌似有衝突, 編譯會出現錯誤....

接下來就是建立程式碼分組之類的東西了, 沒啥好說的, 根據模板建立main檔案, 設定執行緒堆疊空間等....

CMSIS-RTOS+RTX啟動USB模擬U盤真是非常簡單, 但是坑比較多, 資料太少, 下面兩句即可,

USBD_Initialize(0);
// 等待裝置0的連線
USBD_Connect(0);

但是要在RTX_Conf_CM.c中設定兩個自定義執行緒, 總大小為1024, 因為USB有兩個執行緒, 一個核心執行緒需要512位元組空間, 一個USB儲存執行緒也需要512儲存空間. 到這裡如果硬體正常的話在電腦上就可以識別出U盤來了, 但是不能對U盤進行操作, 因為還要實現USB對儲存器的操作, 這個直接用模板新增USB大容量儲存器程式碼即可, 預設為USBD_User_MSC_0.c, 在裡面進行初始化以及讀寫操作即可. SPI裝置要注意進行修改對應的讀寫驅動, 這裡要注意的一個坑是Keil中介軟體裡的檔案系統對SPI Flash是不支援FAT檔案格式的~!~!~!~用的是一種嵌入式檔案系統, 根本不是FAT, 我被坑了好久好久...., 所以直接用開源的FATFS方案吧, diskio.c中的讀寫可直接用於USBD_User_MSC_0.c中的扇區讀寫, USBD_User_MSC_0.c中的塊指的是扇區的意思, 不是儲存器中塊的意思, 要注意了~!~!

硬體設計中將JTAG引腳PA15當作通用IO口了, 開始沒注意, 設定引腳電平總是無效, 很是鬱悶, 翻了翻資料手冊發現是JTAG口, 需要禁用, 但CMSIS-RTOS中介軟體沒有定義GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);這個函式, 那就自己找吧, 找到了GPIO_AFConfigure函式, 引腳複用對映設定, GPIO_AFConfigure(AFIO_SWJ_JTAG_NO_SW);這個引數不是禁用SW, 而是禁用JTAG, 真不知道怎麼想的, 一共四個相關引數:

  AFIO_SWJ_FULL              = AFIO_FUNC_DEF (24, 7, 0, 0),
  AFIO_SWJ_FULL_NO_NJTRST    = AFIO_FUNC_DEF (24, 7, 1, 0),
  AFIO_SWJ_JTAG_NO_SW        = AFIO_FUNC_DEF (24, 7, 2, 0),
  AFIO_SWJ_NO_JTAG_NO_SW     = AFIO_FUNC_DEF (24, 7, 4, 0),

開始看著哪個都不對啊, 對照資料手冊對資料進行挨個拆分, 檢視GPIO_AFConfigure函式的實現, 才最終確認應該使用AFIO_SWJ_JTAG_NO_SW這個引數, 然而, 你直接這麼呼叫是沒有用的, 檢視GPIO_AFConfigure函式程式碼你就會發現還有個巨集定義AFIO_MAPR_SWJ_CFG_VAL需要關注下, 如果沒有定義這個巨集的話他的值是AFIO_SWJ_FULL, 這就導致了你不管傳入什麼值, JTAG跟SW都不會被禁用的, 我就在RTE_Components.h中提前進行了該巨集的定義

#define AFIO_MAPR_SWJ_CFG_VAL            AFIO_SWJ_JTAG_NO_SW

這樣就可以禁用JTAG並保留SW除錯了.

PS: 以上這種方式很不安全, 因為檔案註釋說明是自動生成的, 而且我發現每次重新開啟專案會重新生成該檔案, 修改的程式碼會丟失, 所以找到了一個比較安全的方式, 在Keil的專案屬性中進行巨集定義設定中新增以下定義即可:

AFIO_MAPR_SWJ_CFG_VAL=AFIO_SWJ_JTAG_NO_SW

這樣就不需要修改RTE_Components.h檔案了.

CMSIS-RTOS + RTX總體來說是很方便的, Keil除錯也非常方便, 但是實用資料並不多, 比如說串列埠在該系統裡就不需要使用中斷了, 都給你包裝好了, 但需要使用執行緒來接收, 自己摸索的一種接收方式, 也不知道是不是正規方法, 官方也沒給出案例, 在這個產品中我都接觸不到中斷函式, SPI, 定時器等等都給包裝好了, 但對我來說長時間沒接觸還保留著以前的STM32開發的觀念, 衝突比較痛苦, 先寫這些吧....