uart4.c
#include "uart4.h"
//UART4_RX ====> PB2
//UART4_TX ====> PG11
char rebuf[51] = {0};
//rcc/gpio/uart4初始化
void hal_uart4_init()
{
/********RCC章节初始化*******/
//1.使能GPIOB组控制器 MP_AHB4ENSETR[1] = 1
RCC->MP_AHB4ENSETR |= (0x1 << 1);
//2.使能GPIOG组控制器 MP_AHB4ENSETR[6] = 1
RCC->MP_AHB4ENSETR |= (0x6 << 1);
//3.使能UART4组控制器 MP_AHB4ENSETR[16] = 1
RCC->MP_APB1ENSETR |= (0x1 << 16);
/********GPIO章节初始化*******/
//1.将PB2和PG11设为复用功能模式
GPIOB->MODER &= (~(0x3 << 4));//PB2
GPIOB->MODER |= (0x2 << 4);
GPIOG->MODER &= (~(0x3 << 22));//PG11
GPIOG->MODER |= (0x2 << 22);
//2.设置PB2和PG11引脚复用的功能
GPIOB->AFRL &= (~(0xF << 8));//PB2
GPIOB->AFRL |= (0x8 << 8);
GPIOB->AFRH &= (~(0xF << 12));//PG11
GPIOB->AFRH |= (0x6 << 12);
/********UART章节初始化*******/
//1.设置初始化相关操作
USART4->CR1 &= (~(0x1 << 12));
USART4->CR1 &= (~(0x1 << 28));//设置8位数据位
USART4->CR1 &= (~(0x1 << 15));//设置16倍采样率
USART4->CR1 &= (~(0x1 << 10));//设置无校验位
USART4->CR1 |= (0x1 << 3);//设置无发送位使能
USART4->CR1 |= (0x1 << 2);//设置接收位使能
USART4->CR1 |= 0x1;//设置串口使能
//2.设置停止位
USART4->CR2 &= (~(0x3 << 12));//设置串口位停止位
//3.设置串口分频
USART4->PRESC &= (~(0xF));
//4.设置串口波特率
USART4->BRR |= 0x22B;
}
//发送一个字符
void hal_put_char(const char str)
{
//判断发送寄存器是否为空
while(!(USART4->ISR) & (0x1 << 7))
{
USART4->TDR = str;
}
//判断是否发送完毕
while(!(USART4->ISR) & (0x1 << 6))
{
return;
}
}
//发送一个字符串
void hal_put_string(const char* string)
{
while(*string)
{
hal_put_char(*string++);
}
hal_put_char('\n');
hal_put_char('\r');
}
//接收一个字符
char hal_get_char()
{
char str = 0;
//判断是否接收到数据
while(!(USART4->ISR) &(0x1 << 5))
{
str = USART4->RDR;
}
return str;
}
//接收一个字符串
char* hal_get_string()
{
int i;
for(i = 0;i < 50;i++)
{
rebuf[i] = hal_get_char();
hal_put_char(rebuf[i]);
//判断是否接收完毕
if(rebuf[i] == '\r')
{
break;
}
}
rebuf[i] = '\0';
hal_put_char('\n');
hal_put_char('\r');
return rebuf;
}
uart4.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.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
main.c
#include "uart4.h"
int main()
{
//串口初始化
hal_uart4_init();
//char str;
char *string;
while(1)
{
//串口读取字符
//str = hal_get_char();
//将字符+1并发回去
//hal_put_char(str+1);
//串口读取字符串
string = hal_get_string();
//将字符串发回去
hal_put_string(string);
}
return 0;
}