完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
嵌入式系统:rt-thread
开发板:STM32F429 上了嵌入式操作系统的程序结构复杂,所以串口初始化的过程也不如裸机程序直观明了,在需要根据实际情况修改串口时,就会存在找不到相关程序位置的现象,所以接下来,对rt-thread中的串口初始化过程进行一下梳理。 1.首先在rt-thread的内核Kernel的components.c文件中,有一个rtthread_startup()函数,该函数被$Sub$$main(),__low_level_init(),entry()三个函数中均有调用,而这三个函数中,具体执行哪个,取决于宏定义,而三个函数前对应的宏定义__CC_ARM,__CLANG_ARM,__ICCARM__,__GNUC__是MDK中使用的编译器来选择的。这里推测应该是使用的$Sub$$main()函数。而该函数中$Sub$$的作用就是在main函数执行前,先执行以下这个函数中的代码,即rtthread_startup()函数。 2.rtthread_startup()函数中,主要是rt-thread进行板级的一些初始化,如打印rt-thread的logo信息,系统时钟的初始化,系统调度初始化,空闲进程的初始化等。其中rt_hw_board_init()函数中,就是对一些板级硬件的初始化,该函数的定义位于drv_common.c文件中。 3.rt_hw_board_init()函数,该函数的定义位于drv_common.c文件中。有对系统时钟的配置,对tick的初始化,堆内存的初始化,控制台打印输出设备的初始化等,其中就包括对串口的初始化,即rt_hw_usart_init()函数,在此处调用该函数所需要的宏定义RT_USING_SERIAL,在rtconfig.h文件中有定义。 4.rt_hw_usart_init()函数,具体的定义位于drv_usart.c文件中。先是计算出需要初始化的串口结构体数组中,有obj_num个结构体;然后创建了一个串口默认配置的结构体config,将之赋值为RT_SERIAL_CONFIG_DEFAULT,跳转至该值,就发现,其对波特率、数据位、停止位、校验位等进行了赋值。由于需要初始化的串口有obj_num个,所以在该函数下边,使用一个for循环,对obj_num个串口的结构体中的元素进行了赋值。 赋值的元素中uart_obj.config中包含串口的名字,中断向量,以及如果使用DMA时所使用的通道等值的赋值,这里边涉及到的BSP_USING_UART1之类的宏定义,在rtconfig.h文件中进行定义; 赋值的元素uart_obj.serial.ops中,主要是对串口使用的一些操作函数进行赋值,包括串口的初始化配置(.configure中对串口波特率,数据位,奇偶校验等进行了初始化)、串口的控制(.control中对串口DMA的配置或者中断的使能)、串口的输入输出、DMA传输等函数,这样做的目的主要是为了在操作系统中底层硬件具体操作与操作系统之上应用函数的分层; 赋值的元素uart_obj.serial.config中即保存着串口的波特率、奇偶校验方式等相关的具体数据。 接着就是rt_hw_serial_register()函数,将相应的串口设备注册到rt-thread系统中,之后的串口,就可以在操作系统层级进行使用。而由于上述过程中,已经将串口的相应的操作函数,串口相关参数等进行了赋值,所以之后操作系统会在内核中,将串口都初始化配置完毕。 5.再看刚才串口相关结构体的赋值元素uart_obj.serial.ops中,有一个.configure的元素,被赋值为stm32_configure()函数,进入该函数。发现,先是对波特率等串口相关参数进行了配置,最后在一个if判断中,执行了HAL_UART_Init()函数,该函数位于stm32f4xx_hal_uart.c文件中,即在该函数中,就与STM32的HAL库挂钩,对STM32的串口进行了真正的初始化,然后之后调用了HAL_UART_MspInit()函数。 6.HAL_UART_MspInit()函数中,即对串口所对应的IO口进行了相应的初始化,该函数位于stm32f4xx_hal_msp.c文件中。 7.所以在对rt-thread中的串口进行初始化时,首先需要在rtconfig.h文件中进行BSP_USING_UART1之类的宏定义,然后需要在stm32f4xx_hal_msp.c文件中的HAL_UART_MspInit()函数中添加相应的IO口初始化,而默认波特率的配置则位于serial.h文件中的RT_SERIAL_CONFIG_DEFAULT宏定义处。如果还想修改控制台输出对应的串口,则需要在rtconfig.h文件中,将RT_CONSOLE_DEVICE_NAME宏定义修改。 关于串口的波特率等在系统以及初始化完成后的设置,可以使用rt-thread提供的API,rt_device_control()函数,对串口设备进行修改配置。 /* 配置串口硬件参数如数据位、校验位、停止位等的示例程序如下: */ #define SAMPLE_UART_NAME "uart2" /* 串口设备名称 */ static rt_device_t serial; /* 串口设备句柄 */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 配置参数 */ /* 查找串口设备 */ serial = rt_device_find(SAMPLE_UART_NAME); /* 以中断接收及轮询发送模式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); config.baud_rate = BAUD_RATE_115200; config.data_bits = DATA_BITS_8; config.stop_bits = STOP_BITS_2; config.parity = PARITY_NONE; /* 打开设备后才可修改串口配置参数 */ rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
537浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 00:12 , Processed in 0.669484 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号