OpenEdv-开源电子网

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

USART3接收数据的时候不能进入中断

[复制链接]

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
发表于 2018-7-31 20:30:19 | 显示全部楼层 |阅读模式
1金钱
在使用USART3的时候,程序无法进入中断函数,由于工作的保密需要不方便贴代码,拜托大家集思广益,想到什么可能一起讨论下。

最佳答案

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

整个事情是这样的,我在单位解决GPS数据收发并解析这部分问题,通过串口3接收,这两天调试发现无论如何都不能正常运行,怎么改程序都不好使。 最后找到的原因是:由于我所在的单位还在用比较老的keil4开发32,而我一直用keil5,到这发现keil5并不能完全兼容keil4工程,也就没再用,最近发现32的工程在keil4环境下回出现一堆问题,接着打了keil5向keil4兼容的包。完美解决这个问题。。 真的是浪费了两天时间,谢谢大家的帮助!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-7-31 20:30:20 | 显示全部楼层
整个事情是这样的,我在单位解决GPS数据收发并解析这部分问题,通过串口3接收,这两天调试发现无论如何都不能正常运行,怎么改程序都不好使。
最后找到的原因是:由于我所在的单位还在用比较老的keil4开发32,而我一直用keil5,到这发现keil5并不能完全兼容keil4工程,也就没再用,最近发现32的工程在keil4环境下回出现一堆问题,接着打了keil5向keil4兼容的包。完美解决这个问题。。
真的是浪费了两天时间,谢谢大家的帮助!
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-7-31 20:36:44 | 显示全部楼层
目前情况是,配置了GPIOB10/11,使能了端口复用,设置了USART3的相关模式,配置了中断优先级,在接收数据的程序上也注意清除标志位的问题了,现在单步调试仍然不能进入中断
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-7-31 20:42:27 | 显示全部楼层
选了一部分配置代码,
void USART3_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;


    /* config USART3 clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
       
    /* USART3 GPIO config */
    /* Configure USART3 Tx (PB.10) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Configure USART3 Rx (PB.11) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* USART3 mode config */
    USART_InitStructure.USART_BaudRate =9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART3, &USART_InitStructure);

    /*        配置中断优先级 */

NVIC_InitTypeDef NVIC_InitStructure;
//        /* Configure the NVIC Preemption Priority Bits */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//        /* Enable the USART3 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);


    /* 使能串口3接收中断 */
    USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
    USART_Cmd(USART3, DISABLE);
    USART_ClearFlag(USART3, USART_FLAG_TC);
}

由于用到的串口比较多,用到USART3的时候我就手动使能USART_Cmd和USART_ITConfig了
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-7-31 20:43:49 | 显示全部楼层
NVIC_InitTypeDef NVIC_InitStructure;
这行代码应该是在这个函数首部的,粘贴问题粘错了
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-7-31 20:44:14 | 显示全部楼层
无聊的朋友可以一起讨论下
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-7-31
在线时间
1 小时
发表于 2018-7-31 21:16:37 | 显示全部楼层
USART_Cmd(USART3, DISABLE);   应该是 ENABLE
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-7-31
在线时间
1 小时
发表于 2018-7-31 21:17:15 | 显示全部楼层
SART_ITConfig(USART3, USART_IT_RXNE, DISABLE); 也应该是ENABLE
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
发表于 2018-8-1 00:01:53 | 显示全部楼层
USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
USART_Cmd(USART3, DISABLE);
两个都应该是使能的哦
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-8-1 08:35:45 | 显示全部楼层
Koowana 发表于 2018-7-31 21:16
USART_Cmd(USART3, DISABLE);   应该是 ENABLE

这个在我最后程序的最后一行已经说明了,在我需要用到USART3的时候我就手动使能这两个了
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-8-1 08:37:15 | 显示全部楼层
大力水手PP 发表于 2018-8-1 00:01
USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
USART_Cmd(USART3, DISABLE);
两个都应该是使能的哦

