ARM 240701

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;`
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值