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);//使能gpiob
RCC->MP_AHB4ENSETR |=(0x1<<6);//使能gpiog
RCC->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.设置波特率为115200bps
USART4->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