打印
[STM32F1]

UART4_IRQHandler()中断问题

[复制链接]
6048|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我使用的是STM32F103ZET 512K,启动文件使用的是.HD,发送正常,UART4->DR中也接收到我要的字节信息,但是接收中断服务函数中if(res==0x4F)的判断没有进行,即syn_state的值没有变为“0”,求解法?:'(
void uart4_init(u32 pclk,u32 bound)
{
  RCC->APB2ENR|=1<<4;
        RCC->APB1ENR|=1<<19;
        GPIOC->CRH&=0XFFFF00FF;
        GPIOC->CRH|=0X00008B00;//

        RCC->APB1RSTR|=1<<19;
        RCC->APB1RSTR&=~(1<<19);

        UART4->BRR=(pclk*1000000)/(bound); // ²¨ÌØÂÊÉèÖà      
        UART4->CR1|=0X200C;  //1λֹͣ,ÎÞУÑéλ.
#ifdef EN_UART4_RX                  //Èç¹ûʹÄÜÁ˽ÓÊÕ
//ʹÄܽÓÊÕÖжÏ
UART4->CR1|=1<<8;    //PEÖжÏʹÄÜ
UART4->CR1|=1<<5;    //½ÓÊÕ»º³åÇø·Ç¿ÕÖжÏʹÄÜ                   
MY_NVIC_Init(3,3,UART4_IRQn,2);//×é2£¬×îµÍÓÅÏȼ¶
#endif
}

#ifdef  UART4_RX_EN
u8 UART4_RX_BUF[64];

void UART4_IRQHandler(void)
{
u8 res;
if(UART4->SR&(1<<5))   // ?????
{
  res=UART4->DR;
        if(res==0x4F)syn_state=0; //ºÏ³É²¥·ÅÍê³É??´Ë±äÁ¿µÄÖµ²»ÊÇ°´ÖжÏËù
                                                                //¸³ÖµÒ»Ñù±ä³É0£¬µ«ÊÇUART4->DRȷʵ½ÓÊÕ¶¼
                                                         //0x4f???????????       
  }
}
#endif
沙发
复仇之矛|  楼主 | 2015-5-29 11:33 | 只看该作者
自己顶下,大家说说可能性吧,在线等。。。

使用特权

评论回复
板凳
mmuuss586| | 2015-5-29 12:17 | 只看该作者
能进入中断;
说明初始化没啥问题;

res是你收到的数据,未执行,也许你发的数据就不对;
用示波器看下数据;

使用特权

评论回复
地板
luofeng2g| | 2015-5-29 12:19 | 只看该作者
直接把收到数据打印出来看下不就知道了!

使用特权

评论回复
5
复仇之矛|  楼主 | 2015-5-29 14:37 | 只看该作者
mmuuss586 发表于 2015-5-29 12:17
能进入中断;
说明初始化没啥问题;

收到的数据是正确的,这个数据是和我板子通信其自身接收正确数据帧后回传的数据

使用特权

评论回复
6
复仇之矛|  楼主 | 2015-5-29 14:40 | 只看该作者
luofeng2g 发表于 2015-5-29 12:19
直接把收到数据打印出来看下不就知道了!

我在线调试,再看UART4->DR寄存器中的值是有变化的,并且值都是正确的数值,最后就是我需要的这个数据0x4f

使用特权

评论回复
7
复仇之矛|  楼主 | 2015-5-29 14:50 | 只看该作者
复仇之矛 发表于 2015-5-29 14:40
我在线调试,再看UART4->DR寄存器中的值是有变化的,并且值都是正确的数值,最后就是我需要的这个数据0x4 ...

在线仿真的值

捕获.PNG (6.78 KB )

串口在线仿真的值

串口在线仿真的值

使用特权

评论回复
8
复仇之矛|  楼主 | 2015-5-29 15:07 | 只看该作者
我调取res的值查看后,虽然res=UART4->DR;但是两者的值不一样,接收的最后res的值保持初始值,UART4->DR的值是0x4f这是为啥?

使用特权

评论回复
9
复仇之矛|  楼主 | 2015-5-29 15:47 | 只看该作者
问题已摸索出来了,共享下,UART4在配置中使用到#ifdef EN_UART4_RX(有帖子说的是默认值为1),注释是:如果使能了接收;而在头文件中有#define EN_UART4_RX,但是在实际仿真中,这个没有起到作用,将这些都注销掉后,添加这句:UART4->CR1|=1<<2;使能接收,既可以正常接收并从UART4->DR中读取数据;

使用特权

评论回复
10
luofeng2g| | 2015-5-29 16:09 | 只看该作者
复仇之矛 发表于 2015-5-29 15:47
问题已摸索出来了,共享下,UART4在配置中使用到#ifdef EN_UART4_RX(有帖子说的是默认值为1),注释是:如 ...

所以最好的办法,使用串口打印出来,到底有没有一目了然!!!

使用特权

评论回复
11
复仇之矛|  楼主 | 2015-5-29 18:11 | 只看该作者
luofeng2g 发表于 2015-5-29 16:09
所以最好的办法,使用串口打印出来,到底有没有一目了然!!!

恩,谢谢,以后有类似问题我会按照你的建议测试的。:handshake

使用特权

评论回复
12
戈卫东| | 2015-5-29 19:07 | 只看该作者
可能sync_state定义问题。
没有定义成 volatile int sync_state这样?

使用特权

评论回复
13
mmuuss586| | 2015-5-30 08:38 | 只看该作者
复仇之矛 发表于 2015-5-29 18:11
恩,谢谢,以后有类似问题我会按照你的建议测试的。

都正确那就不应该有问题啊;

使用特权

评论回复
14
Ketose| | 2015-5-30 09:03 | 只看该作者
楼主写代码为什么不用ST定义好的宏,一堆数字好难看懂。一般人都不愿意看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

185

帖子

3

粉丝