恩恩,这个我知道,由于用到了三个串口,偶尔发生数据混乱的情况,所以初始化的时候关闭了使能,当我需要用到USART3的时候,这两个使能我会手动开启的
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-8-1 08:44:44 | 显示全部楼层
不知道起什么 发表于 2018-8-1 08:37
恩恩,这个我知道,由于用到了三个串口,偶尔发生数据混乱的情况,所以初始化的时候关闭了使能,当我需要 ...

那你用串口3的时候屏蔽其他两个串口试试
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-8-1 08:57:39 | 显示全部楼层
qiuzhicheng 发表于 2018-8-1 08:44
那你用串口3的时候屏蔽其他两个串口试试

刚才尝试了一下,串口1暂时没用到,DISABLE以后没有影响,printf函数被重定向到串口2显示了,DISABLE以后不仅没法看printf,并且也不知道串口3的数据有没有收到。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-8-1 09:05:18 | 显示全部楼层
不知道起什么 发表于 2018-8-1 08:57
刚才尝试了一下,串口1暂时没用到,DISABLE以后没有影响,printf函数被重定向到串口2显示了,DISABLE以后 ...

你屏蔽串口1和2,跟串口3没有关系啊
printf函数你用在串口2就只能串口2使用
试试这个函数,每个串口都能用
void USART_Printf(USART_TypeDef * USARTx,u8 *String)
{
  while((*String) != '\0')
  {
    USART_SendData(USARTx,*String);
    String++;
  }
}
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
发表于 2018-8-1 12:19:02 | 显示全部楼层
问一下,你是怎么判断它没有进入中断的?
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
发表于 2018-8-1 13:14:30 | 显示全部楼层
不知道起什么 发表于 2018-8-1 08:37
恩恩,这个我知道,由于用到了三个串口,偶尔发生数据混乱的情况,所以初始化的时候关闭了使能,当我需要 ...

嗯嗯,不好意思,之前没有注意到
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-8-1 13:25:42 | 显示全部楼层
把中断优先级设置最高看看
没有脑袋
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-8-1 13:31:18 | 显示全部楼层
大力水手PP 发表于 2018-8-1 12:19
问一下,你是怎么判断它没有进入中断的?

中断里有个标志位,主程序里判断标志位数值,没有变
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-8-1 13:40:51 | 显示全部楼层
美丽的时光机器 发表于 2018-8-1 13:25
把中断优先级设置最高看看

已经设置到最高了~
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-8-1 14:09:03 | 显示全部楼层
PB10和PB11除了作为USART3的复用外还有什么外设也是这两个口的复用吗?有没有冲突呢?可以试试使用重映射功能把USART3的功能重映射到PD8和PD9试试
没有脑袋
回复

使用道具 举报

7

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2018-7-19
在线时间
126 小时
发表于 2018-8-1 15:01:01 | 显示全部楼层
本帖最后由 坐看风 于 2018-8-1 15:10 编辑

既然你串口1 2 能成功   3不能成功   就单独写个程序测试一下  仿真单步调试
需要注意的  硬件上端口有没有问题,复用管脚有没有设置好  而且我看了一下你虽然开启了AFIO时钟,但是你好像没有重映射端口
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-3-2
在线时间
3 小时
发表于 2018-8-1 15:17:00 | 显示全部楼层
能不能发送数据呢?不能的话把
USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
USART_Cmd(USART3, DISABLE);
顺序换一下
使能的时候注意一下顺序
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-8-1 17:34:13 | 显示全部楼层
坐看风 发表于 2018-8-1 15:01
既然你串口1 2 能成功   3不能成功   就单独写个程序测试一下  仿真单步调试
需要注意的  硬件上端口有没 ...

已经成功解决这个问题了,解决方法最底楼!
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
 楼主| 发表于 2018-8-1 17:35:37 | 显示全部楼层
天下雨薇 发表于 2018-8-1 15:17
能不能发送数据呢?不能的话把
USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
USART_Cmd(USART3, DIS ...

已经成功解决这个问题了,解决方法最底楼!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 03:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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