STM32 使用Cube的心得(一)
最近做了一個專案使用Cube自動生成程式碼,然後利用HAL庫進行程式設計。晶片為STM32F103C8T6進行程式設計。
I2C讀寫
1. 地址需要自己左移1位(stm32中需要,但是NXP中不需要),LPC系列的以前用過一款,函式內部自動左移了。
2. SCL,SDA通訊時需要接上拉電阻,然後接到高電平,否則通訊不同,顯示I2C處於busy狀態。
FLASH讀寫
1. 注意Flash儲存資料的起始地址,還要注意記憶體大小,是1KB,還是2KB,還是128KB
2. Flash擦除時有方法,不要統一擦除,比如:128KB,可以分為128個1KB的區域,每次寫1KB,寫滿後再統一擦除。而且寫入Flash時第一個地址要寫入自己設定的值,判斷擦除時需要判斷第一個地址的內容是否相同。
定時器多通道捕獲PWM脈衝數
HAL_TIM_IC_Start_DMA()這個函式,如果只用了定時器的一個通道,那使用沒有問題。如果使用了個通道,那就需要改HAL庫裡這個函式的程式。如下圖所示
註釋掉之後,定時器多通道捕獲PWM脈衝數就可以正常使用。要不然只有一個通道可以正常使用,另一個通道呼叫這個函式的狀態就是HAL_TIM_STATE_BUSY。
CAN匯流排(CAN_MODE_LOOPBACK)
1. 使用CAN匯流排協議進行傳送接收資料時,經常會發生HAL_TIMEOUT的現象。但是以前1.31的版本就不會有,我用的1.60版本,對比發現是下圖中的CAN_TSR_TX0K2被省略了。
2. 再進行多次測試時,我們發現了另外一個問題,CAN回撥函式接收資料只能接收一次。
發現在呼叫HAL_CAN_Receive_IT()函式時,第二次時CAN的狀態就變成LOCK的,沒有進入__HAL_CAN_ENABLE_IT函式,導致中斷只進入一次。可以在回撥函式中加入這個函式。如下圖:
3. 雙機通訊不需要修改修改上面的2點。就CAN_MODE_LOOPBACK模式需要修改。
其他還沒有發現HAL庫什麼問題,有問題我會繼續補充。