基于MSP432E401Y的HC-SR04超声波程序

最近在学MSP432E401Y单片机

碰到的壁可太多了

例程太少了

基本靠自己移植

在移植超声波的时候程序卡死

很久才找到了原因

然后再后续的探索中发现引脚返回值不是一;

GPIO_PORTD_BASE,GPIO_PIN_1官方给的解释是高电平返回值为1

所以在一开始的判断的时候并没有在意这个问题

最后使用滴答定时器成功把代码写了出来。

 

TRIG     PD0
ECHOPD1
PC6RXD上边的
PC7TXD上边的

记得超声波接5V!!!

原理:

发送起始信号,检测高电平持续时间。

代码:

#include <stdint.h>
#include <stdbool.h>
#include "ti/devices/msp432e4/driverlib/driverlib.h"
#include "uartstdio.h"

#define USART_REC_LEN           16    //定义最大接收字节数 200
#define HCSR04_TRIG     GPIO_PIN_0       // trig PD0
#define HCSR04_ECHO     GPIO_PIN_1       // ECHO PD1
#define TRIG_Send       GPIOPinWrite(GPIO_PORTD_BASE, HCSR04_TRIG, 0xff)   // 输出高电频
#define TRIG_Reset      GPIOPinWrite(GPIO_PORTD_BASE, HCSR04_TRIG, 0)//输出低电频

#define TRIGGER_PIN GPIO_PIN_0
#define ECHO_PIN    GPIO_PIN_1
#define TRIGGER_PORT GPIO_PORTD_BASE
#define ECHO_PORT    GPIO_PORTD_BASE


float distance=0;
uint8_t Trg = 0;
uint32_t flag1,flag2,flag3;
uint32_t timers1=0;
uint32_t timers2=0;
uint32_t g_ui32SysClock;
uint32_t systemClock;




uint32_t g_ui32SysClock;


#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif


//延时函数
void delay_us(uint32_t milliseconds) {
    uint32_t i;
    uint32_t cycles = milliseconds * (12000000 / 1000000);

    for (i = 0; i < cycles; i++) {
        __asm("NOP");
    }
}
void delay_ms(unsigned int ms)
{
    unsigned int a;
    while (ms)
    {
        a = 12000000 / 1000;
        while (a--)
            ;
        ms--;
    }

}

//IO口初始化及其他初始化
void Hcsr04Init()
{
    // GPIO初始化
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);   // 使能GPIOD外设时钟
    GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, HCSR04_TRIG);
    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, HCSR04_ECHO);
    
    GPIOPadConfigSet(GPIO_PORTD_BASE, HCSR04_TRIG, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
    GPIOPadConfigSet(GPIO_PORTD_BASE, HCSR04_ECHO, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
    GPIOPinWrite(GPIO_PORTD_BASE, HCSR04_TRIG, 0);   // 初始化为低电平
    GPIOPinWrite(GPIO_PORTD_BASE, HCSR04_ECHO, 0);   // 初始化为低电平
	  SysTickPeriodSet(12000000 / 100000-1);
	 SysTickEnable();
}




void
ConfigureUART(void)
{
 
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

 
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

 
    MAP_GPIOPinConfigure(GPIO_PA0_U0RX);
    MAP_GPIOPinConfigure(GPIO_PA1_U0TX);
    MAP_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    UARTStdioConfig(0, 115200, g_ui32SysClock);
}

//无关紧要
void systic_end(void){
	   SysTickDisable(); 
	  
}
void systic_start(void){
	
	SysTickEnable();
}




// 使用串口5 波特率 115200,PC6  RXD   PC7TXD
void ConfigureUART5()
{
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART5);
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    MAP_IntMasterEnable();
    GPIOPinConfigure(GPIO_PC6_U5RX);
    GPIOPinConfigure(GPIO_PC7_U5TX);
    MAP_GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_6 | GPIO_PIN_7);
    MAP_UARTConfigSetExpClk(UART5_BASE, g_ui32SysClock, 115200,
                                        (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                                         UART_CONFIG_PAR_NONE));
    MAP_IntEnable(INT_UART5);
    MAP_UARTIntEnable(UART5_BASE, UART_INT_RX | UART_INT_RT);
}

int32_t temp_UART5=0;
void
UART5_IRQHandler(void)
{
    uint32_t ui32Status;

    ui32Status = MAP_UARTIntStatus(UART5_BASE, true);

    MAP_UARTIntClear(UART5_BASE, ui32Status);

   while(MAP_UARTCharsAvail(UART5_BASE))
   {
        temp_UART5=UARTCharGetNonBlocking(UART5_BASE);
        if(temp_UART5==97)           flag1=1;     //a 
        else if(temp_UART5==98)      flag2=1;     //b  
        else if(temp_UART5==99)      flag3=1;     //c
  }
}
void usart5_send_char(char c)
{
    UARTCharPut(UART5_BASE, c);
}
void UART5Send(char* s)
{
    while(*s)
    {
        MAP_UARTCharPutNonBlocking(UART5_BASE, *s++);
    }
}

void UART5Send1(float number)//拿来发送字符串
{
    char buffer[16];  // Assuming a maximum of 15 characters for the formatted number
    sprintf(buffer, "%.2f", number);  // Format the float with 2 decimal places
    char* s = buffer;
    
    while (*s)
    {
        MAP_UARTCharPutNonBlocking(UART5_BASE, *s++);
    }
		 for (int i = 0; i < 5; i++)
    {
        MAP_UARTCharPutNonBlocking(UART5_BASE, ' ');
    }
}
float HC_SR04_dis()
{
	 int zhouqi1,zhouqi2,timestext1,timestext2,timestext3;
   GPIOPinWrite(TRIGGER_PORT, TRIGGER_PIN, 0);//拉低发送引脚并等待,使得前次发送的超声波不会影响本次测距
   delay_us(10);       // 持续5us低电平
   GPIOPinWrite(TRIGGER_PORT, TRIGGER_PIN, 0xff);  //拉高发送引脚发送超声波
   delay_us(15);  // 持续发送12us
   GPIOPinWrite(TRIGGER_PORT, TRIGGER_PIN, 0); //拉低发送引脚
   while(GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_1)==0);
	{zhouqi1=SysTickValueGet();
		timestext1=timers2;
	}
   while(GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_1)==2);//
	{zhouqi2=SysTickValueGet();
	timestext2=	timers2;
	}
	if(timestext2>timestext1)
	timestext3=timestext2-timestext1;
	
	
	//OLED_ShowNum(29,5,timestext3,7,18);
	if(zhouqi2>zhouqi1)
	distance=(float)timestext3/1000*17.1;
	//OLED_Clear();
	UART5Send1(distance);
   return 0;
}
void MySysTickHandler(void) {
       timers2++;
}

int
main(void)
{
    
    g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
                SYSCTL_CFG_VCO_480), 120000000);

    ConfigureUART();
    Hcsr04Init();
	  SysTickIntRegister(MySysTickHandler);
  
		ConfigureUART5();

    while(1)
    {  HC_SR04_dis();
			delay_ms(500);

    }
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式学不会不改名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值