RTT使用问题总结
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如果担心通讯过程因高优先级切走而通讯失败可以暂时用错误重发来解决这个问题。