uart4.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
//rcc/gpio/uart4初始化
void hal_uart4_init();
//发送一个字符
void hal_put_char(const char str);
//发送一个字符串
void hal_put_string(const char* string);
//接收一个字符
char hal_get_char();
//接收一个字符串
char* hal_get_string();
#endif
uarrt4.c
#include "uart4.h"
char buf[65]="";
//rcc/gpio/uart4初始化
void hal_uart4_init()
{/******RCC初始化*************///使能GPIOB控制器RCC->MP_AHB4ENSETR |=(0X1<<1);//使能GPIOG控制器RCC->MP_AHB4ENSETR |=(0X1<<6);//使能UART4控制器RCC->MP_APB1ENSETR |=(0X1<<16);/******GPIO初始化*************///PB2复用模式GPIOB->MODER &=(~(0X3<<4));GPIOB->MODER |=(0X2<<4);//PG11复用模式GPIOB->MODER &=(~(0X3<<22));GPIOB->MODER |=(0X2<<22);//PB2为UART_RX复用模式GPIOB->AFRL &=(~(0XF<<8));GPIOB->AFRL |=(0X8<<8);//PG11为UART_TX复用模式GPIOB->AFRL &=(~(0XF<<12));GPIOB->AFRL |=(0X6<<12);/******UART初始化*************///禁用串口 UE=0USART4->CR1 &=(~0X1);//设置8位数据位USART4->CR1 &=(~(0X1<<12));USART4->CR1 &=(~(0X1<<28)); //设置16倍采样率USART4->CR1 &=(~(0X1<<15));//设置无校验位USART4->CR1 &=(~(0X1<<10));//设置发送位使能USART4->CR1 |=(0X1<<3);//设置接收位使能USART4->CR1 |=(0X1<<2);//串口1位停止位USART4->CR2 &=(~(0X3<<12));//串口不分频USART4->PRESC &=(~0XF);//设置串口波特率115200USART4->BRR=0X22b;//串口使能 UE=1USART4->CR1 |=(0X1);
}//发送一个字符
void hal_put_char(const char str)
{//判断发送数据寄存器是否为空,不为空则阻塞等待while(!(USART4->ISR&(0X1<<7)));//当为空时将数据写入到数据发送寄存器USART4->TDR=str;//阻塞等待数据发送完毕,函数结束while(!(USART4->ISR&(0X1<<6)));
}//发送一个字符串
void hal_put_string(const char* string)
{while(*string){hal_put_char(*string);string++;}//发送完字符串让光标显示在下一行最开头hal_put_char('\n');hal_put_char('\r');
}//接收一个字符
char hal_get_char()
{//判断接收数据寄存器中有没有有效数据。如果没有就阻塞等待,如果有直接读取while(!(USART4->ISR&(0X1<<5)));//将读取的数据返回return USART4->RDR;
}//接收一个字符串
char* hal_get_string()
{unsigned int a;for(a=0;a<64;a++){buf[a]=hal_get_char();hal_put_char(buf[a]);if(buf[a]=='\r'){break;}}buf[a]='\0';hal_put_char('\n');hal_put_char('\r');return buf;
}
main.c
#include "uart4.h"
// 手动封装一个延时函数
void delay_ms(int ms)
{int i, j;for (i = 0; i < ms; i++){for (j = 0; j < 2000; j++){}}
}
int main()
{void hal_uart4_init();//char a;// char buf[32];while(1){/*a=hal_get_char();//读取一个字符hal_put_char(a+1);//将读取到的字符+1返回 win下换行符是'\n',回车键对应的字符是'\r'hal_put_char('\n');hal_put_char('\r');*///读取字符串hal_put_string(hal_get_string());}return 0;
}
结果