吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

程序運行在STM32H750的外擴FLASH上兩小時后死機該如何處理

jf_pJlTbmA9 ? 來源:STM32單片機 ? 作者:STM32單片機 ? 2023-10-24 15:20 ? 次閱讀

1.問題現象

客戶使用 STM32H750VBT6,通過 QSPI 外擴了一個 4M 的 NOR FLASH,采用memory map 模式。當程序跳轉運行到外設 FLASH 后,大約兩個小時后程序死機。

客戶使用的 IDE 是 KEIL,此問題可以固定重現。在 KEIL 調試模式下重現問題時,通過多次觀察發現,程序死的位置總體上會停在兩個位置,并不是同一個位置。一個是 TIM15函數的入口;另一個是進入中斷函數后的一個賦值語句。

2.問題分析及測試

通過拜訪客戶,觀察到死機位置處于即將進入但還未進入的TIM15 中斷入口處。查看客戶的原理圖,發現兩個 VCAP 并未從外部相連,于是要求客戶直接從外部將此兩個引腳飛線短連。但是,后來經測試問題仍然重現。

又觀察到 PC13 連接為 GPIO 輸出引腳,用于驅動一外部組件。考慮到備份域相關的一些引腳其驅動能力相對弱一些,于是讓客戶將 PC13 引腳斷開后再測試,結果問題仍然重現。

上面是一些硬件相關的懷疑點,從測試結果來看,與此問題無關。看來主要可能還是軟件方面的問題。在軟件上確定客戶已經打開了 IO 補償功能, IO 速度設置的是 HIGH,即使讓客戶修改成 “VERY_HIGH”,經測試問題仍然存在。

由于之前發生過一個從低功耗喚醒后死機的問題,是與 Cache 相關的問題,于是測試將 CACHE 關閉的情況。這次經測試客戶反饋問題沒再重現 !

但客戶同時也反饋,之前的代碼也存在稍微修改一處代碼,問題就不再重現的現象,沒有找到具體規律。

這次代碼修改也沒排除這種可能性。為了讓關閉 Cache 的方法更具說服力,于是讓客戶在調試模式下通過手動關閉 CACHE的方式,代碼仍然保持為原先可以重現問題的代碼。如下圖所示 :

wKgZomUD0DiARIcAAAUGQgb1eMw925.png

如上圖所示,在代碼運行到使用 CACHE 后一行設置斷點,當程序停下來后,打開 Sys Ctrl/Cfg 窗口(菜單 view->system viewer->Core peripherals->system control and configuration),將對應的位去掉。最終客戶反饋,關閉 DC,或者 IC 任何一個或者兩個都關閉,問題現象消失。至此可以確定地是,此問題與 CACHE 相關 !

于是查看客戶的 MPU 相關配置,并將 Cube 包里的 H750 示例工程中的 MPU 配置發給客戶測試下,但問題仍然存在。

接下來查看勘誤手冊,發現 2.4.4 節有 QSPI 相關的內容:

wKgaomUD0DmAUZSeAAJz3g9vpo4036.png

這里有提到在 QSPI 外設 FLASH 并工作在 memory-mapped 模式的時候,當讀取由FSIZE 定義的最后一個字節的時候,不管內容如何,有可能會導致 AXIs 總線 STALL 掉。

并同時給出了三種規避措施。其中第一種是將 FSIZE 定義得比實際大,以留有足夠的裕量。于是讓客戶修改代碼:在 QSPI 初始化時將 size 設置成大一倍:

面紅色部分表示的 nor flash 設置成實際的兩倍大小。

同時考慮到此處定義了實際兩倍大小的 FLASH,多出來的另外一半實際是不存在的,為了避免 CPU 意外訪問這個實際不存在的區域,使用 MPU“告訴”CPU 這多出來的一半區間是不可訪問的。

于是 MPU 按如下來配置:

使用串口終端工具,分別連接 USART1,USART3,發送對應的 UART Bootloader 命令,得到下圖 3 的命令交互。

wKgZomUD0DuARYV8AAO8qQfEQVA863.png

圖3.MPU 配置

客戶再次測試,問題不再重現。為了進一步驗證問題,客戶嘗試按原先的代碼直接讀取 NOR FLASH 的最后一個字節,問題還會重現,再次驗證此方法的有效性,至此問題解決。

3.后記

有些人可能會問,NOR FLASH 的最后一個字節 CPU 真的會去訪問嗎 ? 客戶的程序占滿了整個 FLASH 空間了嗎 ? 若那個地址沒有代碼那還會不會有這個問題。

其實勘誤手冊 2.4.4 節也提到了,不管 FSIZE 定義的空間最后的一個字節內容是什么,均會有此問題。那么 CPU 為什么會去訪問此地址呢 ? 其實這是 M7 內核的指令預取和分支預測試探性訪問導致的。

在 M7 編程手冊中可以找到如下內容:

wKgZomUD0D2AfCoFAACYqTEv0VE452.png

正是上述特性才導致 CPU 會提前訪問 NOR FLASH 上的地址,即使當前 PC 指針還未指到那里。我們可以通過合適的MPU配置防止因試探性訪問外存而導致問題。

參考文獻:

1. PM0235:STM32F7 Series and STM32H7 Series Cortex?-M7 processor programming manua.

2. ES0396:STM32H750xB and STM32H753xI device limitations.

3. AN4838:Managing memory protection unit in STM32 MCUs.

4. AN4893:Level 1 cache on STM32F7 Series and STM32H7 Series.

來源:STM32單片機

免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理


審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FlaSh
    +關注

    關注

    10

    文章

    1642

    瀏覽量

    148663
  • STM32H750
    +關注

    關注

    1

    文章

    16

    瀏覽量

    1798
