你好!
我正在尝试对进入器件的脉冲进行采样、测试设置是 MCU、测试信号(2.4kHz 频率的1uS 脉冲)连接到端口 P1.0和 P2.3。 我的想法是在比较模式(两个边沿)下启动计时器、在 TA0CCR2标志上进行自动 DMA 传输、并在稍后处理收集的数据、按脉冲宽度收集统计数据。 在实际固件中、它是在 FreeRTOS 任务中完成的、但我简化了项目以隔离问题。
因此,我有一个缓冲区,其数据样本格式如下:[1个脉冲前时间戳][1个脉冲尾时间戳][2个脉冲启动][2个脉冲结束]... (笑声) (笑声) 等等。
因此、具有16MHz 时钟时、我希望数据像[1 16 8001 8016 16001 16016]或类似这样的数据。 但有时(在工作一分钟左右之后)我会得到奇怪的结果-第一个采样时间戳是错误的、例如 [1 16 8001 8016 16051 16016]。
由于我有可预测的信号、我可以看到它与正确的时间戳之间的区别仅为几位、即0x2AB0而不是0x2AB0、或0x4370而不 是0x4340、或0x08F4而不是0x08C0、总是错误位被错误设置、而不是清除。
以下是我的代码:
#include #include #include "lib/GPIO_macros.h" #include "lib/hardware.h" volatile unsigned char new_data_available = 0; #pragma vector=Port1_vector __interrupt void Port_1 (void){ if (P1IV = 0x02) new_data_available = 1; } #define detector buffer_size 32 unsigned short ***[detector buffer_size_1];//消除超出范围的编译器警告 unsigned short detector stats[16]={0、0、0、0、0、0、0、0、0、0、 0、0、0、0、0、 0、0、0、0、0、 0}; int main (void){ WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器以防止超时复位 PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式 // DMACTL4 |= DMARMWDIS;//必须注释,减慢速度 PIN_CONFIGURATION (LFXT1、MODE_PERFICE_1); PIN_CONFIGURATION (LFXT2、MODE_PERFICE_FUNC功能性1); CSCTL0 = CSKEY; //解锁 CS 控制寄存器 CSCTL4 |= LFXTDRIVE_3; //最高驱动器设置(仅用于启动) CSCTL4 &=~(LFXTOFF|LFXTBYPASS);//打开晶振 while (CSCTL5 & LFXTOFFG){ //等待晶振稳定(清除故障标志) CSCTL5 &=~(LFXTOFFG); SFRIFG1 &=~OFIFG; } CSCTL4 &=~LFXTDRIVE_3; //清除 LFXTDRIVE (将请求的驱动模式设置为最低电流) FRCTL0 = FRCTLPW | NWAITS_1; //见 slau367k.pdf 中的表8-1 CSCTL1 = DCORSEL | DCOFSEL_4; //将 DCO 频率设置为16MHz CSCTL2 = SELA_LFXTCLK | SELM__DCOCLK | SELS__DCOCLK;//将时钟源设置为 DCO CSCTL3 = 0x0000;//将所有分频器减至最小值 CSCTL0_H = 0x00;//锁定 CS 控制寄存器 PIN_CONFIGURATION (detector _IN0、MODE_PERAPTERY_FUNC功能性1);// 39、P2.3、[TA0.0] PIN_CONFIGURATION (Detector IN1、MODE_INPUT_FLOLINULOCTOR); // 1、P1.0、[GPIO INT] 对于(无符号短整型 I=0;I > 1; Buffer_PTR_Current = buffer_PTR_over - samples_rest * 2;//开始两个样本占位符 对于(;;){ if (buffer_ptr = buffer_ptR_current) break; 无符号短启动=*缓冲区_PTR++; 无符号短宽度=*缓冲区_PTR++; width = start;//我们可以在不< check 的情况下执行此操作(由于'unsigned short'溢出) if (buffer_ptr = buffer_ptR_over) buffer_ptr = buffer_ptR_start; 如果(宽度> 32768){ break;//<--在这里断点 } 宽度>=4; 如果(宽度> 15)宽度= 15; Deter_states[width]++; } } }
这是什么?
RAM 故障? DMA 诀窍? 未知勘误章节? )
提前感谢您!