USART _ 两串口同时使用,冲突问题

1、使用外设情况:

              1、初始化了两个串口 :串口1以及串口2,使用串口2DMA发送数据,接收中断 接收数据;

                                                          使用串口1发送函数发送数据,接收中断接收数据;

2、问题出现的形式: 

                                         在串口2的中断接收函数中,使用串口1发送函数发送数据;

                                        串口1发送的数据能在串口接收到,但是在任务中,使用串口2DMA发送的数据在串口2上接收不到;

3、解决方法探索 :

                                  第一步探索: 把串口1发送函数放在任务中,两个串口上的数据都接收的到;             

                                                            一旦把串口1发送函数放在 串口2接收中断函数中,串口2DMA发送数据就收不到。     

   

                              第二步探索: 把串口1发送函数放在任务中,两个串口上的数据都接收的到;             

                                                            一旦把串口1发送函数放在 串口2接收中断函数中,串口2DMA发送数据就收不到。     

                                  

在STM32芯片中,USART和TIM模块都使用了GPIO引脚,但是它们可以同时使用,因为它们使用不同的引脚。因此,你可以使用USART1的串口通信功能,同时使用TIM1的CH1和CH4通道。 但是,要注意GPIO引脚的复用功能。有些引脚可以同时用于USART和TIM模块,但有些则不能。因此,在使用时,你需要仔细查看芯片的数据手册,以确定引脚是否支持复用功能。 另外,要注意USART和TIM模块的中断向量表和优先级设置。如果同时使用它们,你需要在代码中正确地配置它们的中断向量表和优先级,以避免冲突或优先级错误。 以下是一个示例代码,用于同时使用USART1的串口通信功能和TIM1的CH1和CH4通道: ``` #include <stm32f1xx.h> void USART1_IRQHandler(void) { // 处理USART1的中断 } void TIM1_IRQHandler(void) { // 处理TIM1的中断 } int main(void) { // 使能USART1和TIM1的时钟 RCC->APB2ENR |= RCC_APB2ENR_USART1EN | RCC_APB2ENR_TIM1EN; // 配置USART1的GPIO引脚 GPIOA->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_CNF9_1; // TX引脚 GPIOA->CRH |= GPIO_CRH_CNF10_0; // RX引脚 // 配置TIM1的GPIO引脚 GPIOA->CRH |= GPIO_CRH_MODE8_0 | GPIO_CRH_CNF8_1; // CH1引脚 GPIOA->CRH |= GPIO_CRH_MODE11_0 | GPIO_CRH_CNF11_1; // CH4引脚 // 配置USART1的串口通信参数 USART1->BRR = 0x1A0; // 波特率为9600 USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE; // 使能发送、接收和接收中断 // 配置TIM1的计数器和通道 TIM1->PSC = 36000 - 1; // 预分频器为36000 TIM1->ARR = 1000 - 1; // 自动重载寄存器为1000 TIM1->CCR1 = 500; // CH1的占空比为50% TIM1->CCR4 = 250; // CH4的占空比为25% TIM1->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // CH1设置为PWM模式 TIM1->CCMR2 |= TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; // CH4设置为PWM模式 TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC4E; // 使能CH1和CH4 TIM1->CR1 |= TIM_CR1_CEN; // 启动计数器 // 配置USART1和TIM1的中断向量表和优先级 NVIC_SetPriority(USART1_IRQn, 0); NVIC_EnableIRQ(USART1_IRQn); NVIC_SetPriority(TIM1_IRQn, 1); NVIC_EnableIRQ(TIM1_IRQn); while (1) { // 主循环 } } ``` 在这个示例中,我们同时使用USART1和TIM1模块,并正确地配置了它们的GPIO引脚、串口通信和PWM输出。同时,我们也配置了它们的中断向量表和优先级,以确保它们能够正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值