20230427 A7核综合实验

出现的问题  忘记删除字符\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);
//操作GPIO接口写函数
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章节初始化
	RCC->MP_AHB4ENSETR|=(0x1<<1);
	RCC->MP_AHB4ENSETR|=(0x1<<6);
	RCC->MP_APB1ENSETR|=(0x1<<16);
	//GPIO初始化
	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);
	
	//uart初始化函数
	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)
{
	//判断是否为'\0'一个字符一个字符发送
	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
	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');
	//判断字符是否为‘\r’,break
	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);
}

//操作GPIO接口写函数

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值