FLEX項目學習總結

MCU:STM32F030R8     

時鐘頻率:16MHZ

模塊資源使用:

    ADC & DMA —— 監測系統電壓,用於掉電檢測

    UART2 —— 與藍牙通信

    I2C1 —— 與DSP芯片通信

    I2C2 —— 與電池包通信

    TIM3 & TIM14 —— 呼吸燈PWM、系統延時

MCU存儲空間資源分配

 

 1、掉電檢測與掉電保存

    單片機在正常工作時,因某種原因突然斷電,將會丟失數據存儲器(RAM)裏的數據。鑑於此,可以將下次上電時要使用的數據保存到內部FLASH或者外部FLASH中;另外,有時爲了減少擦寫FLASH的次數,也會採用掉電保存這種存儲數據的方式。

    在本項目中,提供給用戶調節的EQ參數在上電時需要讀取上次的設置值,因此採用內部FLASH保存設置值。具體做法: MCU的ADC採樣監測系統電壓值的變化,當檢測到電壓值小於640mv時則認爲系統正面臨斷電,立馬進行掉電保存(保存EQ參數以及Mute功放)操作。

    在實際應用時,應注意以下幾點:

     A、掉電電壓閾值的設定應合理,FLEX是帶電池包的產品,當只有電池包供電時且電池包低電量時,測得其放電電壓是680mv左右,掉電電壓閾值應該小於該值,纔不會導致電池包低電量供電時MCU判斷爲掉電而去Mute功放。

     B、測試掉電時間時,除了測系統監測電壓值小於640mv,還應該同時測試MCU的VDD管腳觀察其掉電情況。結合STM32F030R8的datasheet知道其MCU的正常工作電壓最低只能到2.4v,因此需測量從640mv開始MCU的VDD管腳掉到2.4v的時間。實際測量得到這段時間大概是6ms,而擦除一頁FLASH以及寫入EQ參數的時間爲32ms,因此這個時間遠遠不夠。爲了解決這個問題,採用加大VDD管腳的電容值(大概380uF可達到40ms)來延長MCU的掉電時間。

 

2、HardFault的調試

    在計算濾波器EQ參數以及設置DSP時發生了HardFault錯誤,調試方法:Debug程序,在發生HardFault時停止運行,找到SP的值,大概4個字後存儲的是發生HardFault語句的地址,定位找到程序中的語句再排除錯誤。一般而言,當數組越界、指針亂指或堆棧溢出時會發生HardFault錯誤。我這裏是因爲結構體裏的指針傳給形參時沒有規範好而發生HardFault。

 

3、電池包

     FLEX使用的是可充電的單顆電池包,其中充電由充電IC(BQ24780S)設置充電電壓和充電電流,同時監測輸入電流、健康度等信息。而電池包芯片(BQ28Z610)則包含電池包的實際信息。當充電時,需要設置充電IC的充電電壓和充電電流,如果正常充電,則電池包芯片的電流與設置的充電電流大小相似;當放電時,電池包芯片的電流一般爲負值,如果外部沒有什麼負載耗電也有可能是0mA。因此,程序中判斷電池包的充電和放電應根據電池包芯片的電流信息來判定,不能單純通過充電電壓充電電流設置成功來判定。

 

4、藍牙與MCU的串口通信

      MCU接收藍牙數據採用串口中斷接收,接收到的數據會根據通信協議裏的定義分類放入接收池等待解析。本項目中一共有兩個地方解析接收數據:一是bt.c文件;二是dsp.c文件。一般的指示、命令和應答都在bt.c內解析,而由調參軟件app發過來的調參指令和參數信息則放到dsp.c文件裏面解析。在這裏需要注意的一點是:因爲串口開啓中斷接收,在什麼時候接收到數據是未知的,而BT_Polling()和DSP_Polling()在while循環裏面的調用有先後順序,所以,爲了防止出現誤丟包(漏掉數據沒有解析)的情況,應該在接收數據的結構體中設置一個標誌位,標誌其是否被bt或者dsp處理過,如果一個輪詢週期後該標誌沒有被bt或者DSP處理則認爲其不屬於通信協議內規定的指令,則可以丟棄。

    MCU發送數據給藍牙用到兩種發送方式,一種是中斷髮送,一種是查詢發送。在發送池裏的數據會有一個“是否立即發送”的標誌,如果需要立即發送則採用查詢方式,否則採用中斷方式,並且每個數據發送的時間間隔也是一致的。在實際應用中,爲了保證實際發送數據的順序跟插入數據時的順序一致,用到了一個發送表(即隊列數據結構),每次發送從隊列頭取數據,每次插入數據插到隊尾。

 

     

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