在项目进行过程中,设置了脉冲捕捉,然后产生中断,我的做法是,设置了个全局变量环形数组,将捕获的脉冲计数值与前一次作差后放入环形数组里,然后由相关任务去处理。然是奇怪的是,捕捉中断进行几次之后就不再响应了,而且还会导致死机,代码如下:
#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平台上脉冲捕捉导致死机问题
推荐阅读最新更新时间: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
[嵌入式]