stm32F407 RT-thread V2.0.1 扩展系统串口设备

本文涉及的主控芯片为stm32F407zet6,扩展进行的前提是系统工程移植完成,能够正常运行,串口1/2/3 console工作正常,输出正确。

RTT操作系统默认的系统挂载串口只有三个,分别是串口1,串口2,串口3。但是项目需要的串口需要更多的串口,为了应用,将对系统的串口进行扩展。

首先尝试了直接照抄串口1 2 3的配置,对应电路板实际的资源分配,利用宏配置各个串口的IO,我的宏设置如下
/* UART GPIO define. */
#define UART1_GPIO_TX       GPIO_Pin_9
#define UART1_TX_PIN_SOURCE GPIO_PinSource9
#define UART1_GPIO_RX       GPIO_Pin_10
#define UART1_RX_PIN_SOURCE GPIO_PinSource10
#define UART1_GPIO          GPIOA
#define UART1_GPIO_RCC      RCC_AHB1Periph_GPIOA
#define RCC_APBPeriph_UART1 RCC_APB2Periph_USART1
#define UART1_TX_DMA        DMA1_Channel4
#define UART1_RX_DMA        DMA1_Channel5


#define UART2_GPIO_TX       GPIO_Pin_2
#define UART2_TX_PIN_SOURCE GPIO_PinSource2
#define UART2_GPIO_RX       GPIO_Pin_3
#define UART2_RX_PIN_SOURCE GPIO_PinSource3
#define UART2_GPIO          GPIOA
#define UART2_GPIO_RCC      RCC_AHB1Periph_GPIOA
#define RCC_APBPeriph_UART2 RCC_APB1Periph_USART2
#define UART2_TX_DMA        DMA1_Channel4
#define UART2_RX_DMA        DMA1_Channel5


#define UART3_GPIO_TX       GPIO_Pin_10
#define UART3_TX_PIN_SOURCE GPIO_PinSource10
#define UART3_GPIO_RX       GPIO_Pin_11
#define UART3_RX_PIN_SOURCE GPIO_PinSource11
#define UART3_GPIO          GPIOB
#define UART3_GPIO_RCC      RCC_AHB1Periph_GPIOB
#define RCC_APBPeriph_UART3 RCC_APB1Periph_USART3
#define UART3_TX_DMA        DMA1_Stream3
#define UART3_RX_DMA        DMA1_Stream1




#define UART4_GPIO_TX       GPIO_Pin_0
#define UART4_TX_PIN_SOURCE GPIO_PinSource0
#define UART4_GPIO_RX       GPIO_Pin_1
#define UART4_RX_PIN_SOURCE GPIO_PinSource1
#define UART4_GPIO          GPIOA
#define UART4_GPIO_RCC      RCC_AHB1Periph_GPIOA
#define RCC_APBPeriph_UART4 RCC_APB1Periph_UART4
#define UART4_TX_DMA        DMA1_Stream4
#define UART4_RX_DMA        DMA1_Stream2


#define UART5_GPIO_TX       GPIO_Pin_12
#define UART5_TX_PIN_SOURCE GPIO_PinSource12
#define UART5_GPIO_RX       GPIO_Pin_2
#define UART5_RX_PIN_SOURCE GPIO_PinSource2
#define UART5_TX_GPIO          GPIOC
#define UART5_RX_GPIO          GPIOD
#define UART5_GPIO_TX_RCC      RCC_AHB1Periph_GPIOC
#define UART5_GPIO_RX_RCC      RCC_AHB1Periph_GPIOD
#define RCC_APBPeriph_UART5 RCC_APB1Periph_UART5
#define UART5_TX_DMA        DMA1_Stream7
#define UART5_RX_DMA        DMA1_Stream0

新增一个串口4的设备配置,具体的配置代码在系统的usart.c中,限于篇幅就不贴出来了
将其设置为console串口,引起了hardware fault
仔细检查了配置程序,发现uart4的配置代码有一个地方没有修改完整,修改过来之后不再出现hardware fault ,但是系统运行之后,console打印信息并没有发现有输出。

再检查一遍,发现是串口的线焊错了,纠结了半天。事实证明,套用串口1 2 3 的格式进行串口扩展,是可行的。

继续调试发现:
uart5 作为console在初始化成功之后,程序就直接卡死,无法继续运行;
uart4 作为console的输出可以正常运行,但是一旦有数据进来,系统也会直接卡死;

尝试将uart5和uart4注册为系统设备调用,发现uart4和uart5都可以发送数据,但是一点接收数据,系统同样会卡死。
查阅网上资料,结合看的代码,基本确定这个版本的RTT串口实现方式是通过串口中断实现收发,但是我已经照着uart123的代码将uart4和uart5串口配置好了,不知道为何结束数据的时候还是会卡死。

单步调试发现,接收到数据时,在uart4串口中断程序内设置断点,程序没有进入串口中断。

再次仔细观察,发现copy过来的代码中,usart1 2 3 和uart 4 5 的串口中断入口函数使用了同样的usart开头,而库函数中串口4与串口5中的库函数uart4 和 uart 5 中断入口函数为uart开头。将其修正过来后,不会再出现卡死的情况。

吃了粗心大意的亏,在copy并修改代码的时候,必须要细心的将需要修改的代码一一对应修改,关键的语句稍微有错漏都会导致程序运行异常。不过还好,最终将2个硬件串口都成功挂载到了操作系统中。

小结一下RTT V2.0.1系统 stm32f407下扩展串口4 5的过程:
1、写入对应的宏设定
2、依样画葫芦将系统工作正常的usart1 2 3 的设置代码移植为4 5,注意代码不能有错漏,不然可能会引起hardware fault
3、该版本的系统串口使用的模式是中断收发,但是串口4/5并未编写对应的入口函数,要在usart.c中编写对应的中断入口函数,参照usart1/2/3的中暖函数即可
4、修改board.h中的宏设置,将console挂到uart4、5 上面测试,输出正常则驱动成功(别的版本的设置宏可能在rtconfig.h中)
5、使用时将串口挂载到设备上,就能正常使用串口了,注意console使用的串口不要再挂到设备上使用,会出现冲突

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值