收藏 人收藏

    評論

    相關推薦

    STM32H750在-40℃環境下程序在串口初始化階段跑飛了怎么處理

    STM32H750,主頻設置為400MHz,常溫下可以正常工作,低溫-40℃時,程序在初始化階段跑飛,用仿真器連接進行調試,單步運行在串口初始化函數處報錯: Target
    發表于 07-04 06:35

    STM32H750DMA+SPi內存數據不一致的原因?

    發現用stm32H750 dma+spi讀寫數據時發現當spi速度大于8M時出現內存不一致的問題,我再讀之前已經用SCB_CleanInvalidateDCache_by_Addr這個函數無效化內存了,速度小于8M時沒有這個問題,我這個程序
    發表于 05-24 07:53

    如何提快STM32H750的DMA中斷響應時間?

    STM32H750程序在外部FLash運行,中斷程序是在RAM中。測試中斷響應時間有1us多,怎樣能縮短這個時間。 上面的響應時間指的是觸發
    發表于 05-20 08:19

    STM32H750可以仿真但運行又進不了main是為什么?

    STM32H750遇到可以仿真,但運行又進不了main的情況 仿真可以正常運行,但直接運行時就進不了main(),請問有兄弟遇到相同情況嗎
    發表于 04-16 06:10

    測試LWIP UDP(STM32H750)接收接收5913及以上,5秒左右就進入HardFault_Handler死機狀態的原因?

    請問測試原子的例子 lwip_udp_iperf(STM32H750/STM32H743)接收接收5913及以上,5秒左右就進入HardFault_Handler死機狀態,有誰碰到過類似問題嗎?
    發表于 04-15 07:12

    STM32H750不能使用IAR進行仿真是為什么?

    大家好,我現在正在使用STM32H750,使用的IDE 是IAR 現在在進行Debug的時候遇到一個問題,由于使用了QSPI-flash,現在程序可以下載,但是不能仿真,是參照CebuMX的例程寫的,想請教下有沒有前輩遇到過這個
    發表于 04-09 08:14

    STM32H750如何使用IAR調試運行在外部SDRAM的程序?

    正在使用STM32H750開發應用。 我的用戶程序,儲存在QSPI Flash中,運行在SDRAM中,采用了Bootloader來復制程序
    發表于 04-01 07:40

    求助,如何使用openOCD下載程序stm32h750外部flash

    我有一塊stm32h750的核心板,并使用openOCD為它下載程序。我想將程序下載到外部的8MB Falsh中,但我沒有思路如何做。有沒有朋友能分享下思路? openOCD文檔中有
    發表于 03-27 06:20

    STM32H750 HAL_MspInit(void)接口中不調用__HAL_RCC_SYSCFG_CLK_ENABLE(),高溫死機的原因?

    STM32H750,HAL_MspInit(void)接口中不調用__HAL_RCC_SYSCFG_CLK_ENABLE(),高溫死機,調用后高溫不死機,求原因
    發表于 03-26 06:02

    STM32H750 QSPI flash重映射模式下有方法能實現讀寫操作嗎?

    STM32H750 QSPI flash重映射模式下有方法能實現讀寫操作嗎
    發表于 03-25 08:06

    STM32H750 BootLoader如何重刷?

    STM32H750 BootLoader如何重刷,在哪里可以找到文檔
    發表于 03-20 06:44

    STM32H750可以使用Cube.AI嗎?

    STM32H750,可以使用Cube.AI嗎
    發表于 03-19 06:14

    stm32H750使用FreeRTOS有時死機的原因?

    stm32H750使用FreeRTOS,偶爾會出現所有線程停止運行的狀況(流水指示燈不閃,程序不跑),此時點擊觸摸屏觸發一下串口中斷,所有的線程又會恢復運行,從堆棧調用情況看,有點像是
    發表于 03-18 07:54

    STM32H750VBT6可以同時使用SDRAM,LDTC以及外掛QSPI FLASH嗎?

    STM32H750VBT6的片內Flash只有128K大小,所以肯定需要外掛FLASH,由于還需要外掛一塊800x480分辨率的TFT屏,所以也需要
    發表于 03-13 06:49

    stm32h750如何使用個usb口?

    我現在在使用stm32h750芯片,想要使用個usb口,一個作為device連接電腦,一個作為host連接u盤。spi之類的都有需要spi1 spi2這種,但是并不明白我這個usb怎么做,好像
    發表于 02-26 06:51
    广州百家乐扫描分析| 百家乐官网制胜绝招| 百家乐官网虚拟视频| 裕民县| 瑞丰国际开户| 澳门葡京| 钦州市| 百家乐赌场策略论坛| 真人百家乐攻略| 怎么看百家乐路单| 百家乐路单下| 大发888怎么玩才赢| 德州扑克平台| 新濠国际娱乐| 战胜百家乐官网的技巧| 百家乐官网六手变化混合赢家打法| 百家乐官网水浒传| 百家乐官网追号工具| 百家乐一直下注庄家| 网上的百家乐是真是假| 百家乐筹码托盘| 百家乐彩金| 大发888游戏代冲省钱技巧| 镇坪县| 网上百家乐官网如何打水| 百家乐官网详情| 来博百家乐游戏| 利高百家乐的玩法技巧和规则| 大发888东方鸿运| 维也纳娱乐城| 百家乐官网有好的投注法吗| 免费玩百家乐官网的玩法技巧和规则 | 百家乐官网赌博技巧大全| 利高百家乐官网的玩法技巧和规则 | sz新全讯网网址112| 新皇冠现金网| 网上百家乐官网内幕| 百家乐投注方法| 大发888网页游戏平台| 百家乐官网园千术大全| 百利宫百家乐官网的玩法技巧和规则 |