uatr.c
#include "uartt.h"
//串口数据初始化
void uart4_init()
{
//led灯的设置
//1.使能外设时钟
(*((unsigned int*)0X50000A28)) |= (0x3<<4);
//2.设置PF10 PE10 PE8为输出输出
(*((unsigned int*)0X50006000)) &= (~(0x3<<20));
(*((unsigned int*)0X50006000)) |= (0x1<<20);
(*((unsigned int*)0X50007000)) &= (~(0x3<<20));
(*((unsigned int*)0X50007000)) |= (0x1<<20);
(*((unsigned int*)0X50006000)) &= (~(0x3<<16));
(*((unsigned int*)0X50006000)) |= (0x1<<16);
//3.设置推挽输出
(*((unsigned int*)0X50006004)) &= (~(0x1<<10));
(*((unsigned int*)0X50007004)) &= (~(0x1<<10));
(*((unsigned int*)0X50006004)) &= (~(0x1<<8));
//4.设置输出速度为低速
(*((unsigned int*)0X50006008)) &= (~(0x3<<20));
(*((unsigned int*)0X50007008)) &= (~(0x3<<20));
(*((unsigned int*)0X50006008)) &= (~(0x3<<16));
//5.设置无上拉下拉
(*((unsigned int*)0X5000600c)) &= (~(0x3<<20));
(*((unsigned int*)0X5000700c)) &= (~(0x3<<20));
(*((unsigned int*)0X5000600c)) &= (~(0x3<<16));
// 串口相关设置
//1.UART4和GPIOB/GPIOG的时钟使能
RCC->MP_AHB4ENSETR |=(0x1<<2);
RCC->MP_AHB4ENSETR |=(0x1<<6);
RCC->MP_APB1ENSETR |=(0x1<<16);
//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.设置没有奇偶校验USART->的第十位为0
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.发送器.接受器使能
//11.串口使能
USART4->CR1&=(~(0xF));
USART4->CR1|=(0xD);
}
//封装函数发送一个字符数据
void myputchar(char c)
{
//判断发送寄存器中是否有数据
while(!(USART4->ISR&(0x1<<7)));
USART4->TDR=c;
while(!(USART4->ISR&(0x1<<6)));
}
char mygetchar()
{
char c;
//判断是否有数据准备好
while(!(USART4->ISR&(0x1<<5)));
c=USART4->RDR;
return c;
}
void led_on()
{
(*((unsigned int*)0X50006014)) |= (0x1<<10);
(*((unsigned int*)0X50007014)) |= (0x1<<10);
(*((unsigned int*)0X50006014)) |= (0x1<<8);
}
void led_off()
{
(*((unsigned int*)0X50006014)) &= (~(0x1<<10));
(*((unsigned int*)0X50007014)) &= (~(0x1<<10));
(*((unsigned int*)0X50006014)) &= (~(0x1<<8));
}
main.c
#include "uartt.h"
int main()
{
//1.串口初始化
uart4_init();
char a;
while(1)
{
myputchar('\n');
myputchar('\r');
//2.从串口读取一个字符
a=mygetchar();
if (a=='a')
{
led_on();
}
else if(a=='b')
{
led_off();
}
myputchar(a+1);
}
return 0;
}
uatr.h
#ifndef __UARTT_H__
#define __UARTT_H__
#include"stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
void uart4_init();
void myputchar(char i);
char mygetchar();
void led_on();
void led_off();
#endif