uart4.h
cs
#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
cs
#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=0
USART4->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);
//设置串口波特率115200
USART4->BRR=0X22b;
//串口使能 UE=1
USART4->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
cs
#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;
}
结果