功能函数
#include "uart4.h"
extern void delay_ms(unsigned int ms);
//1.初始化函数
void uart4_init()
{
// 1. 使能GPIOB,GPIOG外设的时钟 RCC_MP_AHB4ENSETR[1][6] = 0b1
RCC->MP_AHB4ENSETR = (0x1 << 1) | (0x1 << 6);
// 2. 设置PB2, 和 PG11引脚为复用的功能
// GPIOB_MODER[5:4] = 0b10 GPIOG_MODER[23:22] = 0b10
GPIOB->MODER &= (~(0x3 << 4));
GPIOB->MODER |= (0x2 << 4);
GPIOG->MODER &= (~(0x3 << 22));
GPIOG->MODER |= (0x2 << 22);
// 3. 设置PB2引脚为UART4_RX功能 GPIOB_AFRL[11:8] --> AF8 --> 0b1000
// 设置PG11引脚为UART4_TX功能 GPIOG_AFRH[15:12] --> AF6 --> 0b0110
GPIOB->AFRL &= (~(0xF << 8));
GPIOB->AFRL |= (0x8 << 8);
GPIOG->AFRH &= (~(0xF << 12));
GPIOG->AFRH |= (0x6 << 12);
// 4. 使能UART4外设的时钟 RCC_MP_APB1ENSETR[16] = 0b1
RCC->MP_APB1ENSETR = (0x1 << 16);
// 5. 判断UART4串口是否使能,如果使能则禁止串口
if (USART4->CR1 & (0x1 << 0)) {
delay_ms(2000); // 等待之前的串口的数据发送完成之后在禁止串口
USART4->CR1 &= (~(0x1 << 0)); // 禁止串口的使能
}
// 6. 设置数据位为8位的数据宽度 USART4_CR1[28][12] = 0b00
USART4->CR1 &= ~((0x1 << 12) | (0x1 << 28));
// 7. 禁止校验位,不使用校验 USART4_CR1[10] = 0b0
USART4->CR1 &= (~(0x1 << 10));
// 8. 设置串口的采样率为16倍或者8倍,最终会影响波特率的计算 USART4_CR1[15]
USART4->CR1 &= (~(0x1 << 15));
// 9. 设置停止位的个数为1位 USART4_CR2[13:12] = 0b00
USART4->CR2 &= (~(0x3 << 12));
// 10. 设置串口时钟的分频寄存器 USART4_PRERC[3:0] 最终也会影响波特率的计算
// usart_ker_ck 时钟源的频率等于 64MHz
// usart_ker_ck_pesc = usart_ker_ck / USART4_PRESC[3:0]
USART4->PRESC &= (~(0xF << 0));
// 11. 设置串口的波特率为115200bps USART4_BRR[15:0]
USART4->BRR = 0x22B;
// 12. 使能串口发送器 USART4_CR1[3] = 0x1
USART4->CR1 |= (0x1 << 3);
// 13. 使能串口接收器 USART4_CR1[2] = 0x1
USART4->CR1 |= (0x1 << 2);
// 14. 使能串口 USART4_CR1[0] = 0x1
USART4->CR1 |= (0x1 << 0);
}
//2.发送一个字符
void put_char(const char str)
{
//1.判断发送数据寄存器是否有数据 IRS[7]
//读0:发送数据寄存器满,需要等待
//读1:空,可以发送
while(!(USART4->ISR & (0x1 << 7)));
//2.将要发送的字符发到寄存器中
USART4->TDR = str;
if(str == '\r')
put_char('\n');
//3.判断发送数据是否完成
//0:没有
//1:完成,可以发送下一帧数据
//while(!(USART4->ISR & (0x1 << 6)));
}
//3.接收一个字符
char get_char()
{
char ch;
//1.判断接收寄存器是否有数据可以读 IRS[5]
//读0:没有
//读1:有
while(!(USART4->ISR & (0x1 << 5)));
ch = (char)USART4->RDR;
//2.将接收数据寄存器内的内容读出来
return ch;
}
char buffer[50] = {0};
//发送一个字符串
void put_string(const char *str)
{
//判断是否为'\0'
while(*str != '\0')
{
put_char(*str);
str++;
}
}
//接收一个字符串
char* get_string(char str[])
{
//1.循环进行接收
unsigned int i;
for(i = 0; i<49; i++)
{
buffer[i] = get_char();
put_char(buffer[i]);
if(buffer[i] == 'r')
break;
}
buffer[i] = '\0';
put_char('\n');
return buffer;
}
头函数
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
//1.初始化函数
void uart4_init();
//2.发送一个字符
void put_char(const char str);
//3.接收一个字符
char get_char();
//发送一个字符串
void put_string(const char *str);
//接收一个字符串
char* get_string(char str[]);
#endif