#include <stdint.h> #include <stdbool.h> #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_ints.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/timer.h" #include "driverlib/pwm.h" #include "utils/uartstdio.h" unsigned int interval=0; void Timer0IntHandler(void) { UARTprintf("Entre interrupts"); TimerIntClear(TIMER0_BASE,TIMER_CAPA_EVENT); interval=TimerValueGet(TIMER0_BASE,TIMER_A) ; } void InitUART() { SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//Enable UART0 module SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//for UART GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);//PA0&PA1 for UART0 UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); //configure the baud clock source the precision internal oscillator(UART_CLOCK_PIOSC) UARTStdioConfig(0, 4800, 16000000); } void InitTimer() { SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // Timer0 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//PORTB for timer0 GPIOPinConfigure(GPIO_PB6_T0CCP0 ); // configure PB6 for Timer0 GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_6); GPIOPinTypeTimer(GPIO_PORTB_BASE, GPIO_PIN_6);//PB6 for timer0 TimerConfigure(TIMER0_BASE,TIMER_CFG_A_CAP_TIME_UP|TIMER_CFG_SPLIT_PAIR); TimerControlEvent(TIMER0_BASE,TIMER_A,TIMER_EVENT_POS_EDGE);//上升沿触发 //TimerIntRegister(TIMER0_BASE,TIMER_A,Timer0IntHandler); IntMasterEnable(); TimerIntEnable(TIMER0_BASE, TIMER_CAPA_EVENT); IntEnable(INT_TIMER0A); TimerEnable(TIMER0_BASE, TIMER_A); } void InitPWM() { SysCtlPWMClockSet(SYSCTL_PWMDIV_1); SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);//使能pwm1外设 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//使能PF GPIOPinConfigure(GPIO_PF1_M1PWM5 ); GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1);//设置端口的pwm输出功能 PWMGenConfigure(PWM1_BASE, PWM_GEN_2, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);//下降计数,非同步 PWMGenPeriodSet(PWM1_BASE, PWM_GEN_2, 640);//0.1MHz PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5, 320);//占空比50%,脉冲宽度320 PWMOutputState(PWM1_BASE, PWM_OUT_5_BIT, true); PWMGenEnable(PWM1_BASE, PWM_GEN_2); } /* *PB6 for timer0 * trigPWM PF1 * echo PB6 * UART0 PA0 & PA1 * */ int main(void) { SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ); InitUART(); UARTprintf("Hello ,measurement starts->\n"); InitPWM(); InitTimer(); // UARTprintf("pass inittimer->\n"); while(1) { UARTprintf("The time is %d:\n",interval); } }
超声波测距传感器为hc-sr04。目前程序先获得高电平时间。思路:PF1产生高电平为20us的pwm触发传感器发射超声波,此时echo端将会产生高电平,定时器设置为上升沿触发,设置下降沿触发中断,进入中断后,使用TimerValueGet();获取当前timer的值,即高电平持续时间,使用uart发回电脑使用串口助手查看。我的思路是不是正确?为什么根本就进入不了中断。定时器配置出问题了吗。串口助手可以正常查看部分提示内容,说明uart配置正确。pwm从PF1输出,开发板上的红灯亮,说明pwm也没问题。被TM4的定时器折磨不浅。求解脱