首页 > 其他分享 >rtthread适配及使用serial_v2的问题

rtthread适配及使用serial_v2的问题

时间:2023-01-02 17:01:43浏览次数:55  
标签:rt 适配 init rtthread v2 board 留坑 serial

rtthread适配及使用serial_v2的问题

主控芯片:STM32F407ZG

1. 适配问题

本项目工程一开始使用的主控是STM32L496,正常移植使用serial_v2没有问题。将工程复制下来后使用rtthread studio的修改工程-芯片型号将主控型号更改为STM32F407ZG后自动联网下载STM32F4的SDK包。如下图所示(是因为我的环境中一直没下载过这个SDK包)因为我的版本是4.0.5所以我下载的是0.2.2
image

下载后正常配置serial_v2的使能和board.h中配置后编译发现报错找不到serial_v2。查看drv_usart.c发现并没有v2相关的信息等。怀疑是driver驱动没有兼容v2版本。百度后发现sdk的gitee中有相关代码。(https://gitee.com/RT-Thread-Studio-Mirror/sdk-csp-stm32f4/tree/master/drivers/rtt)
下载后替换drivers中的相关.c文件(不单单是drv_usart.c文件还有dma_config.h等,我是全替换了)。
编译后第一个问题:发现找不到serial_v2文件:

\rt-thread\components\drivers\include/rtdevice.h:61:31: fatal error: drivers/serial_v2.h: No such file or directory

解决办法:我找了一个L4的serial_v2复制到指定目录中。

编译后第二个问题:因为在board.h中定义了console口。设置内容如下:
image
发现可以正常编译,但是打印异常,只能打印出几个字符且没有规律。
解决办法:造serial_v2中应该设置TX_BUFSIZE=0;如果不设置成零在系统初始化中进入rt_console_set_device->rt_device_open->rt_serial_open->rt_serial_tx_enable会设置成串口的write函数为_serial_fifo_tx_bloching_buf。在第一次调用打印信息时候调用此函数会调用rt_completion_wait函数,此函数会调用线程挂起函数此时传入的值是NULL。导致程序出问题。以下为各个函数的截图
image
image
image
image
image
image
image
所以在board.h中设置console对应的串口时候BSP_UART2_TX_BUFSIZE应该设置为0

编译app后的中断向量表的问题:在STM32L4时候直接使用函数

static int ota_app_vtor_reconfig(void)
{
    #define NVIC_VTOR_MASK   0x3FFFFF80
    /* Set the Vector Table base location by user application firmware definition */
    SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;

    return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

定义中断向量表。但是换到STM32F407后会发现程序卡在了
rt_hw_board_init()-》hw_board_init(BSP_CLOCK_SOURCE, BSP_CLOCK_SOURCE_FREQ_MHZ, BSP_CLOCK_SYSTEM_FREQ_MHZ)-》clk_init(clock_src, clock_src_freq, clock_target_freq);中。最后发现把中断向量表的重定向函数放在rt_hw_board_init函数的开头问题解决。原因暂时没有深究。


留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑留坑



RT_WEAK void rt_hw_board_init()
{
    extern void hw_board_init(char *clock_src, int32_t clock_src_freq, int32_t clock_target_freq);

#define NVIC_VTOR_MASK   0x3FFFFF80
/* Set the Vector Table base location by user application firmware definition */
SCB->VTOR = 0x08020000 & NVIC_VTOR_MASK;

    /* Heap initialization */
#if defined(RT_USING_HEAP)
    rt_system_heap_init((void *) HEAP_BEGIN, (void *) HEAP_END);
#endif

    hw_board_init(BSP_CLOCK_SOURCE, BSP_CLOCK_SOURCE_FREQ_MHZ, BSP_CLOCK_SYSTEM_FREQ_MHZ);

    /* Set the shell console output device */
#if defined(RT_USING_DEVICE) && defined(RT_USING_CONSOLE)
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif

    /* Board underlying hardware initialization */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

}

标签:rt,适配,init,rtthread,v2,board,留坑,serial
From: https://www.cnblogs.com/ydmblog/p/17019622.html

相关文章