OpenEdv-开源电子网

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

F7串口中断运行无法进入?

[复制链接]

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
发表于 2017-5-17 15:05:51 | 显示全部楼层 |阅读模式
30金钱
最近公司一个项目,使用的核心板是原子哥的F767,自己设计了外部电路,现在在串口通讯是有点问题无法解决。
其中用到几个串口,和定时器,其中串口1是和上位机通讯,串口1的优先级最高,抢占优先级是1,其他串口和定时器都是2和3,串口1需要将ADC采集的数据每100ms一次上传给上位机;同时接收上位机的控制指令。串口1我只打开了接收中断,在接受中断中的唯一操作是将接收到的字节存入到我事先准备好的缓存数组中。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)      
{
if(huart->Instance==USART1)
{
  UART1_RX_BUF[++UART1_ReceiveBuf_Count] = aRxBuffer_UART1[0];   //将接收到的字节存入自己定义的接收缓存数组中
  if(UART1_ReceiveBuf_Count%50==0) LED1_Toggle;
}
每次ADC采集完成(100ms),将采集的值存入到我自己定义的发送缓存数组中,串口1的发送是循环发送,主循环中每次最多发送一个字节,主循环很快。
  if(ADC_Sampling_Enable==0)   //1组采样完成
  {
   Vin1=2.5*ADS1251_Read_middle(ADC_Sample)/0x7fffff;
   ADC_Sampling_Enable=1;    //开启下一组采样
   UART1_DisposalTemp[0]='?';    //头
   UART1_DisposalTemp[1]='1';    //表示主板的信息
   UART1_DisposalTemp[2]='1';    //表示测量的电压
   UART1_DisposalTemp[3]='1';    //对应的档位
      ADC_float_to_ascll(Vin1,UART1_DisposalTemp) ;
    UART1_DisposalTemp[11]='#';
    //printf(urt_disposaltemp);
   for(i=0;i<12;i++)
   {
    UART1_TX_BUF[++UART1_SendBuf_Count]=UART1_DisposalTemp[i];   //ADC采样值存入到自己定义的发送缓存数组中,等待发送
   }
  }


  if(UART1_SendBuf_Count!=UART1_SendBuf_Current)  //main循环中发送串口数据,此处每次最多发一个字节
  {
    HAL_UART_Transmit(&UART1_Handler,(uint8_t*)(&UART1_TX_BUF[++UART1_SendBuf_Current]),1,1000); //发送接收到的数据
   while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);  //等待发送结束
  }

问题如下:
串口1发送没问题,但是接收一段时间后会出现无法接收的现象,程序没有卡死,因为串口还在定时发送,但是就是无法进入串口接收中断。当我串口不发送时(把这句注释掉://UART1_TX_BUF[++UART1_SendBuf_Count]=UART1_DisposalTemp[i]; ),则串口接收就没问题。一开始以为接收中断是不是打开,调试时确认没打开(TXEIE和TCIE都是0);请教,这个可能是什么原因?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-17 21:12:42 | 显示全部楼层
最好别在串口中断里面做串口发送!
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2017-5-18 10:24:22 | 显示全部楼层
正点原子 发表于 2017-5-17 21:12
最好别在串口中断里面做串口发送!

原子哥,我串口发送是放在主程序中循环发送的,我是把串口需要发送的数据事先存入我自己定义的一个数组中,主循环中每次循环最多发送一个字节。串口接收中断中只做了存储,现在主要的问题是主循环中串口发送的时候,运行一段时间后会导致进不了串口接收中断,好像中断被关闭了似的,但是我后面没操作过串口寄存器,仿真的时候发现寄存器值也没变化。
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2017-5-18 22:10:08 | 显示全部楼层
正点原子 发表于 2017-5-17 21:12
最好别在串口中断里面做串口发送!

原子哥,我根据我的意思把你们提供的串口通信例程修改了下(F767),串口1接收中断中只负责接收,而主循环中则是串口循环发送,每个循环最多发送一个字节。发现如果主循环中不发送,则串口接收正常,接收速度很快。但是当我主循环里循环发送时,串口接收中断运行一段时间后就无法进入中断,但是程序没死,照样在发送。能麻烦帮看下吗,按理说串口中断也没关,其他中断也没打开。
下面是主循环程序:
[mw_shl_code=c,true]int main(void)
{
    u8 len,i;       
          u32 times=0;
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();                                        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
    delay_init(216);                //延时初始化
          uart_init(115200);                        //串口初始化
    LED_Init();                     //初始化LED
    while(1)
    {
                        times++;
                        if(times>0x2fffff)
                        {
                                times=0;
                                for(i=0;i<12;i++)
                                {
                                        /***************加上这一句,串口接收就有问题*****************/
                                        UART1_TX_BUF[++UART1_SendBuf_Count]='0'+i;    //如果有发送的时候会导致运行无法进入串口接收中断?????
                                  /***************加上这一句,串口接收就有问题*****************/
                                }
                                LED0_Toggle;
                        }               
                        if(UART1_SendBuf_Count!=UART1_SendBuf_Current)  //main循环中发送串口数据,此处每次最多发一个字节
                        {
                                HAL_UART_Transmit(&UART1_Handler,(uint8_t*)(&UART1_TX_BUF[++UART1_SendBuf_Current]),1,1000);        //发送接收到的数据
                                while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);                //等待发送结束
                        }                         
          }
}
[/mw_shl_code]


