OpenEdv-开源电子网

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

STM32F051串口接收中断问题,进入不了中断

[复制链接]

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
发表于 2018-4-16 08:43:51 | 显示全部楼层 |阅读模式
10金钱
网上下的F0例程,在中断打断点,点全速运行会停在断点一次,继续点全速运行再发送数据,进入不了中断函数;代码如下
/************************************************
函数名称 : RCC_Configuration
功    能 : 时钟配置
参    数 : 无
返 回 值 : 无
*************************************************/

void RCC_Configuration(void)
{
  /* 使能AHB时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
                        RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);

  /* 使能APB2时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  /* 使能APB1时钟 */
}


/************************************************
函数名称 : NVIC_Configuration
功    能 : NVIC配置
参    数 : 无
返 回 值 : 无
*************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* 外设中断 */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                  //IRQ通道:串口1
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;                    //优先级 :1级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                    //使能IRQ通道
  NVIC_Init(&NVIC_InitStructure);
}



/************************************************
函数名称 : USART_GPIO_Configuration
功    能 : USART所使用管脚输出输入定义
参    数 : 无
返 回 值 : 无
*************************************************/
void USART_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

  /* 定义USART TX_RX 引脚为复用输出 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;            //引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                       //复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //高速
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                     //推完输出
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                       //上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/************************************************
函数名称 : USART_Configuration
功    能 : 配置USART
参    数 : 无
返 回 值 : 无
*************************************************/
void USART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;

  /******************************************************************
  USART参数初始化:  波特率     传输位数   停止位数  校验位数
                    115200         8         1        0(NO)
  *******************************************************************/
  USART_InitStructure.USART_BaudRate = 115200;                       //设定传输速率
  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(USART1, &USART_InitStructure);                          //初始化USART1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                     //使能USART1接收中断

  USART_Cmd(USART1, ENABLE);                                         //使能USART1
}

/************************************************
函数名称 : USART_Initializes
功    能 : 串口初始化
参    数 : 无
返 回 值 : 无
*************************************************/
void USART_Initializes(void)
{
  RCC_Configuration();
  NVIC_Configuration();
  USART_GPIO_Configuration();
  USART_Configuration();
}


/************************************************
函数名称 : USART1_IRQHandler
功    能 : USART1中断
参    数 : 无
返 回 值 : 无
*************************************************/
void USART1_IRQHandler(void)
{
  if((USART1->ISR & USART_FLAG_RXNE) == USART_FLAG_RXNE)
  {
    USART1_SendByte((uint8_t)(USART1->RDR));     //发送接收到的字符数据
  }
}



最佳答案

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

我用的是f030这个配置可以,有一个问题,如果输入ASC,输两位的时候会溢出,再也进不去中断,没解决,如果输入hex的话没问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 08:43:52 | 显示全部楼层
我用的是f030这个配置可以,有一个问题,如果输入ASC,输两位的时候会溢出,再也进不去中断,没解决,如果输入hex的话没问题

STM32F0xx_USART收发配置详细过程.rar

1.67 MB, 下载次数: 199

回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 08:48:57 | 显示全部楼层
你用USART_GetITStatus (USART2, USART_IT_RXNE )!=RESET来试试是否接收到数据
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 09:04:30 | 显示全部楼层
利弊 发表于 2018-4-16 08:48
你用USART_GetITStatus (USART2, USART_IT_RXNE )!=RESET来试试是否接收到数据

中断里换了这句以后一直进入中断,但是也没有收到数据
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 09:19:16 | 显示全部楼层
能正常发送,但接收不了
回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 09:21:38 | 显示全部楼层
那就是你接收到数据后,没有及时把接受的数据提取出USART1->RDR导致USART1->RDR一直有数据,所以不停地进入中断
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 09:32:38 | 显示全部楼层
利弊 发表于 2018-4-16 09:21
那就是你接收到数据后,没有及时把接受的数据提取出USART1->RDR导致USART1->RDR一直有数据,所以不停地进入中 ...

那为什么是USART2呢?
回复

使用道具 举报

3

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2017-5-4
在线时间
21 小时
发表于 2018-4-16 09:35:16 | 显示全部楼层
中断函数里面没有清除中断标志位,所以第二次不会进中断
回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 09:37:02 | 显示全部楼层
qq455738812 发表于 2018-4-16 09:32
那为什么是USART2呢?

