OpenEdv-开源电子网

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

我没有向串口发送数据,为什么它可以进入串口接收中断?

[复制链接]

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
发表于 2014-3-14 11:16:38 | 显示全部楼层 |阅读模式
我用串口4做实验,没有向串口发送数据,但JTAG调试它总能进入串口接收中断函数,不知道为什么?
下面是硬件图:


模仿原子哥串口实验,程序初始化的配置为如下:
//pclk1CLK1时钟频率(Mhz) ,通常为36Mhz
//bound:波特率
void uart4_init(u32 pclk1,u32 bound)
{   
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<4;   //使能PORTC口时钟 ,收发引脚PC10,PC11需要使用,收发控制PC9需要使用 
 RCC->APB1ENR|=1<<19;  //使能串口4时钟
 GPIOC->CRH&=0XFFFF000F;//IO状态设置,PC11做上下拉输入模式,PC10推挽复用输出,PC9复用输出
 GPIOC->CRH|=0X00008B30;//IO状态设置   
   
 RCC->APB1RSTR|=1<<19;   //复位串口4
 RCC->APB1RSTR&=~(1<<19);//停止复位       
 //波特率设置
  UART4->BRR=mantissa; // 波特率设置 
 UART4->CR1|=0X200C;  //1位停止,无校验位.
 //使能接收中断
 UART4->CR1|=1<<8;    //PE中断使能
 UART4->CR1|=1<<5;    //接收缓冲区非空中断使能      
 MY_NVIC_Init(2,0,UART4_IRQChannel,2);//抢占优先级2,响应优先级0,组2
   //串口4结构体变量初始化
 Uart4.m_ReceiveBytes=0;
    Uart4.m_SendBytes=0;
    Uart4.g_RecTimeOutFlag=0;
    Uart4.ComInterruptFlag=0;
    Uart4.g_TimeCounter=0;
    Uart4.p_RecBuff=(u8 *)Uart4.RecBuff;
    Uart4.p_SendBuff=(u8 *)Uart4.SendBuff;
 //初始化控制485处于接收模式
 UART4_RXMode;
}
初始化置串口4为接收模式,每次发送之前置为发送模式,发完一串数后置为接收模式,但是我没有向串口4发送任何数的,它总能进入串口接收中断,不知道配置那里是否有问题?
其中宏定义为
#define EN485_UART4  Cout(9)// 串口4收发模式控制引脚为PC9
#define UART4_TXMode   EN485_UART4=1//串口4置为发送模式
#define UART4_RXMode EN485_UART4=0 //串口4置为接收模式


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

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-14 14:09:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-14 15:30:09 | 显示全部楼层
回复【楼主位】zhp:
---------------------------------
是只进入一次吧?
看看是不是信号干扰,切换以后,延时一段时间,清除接收中断,然后再开启接收中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-14 15:52:20 | 显示全部楼层
回复【3楼】正点原子:
回复【楼主位】zhp: --------------------------------- 是只进入一次吧? 看看是不是信号干扰,切换以后,延时一段时间,清除接收中断,然后再开启接收中断。
---------------------------------
原子哥你好,程序一直进入中断啊



1111.gif
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-14 16:21:01 | 显示全部楼层
回复【3楼】正点原子:
回复【楼主位】zhp: --------------------------------- 是只进入一次吧? 看看是不是信号干扰,切换以后,延时一段时间,清除接收中断,然后再开启接收中断。
---------------------------------
我电路板这里,接收引脚PC11不小心与VC3.3V平行,是不是这里有干扰?我这个又不是高速板,串口的速率不快,就9600波特率,应该不会有影响吧?



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-14 23:07:45 | 显示全部楼层
回复【5楼】zhp:
---------------------------------
应该不是电路问题。
一直进入中断,你没法送数据也会一直进入中断么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-15 14:47:27 | 显示全部楼层
回复【6楼】正点原子:

回复【5楼】zhp:
---------------------------------
应该不是电路问题。
一直进入中断,你没法送数据也会一直进入中断么?

---------------------------------
对啊,原子哥,我没有发送数据它也进入接受中断 ,当我发送我协议定义的数据时它能正确解析并显示,只是我没发数据时它也老进入接受中断,我用JTAG调试是发现,接受数组很乱,有时接受数组刚好是我发送的数组的某些字节,有时就没有规律了,很是奇怪
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-15 23:21:43 | 显示全部楼层
直接不用485试试吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-16 11:39:15 | 显示全部楼层
回复【8楼】正点原子:

直接不用485试试吧。

---------------------------------
好的,我试好了结果告诉原子哥
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-17 11:37:55 | 显示全部楼层
回复【8楼】正点原子:
直接不用485试试吧。
---------------------------------
因为周末板子在公司,今天来测了一下,我不接485,它也是一直进入接收中断,怎么回事?,原子哥求救啊!
而且我那个程序跑个5、6分钟就会卡死,在这里:



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-17 20:18:26 | 显示全部楼层
回复【10楼】zhp:
---------------------------------
你这是hardfault了。。。
估计是内存访问越界,检查数组/指针,是否使用合法吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-18 08:21:10 | 显示全部楼层
回复【11楼】正点原子:
回复【10楼】zhp: --------------------------------- 你这是hardfault了。。。 估计是内存访问越界,检查数组/指针,是否使用合法吧。
---------------------------------
哦,这种问题很难找,我再琢磨琢磨吧,谢了原子哥!
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-18 16:21:40 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥,我这两天调试遇到邪门的事了,我将RS485收发控制端PC9改为PG9来控制,程序仅有几处改动,只是将原来的PC9改为PG9来控制,其它就都好了(其中蓝色为之前的部分,红色为改动之后的部分)

