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

查看: 3044|回復(fù): 0
打印 上一主題 下一主題

Flash擦寫操作導(dǎo)致USART接收丟數(shù)據(jù)的話題

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

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

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

話題延伸:
我們?cè)購(gòu)牧硪唤嵌葋硭伎己吞接懺搯栴},拋磚引玉吧。
顯然,導(dǎo)致程序發(fā)生執(zhí)行停頓的一個(gè)關(guān)鍵原因是對(duì)Flash 進(jìn)行了寫或者擦除操作。如果再排除這一原因,也就不會(huì)發(fā)生程序執(zhí)行停頓了。所以,要解決這一問題,可以將數(shù)據(jù)暫存在RAM 當(dāng)中,而不是每次修改后都立刻更新Flash。可以考慮利用STM32 的PVD 功能監(jiān)控電源電壓,發(fā)現(xiàn)有掉電傾向立刻啟動(dòng)寫Flash 操作,將RAM中暫存的數(shù)據(jù)寫到Flash 中。這樣,在整個(gè)STM32 運(yùn)行期間,只有到了最后時(shí)刻才對(duì)Flash進(jìn)行了寫操作,而這時(shí)也不需要再響應(yīng)什么事件了(也沒時(shí)間響應(yīng)了)。這是一個(gè)不錯(cuò)的思路,當(dāng)然,很多細(xì)節(jié)需要仔細(xì)斟酌。

首先,為節(jié)約這最后的每一微秒時(shí)間,F(xiàn)lash頁(yè)面的擦除要提前完成。若將這一操作放在STM32 開始監(jiān)控各種事情以后自然不妥,因?yàn)橥瑯訒?huì)造成事件響應(yīng)不及時(shí)。看來,最佳時(shí)間段只有系統(tǒng)初始化階段了。

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

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美.亚洲.日本一区二区三区 | 亚洲欧美成人网 | 91精品国产综合久久久久 | 久久精品爱国产免费久久 | 欧美xxxxx九色视频免费观看 | 日韩免费影视 | 国产人成午夜免视频网站 | www亚洲免费| 日韩欧美成末人一区二区三区 | 国产精品1区 2区 3区 | 四虎国产精品视频免费看 | 一区二区日韩 | 国产另类视频 | 四虎影视国产884a精品亚洲 | 五月婷婷俺来也 | 久久涩视频 | 久久777国产线看观看精品卜 | 欧美成人精品高清在线播放 | 手机在线观看精品国产片 | 国产精品麻豆综合在线 | 在线动漫网| 日本黄色免费在线视频 | 精品一区 二区三区免费毛片 | 四虎国产精品免费久久久 | 啦啦啦社区手机在线视频免费视频 | 久久精品一区二区 | 九九re| 成人精品视频 | 91小视频在线观看免费版高清 | 精品视频久久久 | 在线亚视频 | aiai网站 | 靠逼视频网站 | 青青青在线免费 | 三级网站国产 | 家庭教师 在线播放 | 一区二区三区四区视频在线 | 在线免费观看日韩视频 | 亚洲综合激情 | 黑人中文字幕在线精品视频站 | 日本视频在线免费 |