器件型号:MSP432P401R
您好!
我需要在捕获模式下配置计时器 A、以测量我正在使用的 HC-SR04传感器的回波脉冲。
我将向传感器发送10us 脉冲(我尝试的次数越来越少、但结果相同)、我正在等待应触发中断的回波、但情况并非如此。 当我强制捕捉引脚(P2.4)为3.3V、然后再为0V 时、中断中的断点被正确触发。
我真的不明白我的代码有什么问题。 我的代码中可能存在一些我看不到的错误。
顺便说一下、我的传感器正在工作、因为我使用 Energia 代码对其进行了测试、但我想使用 CCS 和 driverlib。
#include "driverlib.h" #include /* Timer_A 连续模式配置参数*/ const Timer_A_ContinuousModeConfig ContinuousModeConfig = { Timer_A_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 Timer_A_CLOCKSOURCE_divider _1、 // SMCLK/1 = 3MHz Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用计时器 ISR Timer_A_skip_clear // Skup 清除计数 器}; // Timer_A 捕获模式配置参数*/ const Timer_A_CaptureModeConfig CaptureModeConfig = { Timer_A_CAPTURECOMPARE 寄存器_1、 // CC 寄存器2 TIMER_A_CAPTUREMODE_RISE_EDGE、 //上升沿和下降沿 Timer_A_CAPTURE_INPUTSELECT_CCIxA、 // CCIxA 输入选择 Timer_A_CAPTURE_synchronous、 //同步捕捉 Timer_A_CAPTURECMPARE 中断_ENABLE、//启用中断 Timer_A_OUTPUTMODE_OUTBIVALUE //输出位值 }; 静态空延迟(uint32_t loop) { volatile uint32_t i; 对于(i = 0;i < loop;i++); } int meas1 = 0; int meas2 = 0; int main (void) { //*停止看门狗计时器*/ MAP_WDT_A_HOLDTimer (); CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY); // 24000000 Hz CS_initClockSignal (CS_MCLK、CS_DCOCLK_SELECT、CS_Clock_divider);// 24000000 Hz CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_clock_divider);// 3000000 Hz/* 配置 P2.4_INPUT_INPUT_INPUT 、GPIO_INPUTTOOT_INP1_INP1_INPUTTOP1_INP1_INPUTTOPUT_IN4;// Output_INPUTTOP1_INP1_INP1_INPUTTOP1_INP1_INPUTTOP1_INP1_INP1_INPUT_INPUTTOPUT_INPUT /*配置捕获模式*/ Timer_A_initCapture (timer_A0_BASE、&CaptureModeConfig); /*配置连续模式*/ Timer_A_configureContinuousMode (timer_A0_BASE、&ContinuousModeConfig); //启用中断*/ Interrupt_enableInterrupt (INT_TA0_N); Interrupt_32 位 TIMER32位、TIMER32位 TIMER32位(timer32位)*、TIMER32位 TIMER32位(TIMER32位) Timer32_setCount (TIMER32_0_base、1); Timer32_startTimer (TIMER32_0_base、true); //在连续模式下启动 Timer_A0 * / Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode); while (1) { GPIO_setOutputInput_On5 (GPIO_pin); Timer32_setCount (TIMER32_0_BASE、24 * 10); while (TIMER32_getValue (TIMER32_0_BASE)> 0);//等待10us GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN5);
//软件延迟 (40000 ); 延迟(40000 ); 延迟(40000 ); 延迟(40000 );延迟(40000 ); 延迟(40000 );延迟(40000 ); 延迟(40000); 延迟(40000); 延迟(40000); 延迟(40000);延迟(40000); 延迟(40000); 延迟(40000); 延迟(40000); 延迟(40000); 延迟(40000);延迟(40000); 延迟(40000); } } void TA0_N_IRQHandler (void) { INT Rising = 0; Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、 Timer_A_CAPTURECOMPARE 寄存器1); if (P2IN&0x10) rising=1;否则 rising=0; if (上升)//开始 { meas1 = Timer_A_getCaptureCompareCount (timer_A0_BASE、timer_A_CAPTURECMPLE_REGISTER_1); } 其他 { meas2 = Timer_A_getCaptureCompareCount (timer_A0_BASE、timer_A_CAPTURECMPLE_REGISTER_1); } }
谢谢、
Olivier