Thread 中讨论的其他器件:SYSBIOS
我正在尝试使用捕获控制引脚来测量输入引脚的 PWM。 我仔细阅读、发现使用2个引脚最简单、但遗憾的是、我当前的应用中只有1个引脚。 我将使用 T0CCP0来使用计时器0A 中断。 代码如下所示:
用于创建 HWI 并切换内部时钟以使用 timer3的 application.cfg 设置
var Clock = xdc.useModule('ti.sysbios.knl.Clock'); Clock.timerId = 3; /* use timer 3 */ var ti_sysbios_family_arm_m3_Hwi3Params = new ti_sysbios_family_arm_m3_Hwi.Params(); ti_sysbios_family_arm_m3_Hwi3Params.instance.name = "motorSpeedIntHandle"; Program.global.motorSpeedIntHandle = ti_sysbios_family_arm_m3_Hwi.create(19, "&MotorSpeedIntHandler", ti_sysbios_family_arm_m3_Hwi3Params);
PWM_Measure.cc
extern "C" void MotorSpeedIntHandler() { static uint32_t pwm_fall_edge = 0; static uint32_t pwm_rise_edge = 0; static uint32_t log_counter = 0; // Timer has timed out if (TimerIntStatus(TIMER0_BASE, TIMER_TIMA_TIMEOUT) == TIMER_TIMA_TIMEOUT) { // If we timed out throw away sample pwm_fall_edge = 0; pwm_rise_edge = 0; TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); } if (TimerIntStatus(TIMER0_BASE, TIMER_TIMA_TIMEOUT) == TIMER_CAPA_EVENT) { int32_t pin_value = GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_4); if (pin_value == 0) { pwm_fall_edge = TimerValueGet(TIMER0_BASE, TIMER_A); int32_t pwm_on_time = pwm_rise_edge - pwm_fall_edge; motor_speed_measured_RPM = (pwm_on_time / MOTOR_PWM_FEEDBACK_SPEED_CONVERSION_INVERSE); } else { pwm_rise_edge = TimerValueGet(TIMER0_BASE, TIMER_A); } TimerIntClear(TIMER0_BASE, TIMER_CAPA_EVENT); } } void motorControlFeedbackInit() { // Signal is a 482Hz from 5% - 100% duty cycle SysCtlPeripheralDisable(SYSCTL_PERIPH_TIMER0); SysCtlPeripheralReset(SYSCTL_PERIPH_TIMER0); SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // Initialize timer A and B to count up in edge time mode TimerConfigure(TIMER0_BASE, (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME | TIMER_CFG_A_ACT_NONE)); // 120MHz / 4 = 30MHz TimerPrescaleSet(TIMER0_BASE, TIMER_A, 4); // Timer a records pos edge time and Timer b records neg edge time TimerControlEvent(TIMER0_BASE, TIMER_A, TIMER_EVENT_BOTH_EDGES); TimerLoadSet(TIMER0_BASE, TIMER_A, 0xFFFF); //Configure the pin that the timer reads from (PL4) GPIOPinConfigure(GPIO_PL4_T0CCP0); GPIOPinTypeTimer(GPIO_PORTL_BASE, GPIO_PIN_4); TimerIntRegister(TIMER0_BASE, TIMER_A, MotorSpeedIntHandler); // Enable the indicated timer interrupt source. TimerIntClear(TIMER0_BASE, (TIMER_CAPA_EVENT | TIMER_TIMA_TIMEOUT)); TimerIntEnable(TIMER0_BASE, (TIMER_CAPA_EVENT | TIMER_TIMA_TIMEOUT)); TimerEnable(TIMER0_BASE, TIMER_A); }
我遇到的问题是、正如您在 init 函数中看到的那样、我需要手动注册一个中断 、因为在我注册这个中断(或取消注册任何已设置的中断)后、这个中断在.cfg 中都无法正常运行。 我怀疑这是因为 RTOS 使用 timer0、它在后台执行记录自身节拍中断的操作、不喜欢我尝试覆盖该中断的情况。 我是否在.cfg 中遗漏了某个内容?
谢谢!