我原来的配置代码为:
#define EN485_UART4  PCout(9)   // 串口4收发模式控制引脚为PG9
#define UART4_TXMode   EN485_UART4=1//串口4置为发送模式
#define UART4_RXMode   EN485_UART4=0 //串口4置为接收模式

void uart4_init(u32 pclk1,u32 bound)
{    
float temp;
u16 mantissa;
u16 fraction;    
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp;  //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分  
        mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<4;   //使能PORTC口时钟 ,收发引脚PC10,PC11需要使用  ,收发控制PC9需要使用
RCC->APB1ENR|=1<<19;  //使能串口4时钟 
GPIOC->CRH&=0XFFFF000F;//IO状态设置,PC11做浮空输入模式,PC10复用输出,PC9通用推挽输出模式
GPIOC->CRH|=0X00008B30;//IO状态设置
  
RCC->APB1RSTR|=1<<19;   //复位串口4
RCC->APB1RSTR&=~(1<<19);//停止复位        
//波特率设置
  UART4->BRR=mantissa; // 波特率设置  
UART4->CR1|=0X200C;  //1位停止,无校验位.
//使能接收中断
UART4->CR1|=1<<8;    //PE中断使能
UART4->CR1|=1<<5;    //接收缓冲区非空中断使能     
MY_NVIC_Init(2,0,UART4_IRQChannel,2);//抢占优先级2,响应优先级0,组2
           //串口4结构体变量初始化
Uart4.m_ReceiveBytes=0;
    Uart4.m_SendBytes=0;
    Uart4.g_RecTimeOutFlag=0;
    Uart4.ComInterruptFlag=0;
    Uart4.g_TimeCounter=0;
    Uart4.p_RecBuff=(u8 *)Uart4.RecBuff;
    Uart4.p_SendBuff=(u8 *)Uart4.SendBuff;
//初始化控制485处于接收模式
UART4_RXMode;
}
改为这样程序就正常了,也不卡死了:
#define EN485_UART4     PGout(9)   // 串口4收发模式控制引脚为PG9
#define UART4_TXMode   EN485_UART4=1//串口4置为发送模式
#define UART4_RXMode   EN485_UART4=0 //串口4置为接收模式
 
void uart4_init(u32 pclk1,u32 bound)
{    
float temp;
u16 mantissa;
u16 fraction;    
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp;  //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分  
        mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<4;   //使能PORTC口时钟 ,收发引脚PC10,PC11需要使用  
RCC->APB2ENR|=1<<8;   //使能PORTG口时钟  ,收发控制PG9需要使用
RCC->APB1ENR|=1<<19;  //使能串口4时钟 
GPIOC->CRH&=0XFFFF00FF;//IO状态设置,PC11做浮空输入模式,PC10复用输出
GPIOC->CRH|=0X00008B00;//IO状态设置

GPIOG->CRH&=0XFFFFFF0F;//IO状态设置,PG9复用输出
GPIOG->CRH|=0X00000030;//IO状态设置
  
RCC->APB1RSTR|=1<<19;   //复位串口4
RCC->APB1RSTR&=~(1<<19);//停止复位        
//波特率设置
  UART4->BRR=mantissa; // 波特率设置  
UART4->CR1|=0X200C;  //1位停止,无校验位.
//使能接收中断
UART4->CR1|=1<<8;    //PE中断使能
UART4->CR1|=1<<5;    //接收缓冲区非空中断使能     
MY_NVIC_Init(2,0,UART4_IRQChannel,2);//抢占优先级2,响应优先级0,组2
   //串口4结构体变量初始化
Uart4.m_ReceiveBytes=0;
    Uart4.m_SendBytes=0;
    Uart4.g_RecTimeOutFlag=0;
    Uart4.ComInterruptFlag=0;
    Uart4.g_TimeCounter=0;
    Uart4.p_RecBuff=(u8 *)Uart4.RecBuff;
    Uart4.p_SendBuff=(u8 *)Uart4.SendBuff;
//初始化控制485处于接收模式
UART4_RXMode;
}


我这里PC9和PG9都当做普通IO口输出脚,来控制RS485的收发,将PC9的配置改为PG9的配置,整个程序就不一样了,太奇怪了啊!
(注:PC9和PG9都没有作为它用)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-18 16:49:58 | 显示全部楼层
回复【13楼】zhp:
---------------------------------
你写个PC9,PG9的控制输出程序,对比下(交替输出高低电平,即可测试。)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-18 17:15:47 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
单独控制PC9,PG9输出高低电平都可以的
#define C9 Cout(9)
#define G9 Gout(9)
初始化:
/**************测试代码*********************/
GPIOG->CRH&=0XFFFFFF0F;//IO状态设置,PG9复用输出
GPIOG->CRH|=0X00000030;//IO状态设置 
PG9=0;

GPIOC->CRH&=0XFFFFFF0F;//IO状态设置,PC9复用输出
GPIOC->CRH|=0X00000030;//IO状态设置 
PC9=0;   

输出高:
     C9=1;
     G9=1;
输出低:
    PC9=0; 
    G9=0;
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-18 17:37:16 | 显示全部楼层
回复【15楼】zhp:
---------------------------------
那就奇葩了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-3-18 19:23:25 | 显示全部楼层
是啊,所以说很诡异
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-13 16:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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