main.c
#include "uartt.h"//封装延时函数void delay(int ms){int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++);}}int main(){//串口初始化uart4_init();//灯初始化led_init();//char a;char *s;while(1){myputchar('\n');myputchar('\r');//从串口读取一个字符// a=mygetchar();// myputchar(a+1);s = mygets();//myputs(s);if( mystrcmp(s,"led_on")==0){//开灯led_on();//myputs(s);}if(mystrcmp(s,"led_off")==0){//关灯led_off();//myputs(s);}}return 0;}
uartt.c
#include "uartt.h"char buf[51];
//串口数据初始化
void uart4_init()
{//1.uart和gpiob gpiog的时钟使能RCC->MP_AHB4ENSETR |=(0x1<<2);//使能gpiobRCC->MP_AHB4ENSETR |=(0x1<<6);//使能gpiogRCC->MP_APB1ENSETR |=(0X1<<16);//使能uart4时钟//2.设置pb2和pg11的管脚复用GPIOB->MODER &= (~(0X3<<4));GPIOB->MODER |=(0X2<<4);//设置复用GPIOB->AFRL &=(~(0xF<<8));GPIOB->AFRL |=(0X8<<8);//设置uart4功能复用GPIOG->MODER &= (~(0X3<<22));GPIOG->MODER |=(0X2<<22);//设置复用GPIOG->AFRL &=(~(0xF<<12));GPIOG->AFRL |=(0X6<<12);//设置uart4功能复用//3.先去设置串口禁用,方便设置数据格式USART4->CR1 &=(~0X1);//4.设置8位数据位USART4->CR1 &=(~(0X1<<12));USART4->CR1 &=(~(0X1<<28));//5.设置有没有奇偶校验USART4->CR1 &=(~(0X1<<10));//6.设置16倍采样USART4->CR1 &=(~(0X1<<15));//7.设置1位停止位USART4->CR2 &=(~(0X3<<12));//8.设置1分频USART4->PRESC &=(~(0XF));//9.设置波特率为115200bpsUSART4->BRR |=(0x22B);//10.发送器.接收器使能USART4->CR1 |=(0X1<<3);USART4->CR1 |=(0X1<<2);//11.串口使能USART4->CR1 |=0X1;
}void led_init(){//使能RCC->MP_AHB4ENSETR |=(0XC3<<4);GPIOE->MODER &=(~(0X3<<20));GPIOE->MODER |= (0X1<<20);//设置推挽输出GPIOE->OTYPER &=(~(0X1<<10));//设置输出速度为低速GPIOE->OSPEEDR &=(~(0x3<<20));//设置无上拉下拉GPIOE->PUPDR &=(~(0x3<<20));}void led_on(){GPIOE->ODR |=(0X1<<10);}void led_off(){GPIOE->ODR &=(~(0X1<<10));}
//封装函数发送一个字符数据
void myputchar(char i)
{//1.判断TDR寄存器是否为空,如果为空,向TDR寄存器写入数据//1为不满 0为满while(!(USART4->ISR&(0x1<<7)));USART4->TDR = i;//2.阻塞等待数据传输完成,函数返回//1表示完成 while(!(USART4->ISR&(0X1<<6)));
}char mygetchar()
{char c;//判断RDR寄存器是否有就绪的数据,如果有就读取,没有就等待while(!(USART4->ISR&(0x1<<5)));c = USART4->RDR;return c;
}void myputs(char *s)
{while(*s){myputchar(*s);s++;}myputchar('\n');myputchar('\r');
}char * mygets()
{unsigned int i;for(i=0;i<50;i++){buf[i]=mygetchar();myputchar(buf[i]);if(buf[i]=='\r'){break;}}buf[i]='\0';myputchar('\n');return buf;
}int mystrcmp(char* p,char* q)
{while(*p==*q&&*p!='\0'){p++;q++;}if(*p>*q){return 1;}else if(*p<*q){return -1;}else{return 0;}
}
uartt.h
#ifndef __UARTT_H__
#define __UARTT_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
void uart4_init();
void led_init();
void myputchar(char i);
char mygetchar();
void myputs(char *s);
char * mygets();
int mystrcmp(char* p,char* q);void led_on();void led_off();#endif