最近在学MSP432E401Y单片机
碰到的壁可太多了
例程太少了
基本靠自己移植
在移植超声波的时候程序卡死
很久才找到了原因
然后再后续的探索中发现引脚返回值不是一;
GPIO_PORTD_BASE,GPIO_PIN_1官方给的解释是高电平返回值为1
所以在一开始的判断的时候并没有在意这个问题
最后使用滴答定时器成功把代码写了出来。
TRIG | PD0 |
ECHO | PD1 |
PC6 | RXD上边的 |
PC7 | TXD上边的 |
记得超声波接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);
}
}