我的意思你每次收到数据后,先把USART1->RDR读取到一个串口接受缓存数组中,发送时再发送这个数组
回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 09:37:42 | 显示全部楼层
qq455738812 发表于 2018-4-16 09:32
那为什么是USART2呢?

我的意思你每次收到数据后,先把USART1->RDR读取到一个串口接受缓存数组中,发送时再发送这个数组
回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 09:38:30 | 显示全部楼层
qq455738812 发表于 2018-4-16 09:32
那为什么是USART2呢?

那是我在我程序中复制过来的
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 10:06:46 | 显示全部楼层
利弊 发表于 2018-4-16 09:38
那是我在我程序中复制过来的

根据你的意思,我把中断函数改成了这样,但是还是一样程序在开始运行时进入一次中断,之后一直都不进入中断。

void USART1_IRQHandler(void)
{
    if(USART_GetITStatues(USART1,USART_IT_RXNE) == SET)
    {
         RecvBuf[RecvCount]=(uint8_t)(USART->RDR);
         RecvCount++;
         RecvFlag=1;
    }
    USART_ClearFlag(USART1,USART_IT_RXNE);
}
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 10:07:06 | 显示全部楼层
mill 发表于 2018-4-16 09:35
中断函数里面没有清除中断标志位,所以第二次不会进中断

void USART1_IRQHandler(void)
{
    if(USART_GetITStatues(USART1,USART_IT_RXNE) == SET)
    {
         RecvBuf[RecvCount]=(uint8_t)(USART->RDR);
         RecvCount++;
         RecvFlag=1;
    }
    USART_ClearFlag(USART1,USART_IT_RXNE);
}
回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 10:23:20 | 显示全部楼层
本帖最后由 利弊 于 2018-4-16 10:30 编辑

改成!=reset    我之前用的跟你一样,改成!=reset后好了   你试下,你不是使用了一个接受标志位,在main中检测,只要标志位置位,把缓存数组中的数给发送数据寄存器,还有一个问题,发送和接受不能同时进行,你要不要接受完成后开发送关接受,发送完成后开接受,关发送,反正我是这么干的,目前没有什么问题
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 10:31:32 | 显示全部楼层
利弊 发表于 2018-4-16 10:23
改成!=reset    我之前用的跟你一样,改成!=reset后好了   你试下,你不是使用了一个接受标志位,在main中检测 ...

这两句话不是一样的吗?改了之后还是一样的情况
回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 10:33:39 | 显示全部楼层
本帖最后由 利弊 于 2018-4-16 10:35 编辑

把你程序整个发过来,我调调,再说我用的030,跟051没什么区别,还有reset=0    !reset可以是任何大于0的数,==set只有1的时候才执行
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 10:34:09 | 显示全部楼层
利弊 发表于 2018-4-16 10:23
改成!=reset    我之前用的跟你一样,改成!=reset后好了   你试下,你不是使用了一个接受标志位,在main中检测 ...

我试下关发送开接收
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 10:44:14 | 显示全部楼层
利弊 发表于 2018-4-16 10:33
把你程序整个发过来,我调调,再说我用的030,跟051没什么区别,还有reset=0    !reset可以是任何大于0的数,==s ...

我这边不能发程序,我把我下回来的例程发一下吧,按理说网上的例程应该直接就没问题的
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 10:45:13 | 显示全部楼层
串口例程

STM32F0xx_USART收发配置详细过程.zip

438.39 KB, 下载次数: 170

回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 11:21:00 | 显示全部楼层
例程可以,这就尴尬了
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 11:23:37 | 显示全部楼层
利弊 发表于 2018-4-16 11:21
例程可以,这就尴尬了

这就十分尴尬
回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 11:46:40 | 显示全部楼层
我调好了,看看你的HSE时钟是不是跟板子对应,默认的是8M
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-8-2
在线时间
36 小时
 楼主| 发表于 2018-4-16 13:11:46 | 显示全部楼层
利弊 发表于 2018-4-16 11:46
我调好了,看看你的HSE时钟是不是跟板子对应,默认的是8M

发送是正常的,是时钟问题吗、?
回复

使用道具 举报

3

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-9-1
在线时间
53 小时
发表于 2018-4-16 13:14:44 | 显示全部楼层
我加你qq了,就是你用名?
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6545
金钱
6545
注册时间
2018-6-27
在线时间
551 小时
发表于 2018-12-2 11:28:04 | 显示全部楼层
学习学习,学习学习。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 08:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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