STM32F0非對齊訪問引起的硬體錯誤及其排除

2021-07-26 00:19:00 字數 2032 閱讀 3944

前段時間在用stm32l0晶元時遇到乙個硬體錯誤,主要是記憶體的非對齊訪問導致的。

注:cm3

核心支援非對齊訪問,而

cm0不支援非對齊訪問。

先科普一下,什麼是非對齊訪問

如上圖所示,若要訪問的變數是int、float、u32型別的(佔4位元組),則這些變數在記憶體中,只能以圖中0、4、8為起始位址;

若要訪問的變數是u16型別的(佔2位元組),則這些變數在記憶體中,只能以0、2、4、6、8、10為起始位址;

如上圖所示,像*(u16 * )0x20000001這樣讀取資料的話,在cm0核心的晶元上就會直接進hardfault。

故事是這樣的,我用了兩片595來驅動數碼管,用spi方式。我想,反正一片595就是乙個8位的移位暫存器,每次傳送乙個u8型別的資料要傳送兩次,我幹嘛不把兩個595當成乙個16位的移位暫存器,發乙個u16型別的資料就好了。所以我就把spi初始化成這樣:

hspi1.instance = spi1;

hspi1.init.mode = spi_mode_master;

hspi1.init.direction = spi_direction_1line;

hspi1.init.datasize = spi_datasize_16bit;

和數碼管有關的,我還定義了兩個結構體

typedef   struct

display_typedef;

typedef   struct

spi_led_tx_typedef;

display_typedef               display_structure;

spi_led_tx_typedef       spiled_txstructure;

然後定時器中斷中,每隔一段時間往595傳送資料,**如下

void tim1_cc_irqhandler(void)

spiled_txstructure.buf[0]=   0x0b;                 

hal_spi_transmit_it(&hspi1,spiled_txstructure.buf,1);   }

除了初始化的**,就上面這一小段**,然而一執行,就直接跳到hardfault裡面。

這個現象當時讓我大為不解。在糾結了兩個下午之後,終於知道了問題所在(原諒我第一次遇到hardfault)。

當出現hardfault這類異常時,在除錯狀態下,點開view中call stack window,如下圖:

在hardfault_handler處右擊滑鼠,見下圖

選擇show caller,會出現下圖,即hspi->instance->dr = *((uint16_t *)hspi->ptxbuffptr)這句引起了hardfault。

知道是**引起的就好辦了,經過分析,發現*((uint16_t *)hspi->ptxbuffptr)這裡面的hspi->ptxbuffptr就是指向0x20000005,引發了hardfault。讓我們來看一下記憶體分布:

最後怎麼搞定的呢。發現display_typedef這個結構體占了5個位元組,spi_led_tx_typedef這個結構體占了3個位元組,把他們定義成如下就ok了:

typedef   struct

display_typedef;

typedef struct

spi_led_tx_typedef;

STM32F0系列串列埠DMA收發資料

這裡用的庫函式版本,晶元型號為stm32f030c8t6.在用到串列埠dma時,要按以下幾個步驟進行。1.確定使用的串口號,這裡,我用的是usart2,對應復用的引腳是pa2,pa3。再根據資料手冊查詢其對應dma通道。2.先進行串列埠初始化配置 void usart2 init 3.再配置dma初...

STM32F0 休眠模式下 ADC取樣失效

筆者最近在作某汽車上的智慧型方向盤按鍵專案,系統要求待機電流小於100ua,同時能檢測系統輸入電壓狀態,做到能自檢欠壓和過壓,並通過lin傳送給中控。故筆者在對輸入電壓加了乙個分壓電路來檢測,現在客戶測試發現過壓和欠壓的判斷閾值與要求不符合,筆者在實際測試過程中也確實發現了問題,但未燒錄過程式的板子...

STM32F0微控制器快速入門七 UART中斷操作

1.從輪詢到中斷 很多同學都不喜歡用中斷,而偏愛用輪詢的操作方式。這是不是和我們的天性有關呢?每個人都喜歡一切盡在掌握中,肯定都不喜歡被打斷。我們常常都有這樣的經驗 正在跟別人說一件事,然後突然有個 打進來,call打完後突然記不起來剛才講到哪了!這種糟糕的體驗對我們影響是如此深刻,以至於我們認定機...