出现的问题 忘记删除字符\r 解决
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include"stm32mp1xx_uart.h"
#if 1
void hal_uart_init();
void hal_put_char(const char str);
void hal_put_string(const char *string);
char hal_get_char();
char* hal_get_string();
#define MAX 6
typedef enum{
LED1,
LED2,
LED3
}LED_T;
typedef enum{
LED_ON,
LED_OFF
}GPIO_STATUS_T;
typedef struct{
char*cmd_arr;
LED_T led;
GPIO_STATUS_T status;
void(*led_status_t)(LED_T led,GPIO_STATUS_T status);
}cmd_t;
cmd_t*find_command(const char*buffer);
void led_status_t(LED_T led,GPIO_STATUS_T status);
#endif
typedef enum{
INPUT,
OUTPUT,
ALT,
ANALOG
}gpio_moder_t;
typedef enum{
PUSH_PULL,
OPEN_DRAIN
} gpio_type_t;
typedef enum{
LOW_SPEED,
MEDIUM_SPEED,
HIGH_SPEED,
VERY_HIGH_SPEED
}gpio_speed_t;
typedef enum{
NO_pull_up_pull_down,
PULL_UP,
PULL_DOWN,
RESERVED
}gpio_pupdr_t;
typedef enum{
GPIO_RESET_T,
GPIO_SET_T
}gpio_status_t;
typedef struct{
gpio_moder_t moder;
gpio_type_t type;
gpio_speed_t speed;
gpio_pupdr_t pupdr;
}gpio_init_t;
#define GPIO_PIN_8 8
#define GPIO_PIN_10 10
void hal_gpio_init(gpio_t* gpiox,unsigned int pin,gpio_init_t* init);
void hal_gpio_write(gpio_t*gpiox,unsigned int pin,gpio_status_t status);
#endif
#include "key.h"
#if 1
cmd_t arr[MAX]={
[0]={
.cmd_arr="led1on",
.led=LED1,
.status=LED_ON,
.led_status_t=led_status_t,
},
[1]={
.cmd_arr="led1off",
.led=LED1,
.status=LED_OFF,
.led_status_t=led_status_t,
},
[2]={
.cmd_arr="led2on",
.led=LED2,
.status=LED_ON,
.led_status_t=led_status_t,
},
[3]={
.cmd_arr="led2off",
.led=LED2,
.status=LED_OFF,
.led_status_t=led_status_t,
},
[4]={
.cmd_arr="led3on",
.led=LED3,
.status=LED_ON,
.led_status_t=led_status_t,
},
[5]={
.cmd_arr="led3off",
.led=LED3,
.status=LED_OFF,
.led_status_t=led_status_t,
},
};
void led_status_t(LED_T led,GPIO_STATUS_T status)
{
if(led==LED1){
if(status==LED_ON){
hal_gpio_write(GPIOE,GPIO_PIN_10,GPIO_SET_T);
}
else{
hal_gpio_write(GPIOE,GPIO_PIN_10,GPIO_RESET_T);
}
}
if(led==LED2){
if(status==LED_ON){
hal_gpio_write(GPIOF,GPIO_PIN_10,GPIO_SET_T);
}
else{
hal_gpio_write(GPIOF,GPIO_PIN_10,GPIO_RESET_T);
}
}
if(led==LED3){
if(status==LED_ON){
hal_gpio_write(GPIOE,GPIO_PIN_8,GPIO_SET_T);
}
else{
hal_gpio_write(GPIOE,GPIO_PIN_8,GPIO_RESET_T);
}
}
}
int strcmp(const char* buffer,const char* temp)
{
while(*buffer!='\0' || *temp!='\0')
{
if(*buffer != *temp)
return -1;
buffer++;
temp++;
}
return 0;
}
cmd_t*find_command(const char*buffer)
{
int i;
for( i=0;i<MAX;i++){
if(!(strcmp(buffer,arr[i].cmd_arr))){
return &arr[i];
}
}
return 0;
}
void hal_uart_init()
{
RCC->MP_AHB4ENSETR|=(0x1<<1);
RCC->MP_AHB4ENSETR|=(0x1<<6);
RCC->MP_APB1ENSETR|=(0x1<<16);
GPIOB->MODER&=(~(0x3<<4));
GPIOB->MODER|=(0x2<<4);
GPIOB->AFRL&=(~(0xF<<8));
GPIOB->AFRL|=(0x8<<8);
GPIOG->MODER&=(~(0x3<<22));
GPIOG->MODER|=(0x2<<22);
GPIOG->AFRH&=(~(0xF<<12));
GPIOG->AFRH|=(0x6<<12);
USART4->CR1|=(0x1);
USART4->CR1|=(0x1<<2);
USART4->CR1|=(0x1<<3);
USART4->CR1&=(~(0x1<<10));
USART4->CR1&=(~(0x1<<15));
USART4->CR1&=(~(0x1<<12));
USART4->CR1|=(~(0x1<<28));
USART4->CR2&=(~(0x3<<12));
USART4->BRR&=0;
USART4->BRR|=(0x22B);
USART4->PRESC&=0;
}
void hal_put_char(const char str)
{
while(!(USART4->ISR&(0x1<<7)));
USART4->TDR&=0;
USART4->TDR=str;
while(!(USART4->ISR&(0x1<<6)));
}
void hal_put_string(const char *string)
{
const char *p=string;
while(*p!='\0'){
hal_put_char(*p);
p++;
}
hal_put_char('\n');
}
char hal_get_char()
{
char ch;
while(!(USART4->ISR&(0x1<<5)));
ch=USART4->RDR;
return ch;
}
char* hal_get_string()
{
static char buf[128];
for(int i=0;i<128;i++){
buf[i]=0;
}
int i=0;
while(1){
buf[i]=hal_get_char();
hal_put_char(buf[i]);
if(buf[i]=='\r'){
buf[i] = '\0';
break;
}
i++;
}
hal_put_char('\0');
hal_put_char('\n');
return buf;
}
#endif
void hal_gpio_init(gpio_t* gpiox,unsigned int pin,gpio_init_t* init)
{
(*(volatile unsigned int *)0x50000A28) |=(0x1<<pin/2);
gpiox->MODER &=(~(0x3<<(pin*2)));
gpiox->MODER |=(init->moder<<(pin*2));
gpiox->OTYPER&=(~(0x1<<pin));
gpiox->OTYPER|=(init->type<<pin);
gpiox->OSPEEDR&=(~(0x3<<pin*2));
gpiox->OSPEEDR |=(init->speed<<pin*2);
gpiox->PUPDR&=(0x3<<pin*2);
gpiox->PUPDR|=(init->pupdr<<pin*2);
}
void hal_gpio_write(gpio_t*gpiox,unsigned int pin,gpio_status_t status)
{
if(status==1){
gpiox->ODR |= (0x1<<pin);
}
else if(status==0){
gpiox->ODR &= (~(0x1<<pin));
}
}
#include "key.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()
{
gpio_init_t gpio_init;
gpio_init.moder=OUTPUT;
gpio_init.type=PUSH_PULL;
gpio_init.speed=LOW_SPEED;
gpio_init.pupdr=NO_pull_up_pull_down;
hal_gpio_init(GPIOE,GPIO_PIN_10,&gpio_init);
hal_gpio_init(GPIOF,GPIO_PIN_10,&gpio_init);
hal_gpio_init(GPIOE,GPIO_PIN_8,&gpio_init);
#if 1
hal_uart_init();
while(1){
char *str=0;
str=hal_get_string();
cmd_t*p=0;
p=find_command(str);
if(p==0){
printf("this is not found\n");
}
else{
p->led_status_t(p->led,p->status);
}
}
#endif
return 0;
}