1、实验要求:串口输入对应的命令,通过对应的命令,控制硬件工作
例子: 在串口工具输入led1on -------->硬件LED1点亮
在串口工具输入led1off -------->硬件LED1熄灭
在串口工具输入led2on -------->硬件LED2点亮
在串口工具输入led2off -------->硬件LED2熄灭
在串口工具输入led3on -------->硬件LED3点亮
在串口工具输入led3off -------->硬件LED3熄灭
//.h文件
#ifndef __GPIO_H__
#define __GPIO_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
#define GPIO_PIN_0 0
#define GPIO_PIN_1 1
#define GPIO_PIN_2 2
#define GPIO_PIN_3 3
#define GPIO_PIN_4 4
#define GPIO_PIN_5 5
#define GPIO_PIN_6 6
#define GPIO_PIN_7 7
#define GPIO_PIN_8 8
#define GPIO_PIN_9 9
#define GPIO_PIN_10 10
#define GPIO_PIN_11 11
#define GPIO_PIN_12 12
#define GPIO_PIN_13 13
#define GPIO_PIN_14 14
#define GPIO_PIN_15 15
//enum封装引脚状态
typedef enum
{
GPIO_RESET,
GPIO_SET,
}status_t;
typedef struct
{
char* cmd_arr;
gpio_t* gpio;
unsigned int pin;
status_t status;
void (*gpio_write_p)(gpio_t* gpio,unsigned int pin,status_t status);
}cmd_t;
//GPIO初始化函数
void hal_gpio_init(gpio_t *gpiox,unsigned int pin);
//LED的点亮熄灭
void hal_gpio_write(gpio_t *gpiox,unsigned int pin,status_t status);
//UART4串口初始化
void hal_uart_init(void);
//发送一个字符
void hal_put_char(const char str);
//发送一个字符串
void hal_put_string(const char* string);
//接收一个字符
char get_char(void);
//接收一个字符串
char* get_string(void);
//比较函数
int strcmp(char* dest,char* src);
//输入命令与字符串比较
cmd_t* find_command(char* str);
#endif
//功能函数(部分)
#include "gpio.h"
extern void delay_ms(int ms);
extern cmd_t cmd[];
int strcmp(char* dest,char* src)
{
while((*dest!='\0')&&(*src!='\0')&&(*dest==*src))
{
dest++;
src++;
}
return *dest-*src;
}
cmd_t* find_command(char* str)
{
int i;
for(i=0;i<6;i++)
{
if(!(strcmp(str,cmd[i].cmd_arr)))
{
return &cmd[i];
}
}
if(i==6)
{
hal_put_string("no found");
}
return 0;
}
//主函数
#include "gpio.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
cmd_t cmd[6]={
[0]={
.cmd_arr="led1on",
.gpio=GPIOE,
.pin=GPIO_PIN_10,
.status=GPIO_SET,
.gpio_write_p=hal_gpio_write,
},
[1]={
.cmd_arr="led1off",
.gpio=GPIOE,
.pin=GPIO_PIN_10,
.status=GPIO_RESET,
.gpio_write_p=hal_gpio_write,
},
[2]={
.cmd_arr="led2on",
.gpio=GPIOF,
.pin=GPIO_PIN_10,
.status=GPIO_SET,
.gpio_write_p=hal_gpio_write,
},
[3]={
.cmd_arr="led2off",
.gpio=GPIOF,
.pin=GPIO_PIN_10,
.status=GPIO_RESET,
.gpio_write_p=hal_gpio_write,
},
[4]={
.cmd_arr="led3on",
.gpio=GPIOE,
.pin=GPIO_PIN_8,
.status=GPIO_SET,
.gpio_write_p=hal_gpio_write,
},
[5]={
.cmd_arr="led3off",
.gpio=GPIOE,
.pin=GPIO_PIN_8,
.status=GPIO_RESET,
.gpio_write_p=hal_gpio_write,
},
};
int main()
{
hal_gpio_init(GPIOE,GPIO_PIN_10);
hal_gpio_init(GPIOF,GPIO_PIN_10);
hal_gpio_init(GPIOE,GPIO_PIN_8);
hal_uart_init();
while(1)
{
cmd_t* p=find_command(get_string());
if(p)
{
p->gpio_write_p(p->gpio,p->pin,p->status);
}
}
return 0;
}
//现象