OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2606|回复: 17

求助,为什么串口接收中断进不去?

[复制链接]

7

主题

23

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-8
在线时间
9 小时
发表于 2019-7-19 14:59:20 | 显示全部楼层 |阅读模式
6金钱
本帖最后由 Cuifamily111 于 2019-7-19 15:20 编辑

UART1的串口接收中断先被触发,之后在其中断服务函数 void USART1_IRQHandler(void)中,通过外部中断触发一个从设备的中断,待从设备处理完成数据以后向UART3使用USART_SendData输出数据,从而触发UART3的接收中断。
并且有保证UART3的中断抢占优先级为1,UART1中断的抢占优先级为3。
按道理说应该在UART1的中断服务函数处理过程中跳转到UART3的中断服务函数。但是这并没有发生。
关键代码如下:
//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX   GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA.10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //USART3_TX   GPIOB.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10
   
  //USART3_RX   GPIOB.11初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入



  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  
//Usart2 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//Usart3 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11

  USART_Init(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1
  USART_Init(USART2, &USART_InitStructure); //初始化串口2
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART2, ENABLE);                    //使能串口2
  USART_Init(USART3, &USART_InitStructure); //初始化串口3
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART3, ENABLE);                    //使能串口3

两个串口的中断服务函数里面都使用了USART_ReceiveData读取了读到的数据,应该都会将中断标志位RXNE清零。个人认为这里应该没什么问题。

最佳答案

查看完整内容[请看2#楼]

楼主用错了时钟吧,APB2是高速时钟,APB1是低速时钟 APB2负责AD,I/O,串口1,高级定时器TIM APB1负责DA,串口2,3,4,5,普通定时器TIM, USB , IIC , CAN
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-7-19 14:59:21 | 显示全部楼层
楼主用错了时钟吧,APB2是高速时钟,APB1是低速时钟
APB2负责AD,I/O,串口1,高级定时器TIM
APB1负责DA,串口2,3,4,5,普通定时器TIM, USB , IIC  , CAN
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-19
在线时间
4 小时
发表于 2019-7-19 15:25:44 | 显示全部楼层
PB11没有Init?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-19
在线时间
4 小时
发表于 2019-7-19 15:27:42 | 显示全部楼层

不好意思,Init了。。  时钟呢开了吗?
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-8
在线时间
9 小时
 楼主| 发表于 2019-7-19 15:34:31 | 显示全部楼层
本帖最后由 Cuifamily111 于 2019-7-19 15:36 编辑
mumutant 发表于 2019-7-19 15:27
不好意思,Init了。。  时钟呢开了吗?

我粘代码的时候漏了初始化的一行,已经改正。实际上是有初始化的。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB1Periph_USART2|RCC_APB1Periph_USART3|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);        
        //使能USART1,USART2,USART3,GPIOA,GPIOB时钟
时钟都开了,这里USART1用的是GPIOA,USART3用的是GPIOB
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-8
在线时间
9 小时
 楼主| 发表于 2019-7-19 15:36:52 | 显示全部楼层
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11 粘代码的时候漏了GPIOB.11初始化的一行
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-19
在线时间
4 小时
发表于 2019-7-19 15:40:54 | 显示全部楼层
Cuifamily111 发表于 2019-7-19 15:34
我粘代码的时候漏了初始化的一行,已经改正。实际上是有初始化的。

RCC_APB2PeriphClockCmd(RCC_APB2P ...

你是在uart1中断的过程中触发了一个外部中断,在外部中断中去用uart3发送吗?
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-8
在线时间
9 小时
 楼主| 发表于 2019-7-19 15:46:09 | 显示全部楼层
mumutant 发表于 2019-7-19 15:40
你是在uart1中断的过程中触发了一个外部中断,在外部中断中去用uart3发送吗?

在外部中断中,使用外部从设备的某个UART接口,发送数据到主设备的UART3上
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-19
在线时间
4 小时
发表于 2019-7-19 15:58:25 | 显示全部楼层
Cuifamily111 发表于 2019-7-19 15:46
在外部中断中,使用外部从设备的某个UART接口,发送数据到主设备的UART3上

会不会是你外部中断的优先级没有USART1的优先级高?
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-8
在线时间
9 小时
 楼主| 发表于 2019-7-19 16:22:25 | 显示全部楼层
mumutant 发表于 2019-7-19 15:58
会不会是你外部中断的优先级没有USART1的优先级高?

我是在另一个此设备里面触发的它的外部中断,应该没什么关系吧?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-19
在线时间
4 小时
发表于 2019-7-19 16:36:06 | 显示全部楼层
Cuifamily111 发表于 2019-7-19 16:22
我是在另一个此设备里面触发的它的外部中断,应该没什么关系吧?

哦哦 是不是usart1 发送数据触发了另一个设备的外部中断,然后让他往usart3发送数据?结果usart3的中断没有打断usart1的中断?
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-8
在线时间
9 小时
 楼主| 发表于 2019-7-19 16:40:01 | 显示全部楼层
mumutant 发表于 2019-7-19 16:36
哦哦 是不是usart1 发送数据触发了另一个设备的外部中断,然后让他往usart3发送数据?结果usart3的中断没 ...

完全正确
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-19
在线时间
4 小时
发表于 2019-7-19 16:52:11 | 显示全部楼层

你先试一下 usart3的中断有没有进入,如果进入了的话,可能是因为串口数据传输的速率相比芯片的处理速度太慢,所以等usart1的中断处理完了,usart3的rxne标志位还没被置位
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-8
在线时间
9 小时
 楼主| 发表于 2019-7-19 16:55:16 | 显示全部楼层
mumutant 发表于 2019-7-19 16:52
你先试一下 usart3的中断有没有进入,如果进入了的话,可能是因为串口数据传输的速率相比芯片的处理速度 ...

我之前试验的是进入中断了。
另外,我在usart1的中断服务函数内部,在触发外部设备中断以后,delay了1000ms。应该不存在你说的这个问题吧?
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-8
在线时间
9 小时
 楼主| 发表于 2019-7-19 17:32:06 | 显示全部楼层
顶,真的一头雾水。我把uart3和uart2交换了一下还是不行。
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-8
在线时间
9 小时
 楼主| 发表于 2019-7-19 17:53:55 | 显示全部楼层
Cuifamily111 发表于 2019-7-19 15:34
我粘代码的时候漏了初始化的一行,已经改正。实际上是有初始化的。

RCC_APB2PeriphClockCmd(RCC_APB2P ...

就是这里时钟使能有错误,用错了库函数,没注意到还有RCC_APB2PeriphClockCmd()和RCC_APB1PeriphClockCmd()的区别
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-7-20 02:01:46 | 显示全部楼层
参考我们例程
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2018-11-20
在线时间
62 小时
发表于 2019-7-20 08:39:01 | 显示全部楼层
有没有怀疑过硬件问题,用原子哥的例程能否实现呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 06:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表