郑州网站建设代运营,徐州公司网站建设,成都网站制作推来客网站系统,wordpress权限问题1.通过操作Cortex-A7核#xff0c;串口输入相应的命令#xff0c;控制LED灯进行工作 例如在串口输入led1on,开饭led1灯点亮
2.例如在串口输入led1off,开饭led1灯熄灭
3.例如在串口输入led2on,开饭led2灯点亮
4.例如在串口输入led2off,开饭led2灯熄灭
5.例如在串口输入led…1.通过操作Cortex-A7核串口输入相应的命令控制LED灯进行工作 例如在串口输入led1on,开饭led1灯点亮
2.例如在串口输入led1off,开饭led1灯熄灭
3.例如在串口输入led2on,开饭led2灯点亮
4.例如在串口输入led2off,开饭led2灯熄灭
5.例如在串口输入led3on,开饭led3灯点亮
6.例如在串口输入led3off,开饭led3灯熄灭
2.编程要求
1结构体封装
typedef struct{
char* cmd_arr; //命令行字符串
gpio_t* gpiox;//GPIO组号
unsigned int pin; //引脚编号
status_t status; //LED灯状态
void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status);
}cmd_t;
2结构体数组
方式1cmd_t cmd_arr[6] {{led1off,GPIOE,GPIO_PIN_10,GPIO_RESET_T},{},};
cmd_t cmd_arr[6] {
[0] { .cmd_arr led1off, .gpiox GPIOE, .pin GPIO_PIN_10, .status GPIO_RESET_T, .gpio_write_pin hal_gpio_write, }, [1] {}, [2] {}, };
3在串口输入一个字符串
1在串口输入一个字符串需要定义一个变量接收串口接收到的字符串 char* string uart_get_string();
2串口中输入的字符串与结构体中每个元素中的cmd_arr变量进行比较
3如果比较成功代表查到输入的字符串 思考函数实现如何编写
cmd_t* find_command(const char* str) {
//串口中输入的字符串与结构体中每个元素中的cmd_arr变量进行比较
//遍历比较自己编写strcmp比较的函数 return 0;
//失败返回0 }
4思考main.c函数编写
cmd_t* cmd_arr;
char* string uart_get_string();
cmd_arr find_command(string);
if(cmd_arr 0)
{
查找失败
}else {
cmd_arr-gpio_write_pin(cmd_arr-gpiox,...........)
}
led.h
#ifndef __TEST_H__
#define __TEST_H__#include stm32mp1xx_rcc.h
#include stm32mp1xx_gpio.h
#include stm32mp1xx_uart.h#define GPIO_PIN_8 8
#define GPIO_PIN_9 9
#define GPIO_PIN_10 10//GPIO章节初始化
void GPIO_INIT();//UART章节初始化
void UART_INIT();//RCC章节初始化
void RCC_INIT();//发送一个字符
void put_char(const char str);//发送一个字符串
void put_string(const char* str);//接收一个字符
char get_char();//接收一个字符串
char* get_string();//字符串比较函数
int my_strcmp(char *a,char *b);//封装灯泡亮灭枚举
typedef enum
{reset_t,set_t,
}status_t;//结构体封装
typedef struct{char* cmd_arr; gpio_t* gpiox;unsigned int pin; status_t status; void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status);
}cmd_t;
cmd_t* find_command(char* str);//重写函数
void hall_gpio_write(gpio_t* gpiox,unsigned int pin,status_t state);
#endif
led.c
#include test.h//GPIO章节初始化
void GPIO_INIT()
{//设置3个灯的模式GPIOE-MODER(~(0x320));GPIOE-MODER|(0x120);GPIOF-MODER(~(0x320));GPIOF-MODER|(0x120);GPIOE-MODER(~(0x316));GPIOE-MODER|(0x116);//设置推挽输出GPIOE-OTYPER(~(0x110));GPIOF-OTYPER(~(0x110));GPIOE-OTYPER(~(0x18));//设置低速GPIOE-OSPEEDR(~(0x320));GPIOF-OSPEEDR(~(0x320));GPIOE-OSPEEDR(~(0x316));//不需要上拉GPIOE-PUPDR(~(0x320));GPIOF-PUPDR(~(0x320));GPIOE-PUPDR(~(0x316));/**********************************///设置GPIOB引脚输出为复用模式GPIOB-MODER(~(0x34));GPIOB-MODER|(0x24);//设置GPIOG引脚输出模式GPIOG-MODER(~(0x322));GPIOG-MODER|(0x222);//设置GPIOB功能复用模式GPIOB-AFRL(~(0x158));GPIOB-AFRL|(0x88);//设置GPIOG功能复用模式GPIOG-AFRH(~(0x612));GPIOG-AFRH|(0x612);}//UART章节初始化
void UART_INIT()
{//设置宽度USART4-CR1(~(0x112));USART4-CR1(~(0x128));USART4-CR1(~(0x115));USART4-CR1(~(0x110));USART4-CR1|(0x13);USART4-CR1|(0x12);USART4-CR1|(0x1);USART4-CR2(~(0x312)); //3.设置一级分配USART4-PRESC(~(0x15));//4.USART_BRR设置串口波特率USART4-BRR0x22B;}//RCC章节初始化
void RCC_INIT()
{//对GPIOE和GPIOG使能RCC-MP_AHB4ENSETR|(0x34); //对GPIOB使能RCC-MP_AHB4ENSETR|(0x11);//对GPIOG使能RCC-MP_AHB4ENSETR|(0x16);//对UART4使能RCC-MP_APB1ENSETR|(0x116);}//发送一个字符
void put_char(const char str)
{while(!(USART4-ISR (0x1 7))); //2.将要发送的字符写到发送数据寄存器中 USART4-TDR str; //3.判断发送数据是否完成 ISR[6] while(!(USART4-ISR (0x16)));}//发送一个字符串
void put_string(const char* str)
{//判断是否为\0,一个字符一个字符发送 for(int i0;str[i]!\0;i){put_char(str[i]); }put_char(\n);put_char(\r);}//接收一个字符
char get_char()
{char ch; //1.判断接收数据寄存器是否有数据可读 ISR[5] while(!(USART4-ISR (0x15))); //2.将接收到的数据读出来 ch USART4-RDR; return ch; }char buf[50]{0};//接收一个字符串
char* get_string()
{//for循环int i0;//当键盘的回车键\r按下之后字符串输入完成 for(i0;(buf[i]get_char())!\r;i){put_char(buf[i]);}//字符串补\0 buf[i] \0; put_char(\n);put_char(\r);return buf;}//字符串比较函数
int my_strcmp(char *a,char *b)
{while(*a || *b){if(*a!*b){return *a-*b;}a;b;}return 0;}//结构体封装
cmd_t cmd_arr[6] {[0]{led1on ,GPIOE,GPIO_PIN_10,set_t,hall_gpio_write},[1]{led1off,GPIOE,GPIO_PIN_10,reset_t,hall_gpio_write},[2]{led2on ,GPIOF,GPIO_PIN_10,set_t,hall_gpio_write},[3]{led2off,GPIOF,GPIO_PIN_10,reset_t,hall_gpio_write},[4]{led3on ,GPIOE,GPIO_PIN_8 ,set_t,hall_gpio_write},[5]{led3off,GPIOE,GPIO_PIN_8 ,reset_t,hall_gpio_write}
};cmd_t* find_command(char* str)
{for(int i0; i6; i){if(my_strcmp(str,cmd_arr[i].cmd_arr)0){return cmd_arr[i];}}return 0; //失败返回0}//对GPIO引脚写控制灯光亮灭函数
void hall_gpio_write(gpio_t* gpiox,unsigned int pin,status_t state)
{if(state set_t){gpiox-ODR |(0x1pin);}else if(state reset_t){gpiox-ODR (~(0x1pin)); }
}
main.c
#include test.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);
}
int main()
{RCC_INIT();GPIO_INIT();UART_INIT();while(1){cmd_t* cmd_arr;char *string get_string();cmd_arr find_command(string);if(cmd_arr 0){put_string(error);}else{cmd_arr-gpio_write_pin(cmd_arr-gpiox,cmd_arr-pin,cmd_arr-status);}}return 0;}
测试结果