led.h
l
#ifndef __LED_H__#define __LED_H__#define RCC_GPIO (*(unsigned int *)0x50000a28)#define GPIOE_MODER (*(unsigned int *)0x50006000)#define GPIOF_MODER (*(unsigned int *)0x50007000)#define GPIOE_OTYPER (*(unsigned int *)0x50006004)#define GPIOF_OTYPER (*(unsigned int *)0x50007004)#define GPIOE_OSPEEDR (*(unsigned int *)0x50006008)#define GPIOF_OSPEEDR (*(unsigned int *)0x50007008)#define GPIOE_PUPDR (*(unsigned int *)0x5000600C)#define GPIOF_PUPDR (*(unsigned int *)0x5000700c)#define GPIOE_ODR (*(unsigned int *)0x50006014)#define GPIOF_ODR (*(unsigned int *)0x50007014)void all_led_init();void led1_on();void led1_off();void led2_on();void led2_off();void led3_on();void led3_off();#endif
led.c
#include "led.h"void all_led_init(){RCC_GPIO |= (0X3<<4);//时钟使能GPIOE_MODER &=(~(0X3<<20));//设置PE10输出GPIOE_MODER |= (0X1<<20);//设置PE10为推挽输出GPIOE_OTYPER &=(~(0x1<<10));//PE10为低速输出GPIOE_OSPEEDR &= (~(0x3<<20));//设置无上拉下拉GPIOE_PUPDR &= (~(0x3<<20));//LED2GPIOF_MODER &=(~(0X3<<20));//设置Pf10输出GPIOF_MODER |= (0X1<<20);//设置Pf10为推挽输出GPIOF_OTYPER &=(~(0x1<<10));//Pf10为低速输出GPIOF_OSPEEDR &= (~(0x3<<20));//设置无上拉下拉GPIOF_PUPDR &= (~(0x3<<20));//LED3GPIOE_MODER &=(~(0X3<<16));//设置PE8输出GPIOE_MODER |= (0X1<<16);//设置PE8为推挽输出GPIOE_OTYPER &=(~(0x1<<8));//PE8为低速输出GPIOE_OSPEEDR &= (~(0x3<<16));//设置无上拉下拉GPIOE_PUPDR &= (~(0x3<<16));}void led1_on(){GPIOE_ODR |= (0x1<<10);}void led1_off(){GPIOE_ODR &= (~(0x1<<10));}void led2_on(){GPIOF_ODR |= (0x1<<10);}void led2_off(){GPIOF_ODR &= (~(0x1<<10));}void led3_on(){GPIOE_ODR |= (0x1<<8);}void led3_off(){GPIOE_ODR &= (~(0x1<<8));}
uart4.h
#ifndef __UART4_H__#define __UART4_H__#include"stm32mp1xx_rcc.h"#include"stm32mp1xx_gpio.h"#include"stm32mp1xx_uart.h"void uart4_config();void putchar(char a);char getchar();void gets(char *s);void puts(char *s);int strcmp(char *s1,char *s2);#endif
uart4.c
#include"uart4.h"void uart4_config(){//1.使能GPIOB\GPIOG\UART4外设时钟RCC->MP_AHB4ENSETR |= (0x1<MP_AHB4ENSETR |= (0x1<MP_APB1ENSETR |= (0x1<MODER &= (~(0x3<MODER |= (0x2<AFRH &= (~(0xf<AFRH |= (0x6<MODER &= (~(0x3<MODER |= (0x2<AFRL &= (~(0xF<AFRL |= (0x8<CR1 &= (~0x1);//3.设置数据位宽为8位USART4->CR1 &= (~(0x1<CR1 &= (~(0x1<CR1 &= (~(0x1<CR1 &= (~(0x1<CR2 &= (~(0x3<PRESC &= (~0xf);//8.设置波特率为115200USART4->BRR=0X22B;//9.使能发送器USART4->CR1 |= (0x1<CR1 |= (0x1<CR1 |= (0x1);}void putchar(char a){//1.先判断发送器是否为空,不为空等待while(!(USART4->ISR &(0x1<TDR=a;//3.等待发送完成while(!(USART4->ISR &(0x1<ISR &(0x1<RDR;//3.返回return a;}//发送一个字符串void puts(char *s){while(*s){putchar(*s);s++;}putchar('\r');putchar('\n');}//接收一个字符串void gets(char *s){while(1){*s=getchar();putchar(*s);//键盘输入的内容在串口上回显if(*s=='\r')break;s++;}*s='\0';putchar('\n');}//字符串比较int strcmp(char *s1,char *s2){int i = 0;while((*(s1+i)) == (*(s2+i))){if((*(s1+i)) == '\0'){break; } i++;}return ((*(s1+i)) - (*(s2+i)));}
main.c
#include"uart4.h"#include"led.h"int main(){char buf[128]; //存储字符串char *led1on = "led1on";char *led1off = "led1off";char *led2on = "led2on";char *led2off = "led2off";char *led3on = "led3on";char *led3off = "led3off";uart4_config();//uart4初始化all_led_init();//所有灯初始化while(1){gets(buf);puts(buf);if(strcmp(buf,led1on) == 0){led1_on();}else if(strcmp(buf,led2on) == 0){led2_on();}else if(strcmp(buf,led3on) == 0){led3_on();}elseif(strcmp(buf,led1off) == 0){led1_off();}else if(strcmp(buf,led2off) == 0){led2_off();}else if(strcmp(buf,led3off) == 0){led3_off();}}}