国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 2963|回復: 0
打印 上一主題 下一主題

Flash擦寫操作導致USART接收丟數據的話題

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2017-3-29 13:34:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
問題:
該問題由客戶提出,發生在STM32F103VDT6器件上。據客戶工程師講述,在其產品設計中使用了STM32片上Flash模擬了EEPROM的功能,用于存貯數據。在軟件調試時,發現開啟此功能,會影響到USART通信,導致偶爾發生個別數據接收不到的現象。
調研:
檢查其軟件代碼,發現其中對Flash上數據的更新操作分為如下幾個步驟:
1. 保存Flash頁上的數到RAM中;
2. 擦除Flash頁;
3. 修改RAM中的數據;
4. 將RAM中的數據寫回Flash頁上;
對照STM32的數據手冊,查找到相關的數據:
1. 字寫入時間 40uS ~ 70uS;
2. 頁擦除時間40mS;
檢查軟件代碼,找到對USART的設置:
1. 波特率115200BPS;
2. 幀格式為1 個起始位,8個數據位,2個停止位;
檢查軟件代碼,發現其對USART的接收數據采用中斷的方式進行讀取。
結論:
通過計算,USART的每個幀的傳輸時間為:
該時間大于Flash的字寫入時間,小于Flash的頁擦除時間。所以,在Flash頁擦除期間有可能發生多次字節幀的傳輸。而在此其間,由于Flash接口不可用,CPU不能取指令,導致中斷得不到及時響應,從而發生接收到的數據未及時讀走而被覆蓋的現象。
處理:
在內存中建立循環緩沖區,開啟DMA 通道。一旦USART 有數據收到,DMA 負責將其傳輸至循環緩沖區中。軟件定期檢測循環緩沖區中是否有接收到的數據,如果有則加以處理。
建議:
在只有一個Flash 模塊的STM32 中,CPU對 Flash 接口的使用具有獨占性。該接口不能同時進行多個操作,比如,在寫操作的同時進行讀取操作,或在擦除操作的同時進行讀取操作,即便讀、寫操作的地址不同,或者所讀數據不在被擦除的頁上也不行。因此,當程序運行在Flash 上情況下,在對Flash 進行寫入、擦除操作時,往往會因為CPU 取不到指令而造成程序執行的停頓。這一現象會引發系統對外部事件響應上的不及時,必須采取相應的措施加以避免。

通常,對于通信接收數據這類事件,可以使用DMA 進行輔助,避免數據被覆蓋。對于外部中斷、定時事件等必須要軟件及時響應的事件來說,可以將中斷向量表轉移到 RAM 中,同時將中斷服務程存放在 RAM 中執行。CPU 的VTOR 寄存器用來存放中斷向量表的偏移地址,修改該寄存器的值,可以改變中斷向量表在內存空間中存放的地址,詳見Cortex-M3 的技術參考手冊。

在IAR 開發工具下,定義一個在RAM 中執行的函數,可以使用其擴展關鍵字__ramfunc,舉例如下:
__ramfunc void EXTI9_5_IRQHandler(void)
{
  If (EXTI_GetITStatus(EXTI_Line9)!=RESET)
   { /*clearthe EXTI line9 pending bit*/
   EXTI_ClearITPendingBit(EXTI_Line9);
  ……
   }
}
Keil MDK 中,可以將相關的中斷服務程序單獨放在一個“.c”文件中,然后通過修改scatter 文件來實現在RAM中執行,例如中斷服務程序放在“exti9.c”中:
LD_ROM 0x8000000 0x10000
{
EX_ROM 0x08000000 0x10000
   {
      Startup.o(RESET,+FIRST)
      ANY(+RO)
     }
  EX_RAM 0x20000000
   {
    exti9.o(+RO)  ;將中斷服務函數放在RAM中
   }
RW_RAM +O
  {
  startup.o(STACK,+ZI)
  .ANY(+RW,+ZI).
   }
}

話題延伸:
我們再從另一角度來思考和探討該問題,拋磚引玉吧。
顯然,導致程序發生執行停頓的一個關鍵原因是對Flash 進行了寫或者擦除操作。如果再排除這一原因,也就不會發生程序執行停頓了。所以,要解決這一問題,可以將數據暫存在RAM 當中,而不是每次修改后都立刻更新Flash?梢钥紤]利用STM32 的PVD 功能監控電源電壓,發現有掉電傾向立刻啟動寫Flash 操作,將RAM中暫存的數據寫到Flash 中。這樣,在整個STM32 運行期間,只有到了最后時刻才對Flash進行了寫操作,而這時也不需要再響應什么事件了(也沒時間響應了)。這是一個不錯的思路,當然,很多細節需要仔細斟酌。

首先,為節約這最后的每一微秒時間,Flash頁面的擦除要提前完成。若將這一操作放在STM32 開始監控各種事情以后自然不妥,因為同樣會造成事件響應不及時?磥,最佳時間段只有系統初始化階段了。

其次,在擦除Flash 期間發生掉電要如何處置?這時,備份在RAM 中的數據會來不及寫回Flash 而丟失。為了避免這一情況的發生,可以使用雙頁交替存貯的方式(傳說中的乒乓操作)保存數據。兩個Flash 頁上分別存有兩個版本的數據,一新一舊,并在最后附有版本號及校驗和。系統初始化時,選擇的舊版本頁面或無效頁面進行擦除。這樣,既便此時發生掉電,也無須向Flash 寫回備份數據,因為最新數據仍在Flash中。而每次向Flash 更新數據時,都以更新的版本號進行標注,原來的新本數據自然的變成了舊版本。
------ 微信公眾號   融創芯城(一站式電子元器件、PCB/PCBA購買,項目眾包,方案共享平臺)
再次,為了盡量延長最后的可用于寫Flash 的時間,盡量降低系統功耗是非常有必要的。關掉PLL,直接使用OSC 送來的時鐘作為系統時鐘,可以明顯的降低功耗。關掉所有外設的時鐘可以進一步降低系統的功耗。根據片外電路的特性,調整I/O 的輸出狀還能進一步降低系統功耗。

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆精品久久久一区二区 | 亚洲激情综合在线 | 精品国产国产综合精品 | 亚洲日本va| 噜噜噜网站 | 国产成人精品男人的天堂538 | 韩国一级毛片免费完整视频 | 亚洲精品aⅴ中文字幕乱码 亚洲精品98久久久久久中文字幕 | 日韩高清伦理片中字在线观看 | 麻豆网站 | 91视频最新网址 | 91青青青国产在观免费影视 | 今野由爱毛片在线播放 | 日韩a级片在线观看 | 精品国产品国语在线不卡丶 | 四虎8848精品永久在线观看 | 四虎国产精品免费视 | 欧美日韩一区二区不卡三区 | 亚洲国产高清一区二区三区 | 免费h福利动漫网站在线 | 欧美日韩中文国产一区二区三区 | 中文字幕一区二区在线观看 | 91在线免费视频观看 | 青草青青产国视频在线 | 免费观看情趣v视频网站 | 亚洲精品自在在线观看 | 青青在线国产 | 国产精品免费一区二区区 | h漫免费 | 亚洲欧美综合乱码精品成人网 | 精品视自拍视频在线观看 | 痴女中文字幕在线视频 | 国产精品手机在线亚洲 | 五月天中文字幕 | 国产福利影院 | 极品在线 | 视频二区中文字幕 | 91中文字幕视频 | 免费一级特黄视频 | 特级毛片aaa免费版 特级毛片aaaa免费观看 | 欧美日韩成人在线视频 |