//main.c
#include "uart4.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()
{while(1){//将获取到的字符+1发送到终端//hal_put_char(hal_get_char()+1);hal_put_string( hal_set_string());}return 0;
}//uart4.h
#ifndef _UART4_H_
#define _UART4_H_
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"//初始化相关操作
void hal_uart4_init();
//发送一个字符
void hal_put_char(const char str);//发送一个字符串
void hal_put_string(const char* string);//接收一个字符
char hal_get_char();//接收一个字符串
char* hal_set_string();#endif//uart4.c
#include "uart4.h"
//PB2------>UART4_RX
//PG11------>UART4_TX
//初始化相关操作
void hal_uart4_init()
{//******************RCC章节初始化**********************////使能GPIOBRCC->MP_AHB4ENSETR |= (0x1 << 1);//使能GPIOGRCC->MP_AHB4ENSETR |=(0x1 << 6);//使能UART4RCC->MP_APB1ENSETR |=(0x1 << 16);//*************GPIO章节初始化**************************////1.设置PB2引脚为复用功能模式 MODER[5:4] 设为 10GPIOB->MODER &= (~(0x3 << 4));GPIOB->MODER |= (0x1 << 5);//2.设置PB2引脚复用功能为UART4_RX AFRL[11:8] 1000GPIOB->AFRL &= (~(0xf << 8));GPIOB->AFRL |= (0x1 << 11);//1.设置PG11引脚为复用功能模式 MODER[23:22] 设为 10GPIOG->MODER &= (~(0x3 << 22));GPIOG->MODER |= (0x1 << 23);//2.设置PG11引脚为复用功能为UART4_TX AFRH[15:12] 0110GPIOG->AFRH &= (~(0xf << 12));GPIOG->AFRH |= (0x3 << 13);//UART4章节初始化//1.设置1位起始位,8位数据位USART4->CR1 &= (~(0x1)); //UE=0USART4->CR1 &= (~(0x1) << 12); //M0USART4->CR1 &= (~(0x1) << 28); //M1//2.没有奇偶效验位 PCE[10] 0USART4->CR1 &= (~(0x1) << 10);//3.设置1位停止位 STOP[13:12] 00USART4->CR2 &= (~(0x3) << 12); //4.设置16倍采样率 OVER8[15] 0USART4->CR1 &= (~(0x1) << 15);//5.设置串口不分频 PRESCALER[4:0] 0000USART4->PRESC =0x0000;//6.设置串口波特率为115200USART4->BRR = 0x22b;//7.设置串口发送器使能USART4->CR1 |= (0x1 << 3); //8.设置串口接收器使能USART4->CR1 |= (0x1 << 2);//9.设置串口使能USART4->CR1 |= 0x1;}//发送一个字符
void hal_put_char(const char str)
{//1.判断发送数据寄存器是否为空ISR[7]//特点:为空发送下一位数据 未满需要等待//读0: 满,需要等待 读1:发送数据while(!(USART4->ISR & (0x1 << 7)));//2.将发送的内容,赋值给发送数据寄存器USART4->TDR = str;//3.判断一帧数据是否发送完成 ISR[6]//读0:没有发送完成,需要等待 读1:发送完成while(!(USART4->ISR & (0x1 << 6)));}//发送一个字符串
void hal_put_string(const char* string)
{//1.判断发送数据寄存器是否为空ISR[7]while(!(USART4->ISR & (0x1 << 7)));//判断是否为'\0',为'\0'结束发送while(*(string)){USART4->TDR = *(string);string++;while(!(USART4->ISR & (0x1 << 6)));}hal_put_char('\n');hal_put_char('\r');
}//接收一个字符
char hal_get_char()
{//1.判断接收数据数据寄存器中是否接收到数据 ISR[5]//状态为0则一直等待while(!(USART4->ISR & (0x1 << 5))); //2.将接收数据寄存器(RDR)中的内容读取出来char buf = USART4->RDR;return buf;
}char buf[100];
//接收一个字符串
char* hal_set_string()
{//循环进行接收int i=0;while(1){//获取一个字符buf[i]=hal_get_char();//将该字符显示到终端hal_put_char(buf[i]);if(buf[i]=='\r') break;i++;}buf[i]='\0';hal_put_char('\r');hal_put_char('\n');return buf;
}