好公司网站建设价格低淘宝关键词排名查询网站
1.通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作
1>例如在串口输入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); //处理LED状态的函数指针
}cmd_t;
头文件:
#ifndef __NEW_H__
#define __NEW_H__#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
//led初始化
void led_init();
void led1_init();
void led2_init();
void led3_init();//uart初始化
void uart4_init();
//接收一个字符
char get_char();
//接收一串字符
char *get_string();
//发送一个字符
void put_char(const char ch);
//发送一个字符串
void put_string(const char *sr);typedef enum{GPIO_RESET_T,GPIO_SET_T,
}status_t;#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 15typedef struct{char* cmd;//命令gpio_t* gpiox;//组号unsigned int pin;//引脚status_t status;//灯的状态void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status);//设置灯的状态
}cmd_t;/*
//灯亮
void led_on(int i);
//灯灭
void led_off(int i);
*/void hal_gpio_write(gpio_t* gpiox,unsigned int pin,status_t status);
cmd_t* find_command(char *string);
//比较字符串
int strcmp(char *arr,const char *src);#endif
源文件:
#include "new.h"
extern void printf(const char *fmt,...);
extern void delay_ms(int ms);
cmd_t cmd_arr[6] = {[0] = {.cmd = "led1on",.gpiox = GPIOE,.pin = GPIO_PIN_10,.status = GPIO_SET_T,.gpio_write_pin = hal_gpio_write,},[1] = {.cmd = "led1off",.gpiox = GPIOE,.pin = GPIO_PIN_10,.status = GPIO_RESET_T,.gpio_write_pin = hal_gpio_write,},[2] = {.cmd = "led2on",.gpiox = GPIOF,.pin = GPIO_PIN_10,.status = GPIO_SET_T,.gpio_write_pin = hal_gpio_write,},[3] = {.cmd = "led2off",.gpiox = GPIOF,.pin = GPIO_PIN_10,.status = GPIO_RESET_T,.gpio_write_pin = hal_gpio_write,},[4] = {.cmd = "led3on",.gpiox = GPIOE,.pin = GPIO_PIN_8,.status = GPIO_SET_T,.gpio_write_pin = hal_gpio_write,},[5] = {.cmd = "led3off",.gpiox = GPIOE,.pin = GPIO_PIN_8,.status = GPIO_RESET_T,.gpio_write_pin = hal_gpio_write,}
};
//led初始化
void led_init()
{/********RCC章节*********/RCC->MP_AHB4ENSETR |= (0x1 << 4);//GPIOE使能 RCC->MP_AHB4ENSETR |= (0x1 << 5);//GPIOF使能led1_init();led2_init();led3_init();
}void led1_init()
{/********GPIO章节********/GPIOE->MODER &= (~(0x3 << 20));GPIOE->MODER |= (0x1 << 20);//输出模式GPIOE->OTYPER &= (~(0x1 << 10));//推挽GPIOE->OSPEEDR &= (~(0x3 << 20));//低速GPIOE->PUPDR &= (~(0x3 << 20));//无上下拉
}void led2_init()
{/********GPIO章节********/GPIOF->MODER &= (~(0x3 << 20));GPIOF->MODER |= (0x1 << 20);//输出模式GPIOF->OTYPER &= (~(0x1 << 10));//推挽GPIOF->OSPEEDR &= (~(0x3 << 20));//低速GPIOF->PUPDR &= (~(0x3 << 20));//无上下拉
}void led3_init()
{/********GPIO章节********/GPIOE->MODER &= (~(0x3 << 16));GPIOE->MODER |= (0x1 << 16);//输出模式GPIOE->OTYPER &= (~(0x1 << 8));//推挽GPIOE->OSPEEDR &= (~(0x3 << 16));//低速GPIOE->PUPDR &= (~(0x3 << 16));//无上下拉
}//uart初始化
void uart4_init()
{/********RCC章节*********/RCC->MP_AHB4ENSETR |= (0x1 << 1);//GPIOB使能RCC->MP_AHB4ENSETR |= (0x1 << 6);//GPIOG使能RCC->MP_APB1ENSETR |= (0x1 << 16);//UART4使能/********GPIO章节********/GPIOB->MODER &= (~(0x3 << 4));GPIOB->MODER |= (0x2 << 4);//复用模式GPIOG->MODER &= (~(0x3 << 22));GPIOG->MODER |= (0x2 << 22);//复用模式GPIOB->AFRL &= (~(0xf << 8));GPIOB->AFRL |= (0x8 << 8);//设置复用功能RXGPIOG->AFRH &= (~(0xf << 12));GPIOG->AFRH |= (0x6 << 12);//设置复用功能TX/********uart4章节*******/if(USART4->CR1 & (0x1)){delay_ms(500);USART4->CR1 &= (~(0x1));//禁止UE}USART4->CR1 &= (~(0x1 << 12));USART4->CR1 &= (~(0x1 << 28));//设置8位数据位USART4->CR1 &= (~(0x1 << 10));//无奇偶校验位USART4->CR1 &= (~(0x1 << 15));//x16采样率USART4->CR2 &= (~(0x3 << 12));//无停止位USART4->PRESC &= (~(0xf));//一级分配USART4->BRR = 0x22B;//115200USART4->CR1 |= (0x1 << 2);//读端使能USART4->CR1 |= (0x1 << 3);//写端使能USART4->CR1 |= 0x1;//UE使能}
//接收一个字符
char get_char()
{char ch;//检查接收寄存器是否有数据可读while(!(USART4->ISR & (0x1 << 5)));//接收字符ch = USART4->RDR;put_char(ch);return ch;
}
//接收一串字符
char buf[50] = "";
char *get_string()
{int i;for(i = 0;(buf[i] = get_char()) != '\r';i++);buf[i] = '\0';put_char('\n');put_char('\r');put_string(buf);return buf;
}
//发送一个字符
void put_char(const char ch)
{while(!(USART4->ISR & (0x1 << 7)));USART4->TDR = ch;while(!(USART4->ISR & (0x1 << 6)));
}
//发送一个字符串
void put_string(const char *sr)
{for(int i=0;sr[i] != '\0';i++){put_char(sr[i]);}put_char('\n');put_char('\r');
}
/*
//灯亮
void led_on(int i)
{switch(i){case 1:GPIOE->ODR |= (0x1 << 10);//led1亮break;case 2:GPIOF->ODR |= (0x1 << 10);//led2亮break;case 3:GPIOE->ODR |= (0x1 << 8);//led3亮break;}
}//灯灭
void led_off(int i)
{switch(i){case 1:GPIOE->ODR &= (~(0x1 << 10));//led1灭break;case 2:GPIOF->ODR &= (~(0x1 << 10));//led2灭break;case 3:GPIOE->ODR &= (~(0x1 << 8));//led3灭break;}
}*/
//比较字符串
int strcmp(char *arr,const char *src)
{while(*arr != '\0' || *src != '\0'){if(*arr == *src){arr++;src++;}else{return (*arr - *src);}}return 0;
}void hal_gpio_write(gpio_t* gpiox,unsigned int pin,status_t status)
{if(1 == status) gpiox->ODR |= (0x1 << pin);elsegpiox->ODR &= (~(0x1 << pin));
}cmd_t* find_command(char *string)
{for(int i=0;i < 6;i++){if(strcmp(cmd_arr[i].cmd,string) == 0){return &cmd_arr[i];}}return 0;
}
Main文件:
#include "new.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()
{led_init();uart4_init();put_string("start....");while(1){char *string = get_string();cmd_t *arr = find_command(string);if(0 == arr){printf("error commond\n");}else{arr->gpio_write_pin(arr->gpiox,arr->pin,arr->status);} }return 0;
}
实现效果: