STM32Cube踩坑記錄(一)--SPI_HardFault_Handler


title: STM32Cube_SPI_HardFault_Handler
tags: STM32Cube
date: 2019-09-05 23:53:00


今天記錄一個問題,一個困擾我兩天的問題,STM32CubeMX SPI 進行串行Flash W25Q通訊,進入硬件中斷的問題。

首先,我第一次生成CUbe工程,添加SPI測試讀取W25Q的ID,OK 一切正常,分分鐘搞定,但是緊接着第二天打開通盈的代碼,居然跑死了,直接不往下走了,真的是奇了怪了,緊接着就是兩天的測試,搜索,百度。。。。無果


今天晚上,又一次開始搜索,測試了很多方法,最終回憶起昨天看到的一個帖子,決定試一下,果然OJBK,搞定!:

{@。@} 我太難了~~
今天記錄一下整體的問題與解決方法。
首先參考鏈接: http://www.eemaker.com/stm32-hal-spi-hardfault.html
上面解釋的很好,就是半字節對齊的問題,不然程序會跑死在SPI接收區,然後卡死在

void HardFault_Handler(void)
{
  /* USER CODE BEGIN HardFault_IRQn 0 */

  /* USER CODE END HardFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_HardFault_IRQn 0 */
    /* USER CODE END W1_HardFault_IRQn 0 */
  }
}

解決方法爲:在接收buffer定義的前面加一個半字節對齊的標識

/* USER CODE BEGIN PTD */
uint8_t cmd[4] = {READ_ID_CMD,0x00,0x00,0x00};
uint8_t wData[0x100];
uint8_t rData[0x100];
uint32_t i;
uint8_t ID_1[2] = {0xFF,0xFF};
uint8_t ID_2[2];
__attribute((aligned (2)))  uint8_t ID[2] = {0}; //__attribute((aligned (2)))  按照半字節對齊
/* USER CODE END PTD */

然後就是,即使解決了這個問題 有可能讀出來的ID是做的,比如: 0x00 0x53
這是什麼鬼? 最後找到原因如下: CPOL設置爲HIGH,但是微雪的教程設置爲了LOW

下圖爲微雪教程:

或許和芯片類型不一樣,我用的是F030的芯片,主頻比較低。

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