下面是串口中断:
[mw_shl_code=c,true]void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance==USART1)//如果是串口1
        {
                UART1_RX_BUF[++UART1_ReceiveBuf_Count] = aRxBuffer_UART1[0]; //串口接收中断中只负责接收
                if(UART1_ReceiveBuf_Count%50==0) LED1_Toggle;
        }
}[/mw_shl_code]
麻烦百忙中帮看下,现在这个项目用的这块核心板,其中好几个串口通讯,都有这个问题。

35.jpg

实验3 串口通信实验_1.rar

8.3 MB, 下载次数: 132

串口实验_串口发送和串口接收

回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2017-5-18 22:12:06 | 显示全部楼层
原子哥要是手上有开发板,可否帮我试下,万分感谢。
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2017-5-18 23:39:18 | 显示全部楼层
正点原子 发表于 2017-5-17 21:12
最好别在串口中断里面做串口发送!

原子哥,我程序中监视了串口寄存器中接收中断使能位,CR1的bit5------RXNEIE;
if((USART1->CR1&0x20)==0)   LED0_Toggle;
发现接收一段时间后RXNEIE自动清0了,好奇怪,但是手册上说该位只能被软件修改。

串口接收中断使能位

串口接收中断使能位
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-22 01:26:56 | 显示全部楼层
善良的二哥 发表于 2017-5-18 23:39
原子哥,我程序中监视了串口寄存器中接收中断使能位,CR1的bit5------RXNEIE;
if((USART1- ...

这个确实是不应该被修改的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-22 01:29:53 | 显示全部楼层
善良的二哥 发表于 2017-5-18 22:10
原子哥,我根据我的意思把你们提供的串口通信例程修改了下(F767),串口1接收中断中只负责接收,而主循 ...

我们的 串口通信实验,正常条件下,也没遇到过这种问题。
你能否直接修改,测试下我们的例程,是否也有这个问题?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2017-5-22 09:15:44 | 显示全部楼层
本帖最后由 善良的二哥 于 2017-5-22 09:51 编辑
正点原子 发表于 2017-5-22 01:29
我们的 串口通信实验,正常条件下,也没遇到过这种问题。
你能否直接修改,测试下我们的例程,是否也有 ...

原子哥,我是在你们例程上稍作修改的,思路和你们例程应该是差不多的,程序我发出来了,可否帮试下。因为我这边在开发板上试了会存在这种问题。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-22 21:18:10 | 显示全部楼层
善良的二哥 发表于 2017-5-22 09:15
原子哥,我是在你们例程上稍作修改的,思路和你们例程应该是差不多的,程序我发出来了,可否帮试下。因为 ...

我习惯用寄存器。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-22 21:18:33 | 显示全部楼层
善良的二哥 发表于 2017-5-22 09:15
原子哥,我是在你们例程上稍作修改的,思路和你们例程应该是差不多的,程序我发出来了,可否帮试下。因为 ...

你说下你的一个简单测试方法,我按你的方法来写代码。
最简单可以复现这个bug的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2017-5-23 15:49:06 | 显示全部楼层
正点原子 发表于 2017-5-22 21:18
你说下你的一个简单测试方法,我按你的方法来写代码。
最简单可以复现这个bug的

原子哥,测试方法如下:
串口接收完成中断中将接收到的字节存入到自己定义的接收数组中,一旦接收到的字节总数是50的倍数,则LED取反一下(用来显示是否有进入中断);主程序中串口不停的发送字节(固定的就行)。另外可以在主程序中不停的检查RXNEIE,看看是否有被清0。
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2017-5-26 10:32:59 | 显示全部楼层
正点原子 发表于 2017-5-22 21:18
你说下你的一个简单测试方法,我按你的方法来写代码。
最简单可以复现这个bug的

原子哥,麻烦抽空帮试下哈;最近测试还烧了一块核心板,难受
烧毁.jpg
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-30 18:34:46 | 显示全部楼层
善良的二哥 发表于 2017-5-23 15:49
原子哥,测试方法如下:
串口接收完成中断中将接收到的字节存入到自己定义的接收数组中,一旦接收到的字 ...

测试了,没问题。
我在寄存器版本,串口通信实验基础上修改的,将接收buf改为100KB大小。
然后每接收50个字节,就控制LED1取反。

测试结果如下:
无标题.png

源码: 实验3 串口通信实验-大量数据接收测试.rar (146.83 KB, 下载次数: 264)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-30 18:35:22 | 显示全部楼层
正点原子 发表于 2017-5-30 18:34
测试了,没问题。
我在寄存器版本,串口通信实验基础上修改的,将接收buf改为100KB大小。
然后每接收50 ...

测试了大概一个小时,接收了76*100K数据,没有死机,正常执行。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2017-6-1 09:39:08 | 显示全部楼层
正点原子 发表于 2017-5-30 18:35
测试了大概一个小时,接收了76*100K数据,没有死机,正常执行。

原子哥,多谢你的写的例程,我试了也没有问题。但是我现在用库函数的话就会出现无法进入接收中断的现象,我写的例程在4楼,这个一边发送,一边接收,一会接收中断就进不去了,我也是在F7开发板上测试的,我发现是USART1->CR1的RXNEIE被清零了,如6楼所说。
原子哥,可否麻烦你帮我用我四楼的程序测试下,一会中断就死了,不甚感激。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 21:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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