在IAR环境下LPC2129平台上脉冲捕捉导致死机问题

发布者:数字航海家最新更新时间:2016-04-20 来源: eefocus关键字:IAR环境  LPC2129  脉冲捕捉  死机问题 手机看文章 扫描二维码
随时随地手机看文章
在项目进行过程中,设置了脉冲捕捉,然后产生中断,我的做法是,设置了个全局变量环形数组,将捕获的脉冲计数值与前一次作差后放入环形数组里,然后由相关任务去处理。然是奇怪的是,捕捉中断进行几次之后就不再响应了,而且还会导致死机,代码如下:

#define LCD_LED_SW  1<<24
//extern OS_EVENT *pMbox_App_CapISR_Flowmeter;
INT8U capCnt = 0;
INT32U rcvLast = 0;
extern INT32U rcvBuf[];
extern BOOLEAN flag_capISR;

void  BSP_Tmr_Cap_ISR_Handler (void)
{
//#if OS_CRITICAL_METHOD == 3                             // Allocate storage for CPU status register
//    OS_CPU_SR   cpu_sr = 0;
//#endif    
   INT32U  rcvCur;
    //中断寄存器T1IR包含低4个位用于匹配中断,高4个位用于捕获中断。如果有中断产生,IR中的对应位会置位,否则为0。向
    //向对应的IR 位写入1 会复位中断。写入0 无效。
    //OS_ENTER_CRITICAL();
    rcvCur = T1CR2;
     if(rcvCur > rcvLast) //如果收到的值大于上次接收到的值,说明TC没有溢出
        rcvBuf[capCnt] = rcvCur - rcvLast;
    else  //否则TC产生了溢出,注意这rcvCur不可能是负值!!!,因为它们是无符号整数,
          //所以要按下面方式计算0xffffffff + rcvCur就会
        rcvBuf[capCnt] = 0xffffffff + rcvCur - rcvLast;
    //rcvBuf[capCnt] = __get_SP();
    if(10 > capCnt)           
        capCnt++;
    else 
        capCnt = 0;          
    rcvLast = rcvCur;//更新成最新值
    flag_capISR = 1;//标志捕捉中断已产生 
 
    //T1IR_bit.MR2INT = 1;  //匹配通道2 的中断标志
    //向TaskFlowmeter任务发送邮件
    //OSMboxPost(pMbox_App_CapISR_Flowmeter, (void *)&rcv);
       
    if(IO1PIN&LCD_LED_SW)                                          
      IO1CLR= LCD_LED_SW;//P1.24=0
    else
      IO1SET= LCD_LED_SW;//P1.24=1
   
    //清零操作一定要放在最后  
    T1IR_bit.CR2INT = 1;//清除捕获通道2事件的中断标志
    //OS_EXIT_CRITICAL();
    VICVectAddr = 0;
}

经过艰苦的排查之后,才发现原来犯了一个多么低级的错误,仔细看上面蓝色粗体部分,变量rcvCur是32为无符号整型,只要rcvCur不等于零,0xffffffff + rcvCur 当然就会溢出了,从而导致data abort数据中止异常。

当发现当前采样值小于上一次的采样值时,应先减再加就不会产生溢出异常了。正确写法如下:

rcvBuf[capCnt] = (0xffffffff - rcvLast) + rcvCur ;

但是,上机测试后仍然不行,实在是不明白是什么原因了。没办法只得采用开始的办法,不管什么数据,先发送走再说。

//向TaskFlowmeter任务发送邮件
OSMboxPost(pMbox_App_CapISR_Flowmeter, (void *)&rcv);


期待正解啊。

 

 

关键字:IAR环境  LPC2129  脉冲捕捉  死机问题 引用地址:在IAR环境下LPC2129平台上脉冲捕捉导致死机问题

上一篇:关于LPC1758平台上I2C EEPROM 调试总结
下一篇:LPC21xx CAN 波特率计算

推荐阅读最新更新时间:2024-03-16 14:51

HD7279A控制数码管(IAR环境
/*************************************************************************** IAR环境,HD7279A,P4.0~CS,P4.1~CLK,P4.2~DATA,P4,3~KAY, DATA为串口数据口,时序图如下: CS: ---------_________________________-------- CLK: ___________---___---___---___---__________ DATA: ---------~~~---~~~---~~~~---~~~----------- 由430将显示数据一次性送到7279,再由7279显示
[单片机]
AVR单片机IAR开发环境搭建和注意事项
简介:1、AVR单片机IAR开发环境搭建 2、IAR使用注意事项 1、AVR单片机IAR开发环境搭建 2、IAR使用注意事项 头文件含义 avr_macros.h里面包含了读写16位寄存器的简化书写,和几个位操作函数 comp_a90.h对大量的内在函数做了简要书写 ina90.h包含 inavr.h comp_A90.h 文件 intrinsics.h内在函数提供最简单的操作处理器底层特征。休眠,看门狗,FLASH函数。 iomacro.HI/O寄存器定义文件样本。 iom8.h包含I/O等寄存器定义 位操作 在c语言里对位的操作如一般如下: PORTB|=(1 2); //置PORTB的第2位=1 PO
[单片机]
IAR Embedded Workbench®集成开发环境全面支持航顺芯片HK32MCU系列
IAR Embedded Workbench®集成开发环境已全面支持航顺芯片HK32MCU系列 中国上海—2021年12月—全球领先的嵌入式开发软件工具和服务提供商IAR Systems®日前宣布:其最新发布的IAR Embedded Workbench for Arm® version 9.20已全面支持航顺芯片HK32MCU系列,以保障基于HK32MCU芯片的嵌入式系统的可靠性。 IAR Systems 为Arm生态提供了完整的工具链,其产品包括集成开发环境(IDE)、跨平台的构建工具、代码分析工具、功能安全工具和信息安全工具等。基于IAR Systems与Arm生态的长期而广泛的合作关系,IAR Embedded W
[嵌入式]
电脑死机可能不是质量问题而是宇宙射线造成?
  据美国媒体报道,当电脑奔溃或手机卡住时,不要马上就怪生产商,这很可能是宇宙射线,或者射线产生的带电粒子造成的。虽然这些粒子如果数量少,对生物是无害的,但其携带的能量足以干扰我们个人设备微电子电路的运行。这种现象被称为单粒子翻转(SEU)。 在SEU期间,粒子会改变芯片内存储存数据的位,后果可以很小如只是改变摄影中一个像素,也可以很大如造成客机失事。2003年比利时斯哈尔贝克电子投票故障就是SEU引起的,电子投票机的一个位翻转导致一位候选人多拿了4096张选票。如果不是因为该候选人不可能得到这么多票,还发现不了这个问题。 范德堡大学辐射效应研究部的研究者巴拉特·布瓦称:“这是很大的问题,但公众基本上还不知道。”该机构是1987
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved