uart4.h
#ifndef __H__
#define __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
uart4.c
#ifndef __H__
#define __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
ubuntu@ubuntu:~/ARM00/04uart_4/include$ cd ..
ubuntu@ubuntu:~/ARM00/04uart_4$ cd src
ubuntu@ubuntu:~/ARM00/04uart_4/src$ cat uart4.c
#include "uart4.h"
//RCC/GPIO/UART4章节初始化
void hal_uart4_init()
{
//RCC章节初始化
//1.使能GPIOB组控制器
RCC->MP_AHB4ENSETR |= (0x1 << 1);
//2.使能GPIOG组控制器
RCC->MP_AHB4ENSETR |= (0x1 << 6);
//3.使能UART4组控制器
RCC->MP_APB1ENSETR |= (0x1 << 16);
//GPIO章节初始化
//1.设置PB2引脚为复用功能
GPIOB->MODER &= (~(0x3 << 4));
GPIOB->MODER |= (0x1 << 5);
//2.设置PB2引脚复位功能为UART4_RX
GPIOB->AFRL &= (~(0xf << 8));
GPIOB->AFRL |= (0x1 << 11);
//1.设置PG11引脚为复用功能
GPIOG->MODER &= (~(0x3 << 22));
GPIOG->MODER |= (0x1 << 23);
//2.设置PG11引脚复位功能为UART4_TX
GPIOB->AFRH &= (~(0xf << 12));
GPIOB->AFRH |= (0x3 << 13);
//UART4章节初始化
//0.设置UE=0
USART4->CR1 |= (0X1);
//1.设置UART4串口1位起始位,8位数据位 CR1[28][12]=00
USART4->CR1 &= (~(0X1 << 12));
USART4->CR1 &= (~(0X1 << 28));
//2.设置UART4串口没有校验位 CR1[10]=0
USART4->CR1 &= (~(0X1 << 10));
//3.设置UART4串口1位停止位 CR2[13:12] = 00
USART4->CR2 &=(~(0X3 << 12));
//4.设置UART4串口16倍采样率 CR1 [15]= 0
USART4->CR1 &=(~(0X1 << 15));
//5.设置UART4串口不分频 PRESC[3:0] = 0000
USART4-> PRESC &= (~(0Xf));
//6.设置UART4串口波特率为115200 BRR =0x22B
USART4->BRR &= (~(0Xffff));
USART4->BRR |=(0X22B);
//7.设置UART4串口发送器使能 CR1[3]=1
USART4->CR1 |= (0X1 << 3);
//8.设置UART4串口接收器使能CR1[2]=1
USART4->CR1 |= (0X1 << 2);
//9.设置UART4串口使能 CR[0]=1
USART4->CR1 |=(0X1);
}
//发送一个字符函数
void hal_put_char(const char str)
{
//判断发送数据寄存器是否为空
while(!(USART4->ISR &(0X1<<7)));
//读0:发送数据寄存器满,需要等待
//读1:发送数据寄存器为空,可以发送数据
//2.将发送的数据,赋值给发送数据寄存器中
USART4->TDR=str;
//判断一帧数据是否发送完成
while(!(USART4->ISR &(0x1<<6)));
}
//发送一个字符串函数
void hal_put_string(const char* string)
{
//判断是否为'/0'
//一个一个字符进行发送就行了
for (int i=0;string[i]!=0;i++)
{
hal_put_char(string[i]);
}
}
//接受一个字符函数
char hal_get_char()
{
while(!(USART4->ISR & (0X1<<5)));
//判断接收数据寄存器中,是否接受数据
//将接受数据寄存器中的内容,读出来
return (char)USART4->RDR;
}
//接受一个字符串函数
char* hal_get_string()
{
static char p[32]="";
for(int i=0;i<sizeof(p);i++)
{
p[i]=hal_get_char();
hal_put_char(p[i]);
if(p[i]=='\r')
{
hal_put_char('\n');
p[i+1]='\n';
p[i+2]='\0';
break;
}
}
return p;
}
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)
{
// hal_put_char(hal_get_char()+1);
hal_put_string(hal_get_string());
}
return 0;
}