uart4.h
#ifndef __UART4_H__ //防止多开头文件
#define __UART4_H__
#include "../common/include/stm32mplxx_rcc.h"
#include "../common/include/stm32mplxx_gpio.h"
#include "../common/include/stm32mplxx_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
#include "uart4.h"
//UART4_RX ===>PB2
//UART4_TX ===> PG11
// rcc / gpio / uatr4 初始化
void hal_uart4_init(){
/******** RCC 章节初始化 **********/
//1.使能 GPIOB 组控制器
RCC->MP_AHB4ENSETR |= (0X1 << 1);
//2.使能 GPIOG 级控制器
RCC->MP_AHB4ENSETR |= (0X1 << 6);
//3.使能 UART4 组控制器
RCC->MP_AHB4ENSETR |= (0X1 << 16);
/******** GPIO 章节初始化 **********/
//设置 PB2 和PG11 引脚 为 复用功能
//PB2 ====> GPIOB_MODER[5:4] = 10 ====> 0x50003000[5:4] = 10
GPIOB->MODER &= (~(0X3 << 4));
GPIOB->MODER |= (0X1 << 5);
//PG11 ====> GPIOG_MODER[23:22] = 10 ====> 0x50008000[23:22] = 10
GPIOG->MODER &= (~(0X3 << 22));
GPIOG->MODER |= (0X1 << 23);
//设置 PB2 引脚 复用 功能为 UART4_RX
//GPIOB_AFRL[11:8] = 1000 ======> 0x50003020[11:8] = 1000
GPIOB->AFRL &= (~(0XF << 8));
GPIOB->AFRL |= (0x1 << 11);
//设置 PG11 引脚 复用功能 为UART4_TX
//GPIOG_AFRH[15:12] = 0110 =====> 0x50008024[15:12] = 0110
GPIOG->AFRH &= (~(0XF << 12));
GPIOG->AFRH |= (0X6 << 15);
/******** UART 章节初始化 **********/
// USART4_CR1 地址 = 基地址 + 偏移地址 = 0x40010000 + 0x00 = 0x40010000
// USART4_CR1[28][12] = 00 ========> 设置 8位数据位
USART4->CR1 &= (~(0X1 << 28));
USART4->CR1 &= (~(0X1 << 12));
// USART4_CR1[15] = 0 ========> 设置 16倍 采样率
USART4->CR1 &= (~(0X1 << 15));
// USART4_CR1[10] = 0 ========> 设置 无校验位
USART4->CR1 &= (~(0X1 << 10));
// USART4_CR1[3] = 1 ========> 设置 发送位 使能
USART4->CR1 &= (0X1 << 3);
// USART4_CR1[2] = 1 ========> 设置 接收位 使能
USART4->CR1 &= (0X1 << 2);
// USART4_CR1[0] = 1 ========> 设置 串口 使能
USART4->CR1 &= (0X1 << 0);
}
//发送一个字符
void hal_put_char(const char str){
USART4->TDR = (int)str;
printf("%s",str);
}
//发送一个字符串
void hal_put_string(const char* string){
for(int i=0; i<sizeof(string); i++){
USART4->TDR = (int)string[i];
}
}
//接收一个字符
char hal_get_char(){
char a;
a = USART4->RDR;
return a;
}
//接收一个字符串
char* hal_get_string(){
char a[10];
a[1] = USART4->RDR;
return a;`
}