uart4.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
//初始化串口函数
void hal_uart4_init();
//发送一个字符
void put_char(const char str);
//发送一个字符串
void put_string(const char* string);
//接收一个字符
char get_char();
//接收一个字符串
char * get_string();
void char_fun();
void string_fun();
#endif
uart4.c
#include "uart4.h"
extern void delay_ms(unsigned int ms);
//初始化串口函数
void hal_uart4_init()
{
//rcc初始化
RCC->MP_AHB4ENSETR |= (1 << 1); //使能GPIOB组控制器
RCC->MP_AHB4ENSETR |= (1 << 6); //使能GPIOG组控制器
//RCC->MP_AHB1ENSETR |= (1 << 16); //使能UART4组控制器
//gpio初始化
GPIOB->MODER &= (~(3 << 4));
GPIOB->MODER |= (2 << 4); //设置PB2引脚为UART4_RX
GPIOG->MODER &= (~(3 << 22));
GPIOG->MODER |= (2 << 22); //设置PG11引脚为UART4_TX
GPIOB->AFRL &= (~(0xf << 8));
GPIOB->AFRL |= (8 << 8); //设置PB2引脚复用功能为UART4_RX
GPIOG->AFRH &= (~(0xf << 12));
GPIOG->AFRH |= (6 << 12); //设置PG11引脚复用功能为UART4_TX
//UART初始化
RCC->MP_APB1ENSETR = (1 << 16); //使能UART4外设的时钟
if(USART4->CR1 & (0x1 << 0)){ //判断UART4串口是否使能,如果使能则禁止串口
delay_ms(2000);
USART4->CR1 &= (~(0x1 << 0));
}
USART4->CR1 &= (~(1 << 12));
USART4->CR1 &= (~(1 << 28)); //设置串口1位起始位,8位数据位
USART4->CR1 &= (~(1 << 15)); //设置串口16倍采样率
USART4->CR1 &= (~(1 << 10)); //无奇偶校验位
USART4->CR1 |= (1 << 3); //使能串口发送器
USART4->CR1 |= (1 << 2); //使能串口接收器
USART4->CR1 |= (1 << 0); //设置串口位使能
USART4->CR2 &= (~(3 << 12)); //设置串口1位停止位
USART4->BRR = 0x22b; //设置串口的波特率为115200
USART4->PRESC &= (~(0xf << 0)); //设置串口不分频
}
//发送一个字符
void put_char(const char str)
{
//判断发送数据寄存器是否为空,为空才可以发送下一字节数据
while(!(USART4->ISR & (0x1 << 7))); //不为空,等待发送数据寄存器为空
USART4->TDR = str;
}
//发送一个字符串
void put_string(const char* string)
{
//判断字符串是否结束'\0'
while(*string != '\0'){
put_char(*string);
string++;
}
}
//接收一个字符
char get_char()
{
//1.判断接收数据寄存器是否有数据
while (!(USART4->ISR & (1 << 5)));
char str;
str = (char)USART4->RDR;
return str;
}
//接收一个字符串
char buffer[64] = {0};
char * get_string()
{
//循环实现接收
//循环实现:接收一个字符,回显一个字符
//键盘回车键按下后,对应字符是'\r'
int len = 64;
int i;
for(i=0; i<len-1; i++){
buffer[i] = get_char();
put_char(buffer[i]);
if(buffer[i] == '\r'){
break;
}
}
buffer[i] = '\0';
put_char('\n');
return buffer;
}
void char_fun()
{
char str;
// 发送一个字母,输出这个字母后面那个字母
str = get_char();
put_char(str + 1);
}
void string_fun()
{
char *string;
// 输入一个字符串,输出这个字符串
string = get_string(buffer);
put_string(string);
put_char('\n');
put_char('\r');
}
main.c
#include "./include/uart4.h"
extern void printf(const char *fmt, ...);
void delay_ms(unsigned int ms)
{
int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 1800; j++);
}
extern char buffer[64];
int main()
{
hal_uart4_init(); // 串口的初始化
put_string("please input >>>\n\r");
while (1)
{
//char_fun(); //输入一个字母,输出字母表中这个字母后面的字母
string_fun(); //输入一个字符串,输出这个字符串
}
return 0;
}
效果展示