目录
代码
总结
//HCSR04.h配置
#ifndef _HCSR04_H
#define _HCSR04_H
#include "main.h"
void HCSR04Init(void);
float Distance(void);
#endif
//HCSR04.c配置
#include "HCSR04.h"
#include "main.h"
const Timer_A_UpModeConfig upConfig =
{
TIMER_A_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
TIMER_A_CLOCKSOURCE_DIVIDER_3, // SMCLK/1 = 3MHz
50000, // 5000 tick period
TIMER_A_TAIE_INTERRUPT_DISABLE, // Disable Timer interrupt
TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE, // Enable CCR0 interrupt
TIMER_A_DO_CLEAR // Clear value
};
void HCSR04Init(void)
{
MAP_GPIO_setAsOutputPin(GPIO_PORT_P9, GPIO_PIN2);//tring
MAP_GPIO_setAsInputPin(GPIO_PORT_P5, GPIO_PIN3);
MAP_GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P5, GPIO_PIN3);
MAP_GPIO_disableInterrupt(GPIO_PORT_P9, GPIO_PIN2);
MAP_GPIO_disableInterrupt(GPIO_PORT_P5, GPIO_PIN3);
MAP_Timer_A_configureUpMode(TIMER_A2_BASE, &upConfig);
MAP_Interrupt_enableSleepOnIsrExit();
MAP_Interrupt_enableInterrupt(INT_TA1_0);
MAP_Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_UP_MODE);
MAP_Interrupt_enableMaster();
}
void TA1_0_IRQHandler(void)
{
MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_0);
// Timer_A_getCounterValue(uint32_t timer);
}
float Distance(void)
{
int count=0,i=0,sum=0;
float distance=0;
while(i!=5)
{
GPIO_setOutputLowOnPin(GPIO_PORT_P9, GPIO_PIN2);//上拉
GPIO_setOutputHighOnPin(GPIO_PORT_P9, GPIO_PIN2);//上拉
delay_us(10);
GPIO_setOutputLowOnPin(GPIO_PORT_P9, GPIO_PIN2);//上拉
TIMER_A_CMSIS(TIMER_A2_BASE)->R = 0;
while(GPIO_getInputPinValue(GPIO_PORT_P5,GPIO_PIN3) == 0); //
MAP_Interrupt_enableInterrupt(INT_TA1_0);
while(GPIO_getInputPinValue(GPIO_PORT_P5,GPIO_PIN3) == 1); //
MAP_Interrupt_disableInterrupt(INT_TA1_0);
count=TIMER_A_CMSIS(TIMER_A2_BASE)->R;
//v = 340m/s = 34000cm/s = 34000cm/10^6us = 0.034cm/us
//s = vt/2 = t*0.034/2 = t*0.017 ?t/58
distance=((float)count / 58);
i++;
sum=sum+distance;
}
return sum/5;
}
//main.c配置
#include "main.h"
#include "HCSR04.h"
#include "string.h"
#include "stdio.h"
/* 全局变量申明区 */
// u8 a=0;
// u16 len ;
/* 函数调用申明区 */
int main(void)
{
int Distance1;
WDT_A_holdTimer();
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);//led灯
SystemClockInit(HFXT);//系统时钟初始化(系统主时钟)
SystemClockInit(DCO);//系统时钟初始化(子系统时钟)
Usart1tInit(); //串口1 初始化
HCSR04Init();
LedInit();
while(1)
{
Distance1= Distance();
GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
printf("Distance = %dmm\r\n",Distance1);
delay_ms(50);
}
}
HC-SR04超声波的配置程序还是很简单的,但是相比STM32,MSP432使用HC-SR04测量出来的距离超过20CM之后就不准确了,原因暂时未知,可能是定时器频率的问题,还有待研究。
工程链接:基于MSP432P410R的HC-SR04超声波程序.zip