1 ENV下不用將stm32fnxx_hal_msp.c拷貝到RTT工程文件夾下(也不用調用其中的片上外設函數如void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi),聽說KCONFIG自己會調用根據弱定義尋找;studio下根據文檔說是需要;
stm32_spi_init(drv_spi.c line81)-》HAL_SPI_Init(被spi_conifgure 調用drv_spi.c line387,代碼在hal_spi.c line 310,又調用了 HAL_SPI_MspInit)-》 HAL_SPI_MspInit(hspi)-》在stm32f4xx_hal_spi.c中弱定義,在stm32f4xx_hal_msp.c 中根據cubumx生成,所以需要將cubumx生成的 HAL_SPI_MspInit拷貝到board.c下。
- HAL_SPI_MspInit在stm32f4xx_hal_spi.c中弱定義;在由cubumx在stm32f4xx_hal_msp.c生成。
- HAL_SPI_Init調用HAL_SPI_MspInit
- stm32_spi_init()調用HAL_SPI_Init()
- spi_configure調用stm32_spi_init()
- spi_configure通過stm_spi_ops結構體被rt_spi_bus_register調用-》又被rt_hw_spi_bus_init(void)-》又被rt_hw_spi_init(void)調用-》通過INIT_BOARD_EXPORT(rt_hw_spi_init)調用進行初始化。
2 關於SPI配置,當設定最大速率后最終發現時鍾頻率降低2倍的原因,是因為RTT獲取時鍾源函數stm32_spi_init下的 SPI_APB_CLOCK不正確,沒有正確反映外設掛在哪個總線下面;解決方法有2種:
- 方法1 :將struct rt_spi_configuration cfg 的cfg.max_hz*2並做好備注聲明(適合共享給其它人應用的軟件包);
- 方法2:將下面的通過宏定義修改正確,從而獲得正確的參數時鍾(分頻值),這種方法適合代碼自用(因為別人不一定用該SPI,且時鍾源也不一定相同(不同系列的STM32));
#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0)
SPI_APB_CLOCK = HAL_RCC_GetPCLK1Freq();
#else
SPI_APB_CLOCK = HAL_RCC_GetPCLK2Freq();
#endif
3 外設的使用一定要注意打開board.h進行類似以下的聲明
#define BSP_USING_UART1 #define BSP_UART1_TX_PIN "PA9" #define BSP_UART1_RX_PIN "PA10"
4 自己寫的驅動老是說找不到頭文件,盡管路徑已經設置好了,原因時下面的宏沒有打開
#define PKG_USING_ADE7913 #ifdef PKG_USING_ADE7913
5 studio下從HSI到HSE,將cubmx生成的SystemClock_Config 替換 drv_clk.c中的system_clock_config(target_freq)並將該函數的源代碼屏蔽;同時在 STM32F4xx_HAL_CONF.H中修改HSE的值
//先修改stm32f1xx_hal_conf.h中的 HSE_VALUE與實際的一致
//然后在drv_clk.c中替換SystemClock_Config
void clk_init(char *clk_source, int source_freq, int target_freq) { //system_clock_config(target_freq); SystemClock_Config(); }
//最最后同時也修改board.h中的三個宏,盡管原來的HSI時鍾配置也沒有用到其進行計算,只是為了提示輸出
*-------------------------- CLOCK CONFIG BEGIN --------------------------*/
#define BSP_CLOCK_SOURCE ("HSE")
#define BSP_CLOCK_SOURCE_FREQ_MHZ ((int32_t)8)
#define BSP_CLOCK_SYSTEM_FREQ_MHZ ((int32_t)72)
/*-------------------------- CLOCK CONFIG END --------------------------*/
6 studio下SPI的使用,按照board.h中所說即可,不用顯示調用HAL_SPI_MspInit(&hspix),有的地方自會調用
7 對於多個線程共享互斥量時一定要注意:1 申請和釋放要成對使用;2 如果有條件分支要么在各自分支中釋放(適用於如果分支執行完需要較長時間。釋放數目大於申請),要么集中釋放。不正確使用會造成有得線程被一直掛起。
7 rt-thread studio中關於工作空間:可參考Eclipse中的工作空間介紹(Workspace)
可以在工作空間里創建多個工程,各工程可以不和workspace在同一個文件夾下,工作空間可以新建和切換;不同文件夾下不同版本的相同工程導入同一個空間時后導入的可以先刪除.metadata文件夾和Workspace文件夾再導入,配置可以拷貝“.setting"文件夾
8 rt-thread studio下的git版本管理
9 關於RTT對於臨界區的保護,現在只有關中斷,但有的是不能關中斷的,否則任務就不能跑了譬如基於中斷的串口接收;對於modbusRTU如果擔心通訊過程因高優先級切走而通訊失敗可以暫時用錯誤重發來解決這個問題。