2022嵌入式10-3

头文件和封装函数

uart4.h

#ifndef __UART4_H__
#define __UART4_H__

#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"

//初始化函数
void uart4_init();

//发送一个字符
void put_char(const char str);

//发送一个字符串
void put_string(const char* str);

//接收一个字符
char get_char();

//接收一个字符串
char* get_string();

#endif


uart.c

#include "uart4.h"

//初始化函数
void uart4_init()
{
	/******RCC章节初始化******/
	RCC->MP_AHB4ENSETR |= 0x1 << 1;
	RCC->MP_AHB4ENSETR |= 0x1 << 6;
	RCC->MP_APB1ENSETR |= 0x1 << 16;

	/******GPIO章节初始化******/
	//PB---->UART4_Rx
	//PG11---->UART4_Tx
	//设置PB2引脚为复用功能
	GPIOB->MODER &= (~(0x3) << 4);
	GPIOB->MODER |= (0x1 << 5);

	//设置PB2引脚复用功能为UART4_Rx
	GPIOB->AFRL &= (~(0xF) << 8);
	GPIOB->AFRL |= (0x1 << 11);
	
	//设置PG11引脚为复用功能
	GPIOG->MODER &= (~(0x3) << 22);
	GPIOG->MODER |= (0x1 << 23);

	//设置PG11引脚复用功能为UART4_Tx
	GPIOG->AFRL &= (~(0xF) << 12);
	GPIOG->AFRL |= (0x6 << 13);

	/******UART章节初始化******/
	if(USART4->CR1 & (0x1<<0))
	{
		//将UE为禁止
		USART4->CR1 &= (0x1 << 0);
	}

	//串口初始化 8位数据位 无奇偶校验
	USART4->CR1 &= (~(0x1) << 12);
	USART4->CR1 &= (~(0x1) << 28);
	USART4->CR1 &= (~(0x1) << 10);

	//设置串口一位停止位
	USART4->CR2 &= (~(0x3) << 12);

	//设置串口16倍采样率
	USART4->CR1 &= (~(0x1) << 15);

	//设置串口不分频
	USART4->PRESC &= (~(0xf) << 0);
	//设置串口波特率115200
	USART4->BRR = 0x22b;

	//设置串口发送器使能
	USART4->CR1 |= (0x1 << 3);

	//设置串口接收器使能
	USART4->CR1 |= (0x1 << 2);

	//设置串口使能
	USART4->CR1 |= (0x1 << 0);
}

//发送一个字符
void put_char(const char str)
{
	//判断发送数据寄存器是否有数据
	//读0:发送数据寄存器满,需要等待
	//读1:发送数据寄存器为空,才可以发送下一个字节数据
	while(!(USART4->ISR & (0x1 << 7)));

	//将要发送的字符,写入到发送数据寄存器中
	USART4->TDR = str;

	//判断发送数据是否发送完成
	//读0:发送数据没有完成需要等待
	//读1:发送数据完成,可以发送下一帧数据
	while(!(USART4->ISR & (0x1 << 6)));
}

//发送一个字符串
void put_string(const char* str)
{
	//判断是否为'\0'
	//一个一个字符发送
	for(int i=0; str[i]!='\0'; i++)
		put_char(str[i]);
	
}

//接收一个字符
char get_char()
{
	char ch;
	//判断接收寄存器是否有数据可读	ISR[5]
	//读0:没有数据可读,需要等待
	//读1:有数据可读
	while(!(USART4->ISR & (0x1 << 5)));

	//将接收数据寄存器中的内容读出来
	ch = USART4->RDR;
	
	return ch;
}

char buf[50] = {0};
//接收一个字符串
char* get_string()
{
	int i;
	//循环进行接收
	//当键盘回车键按下后,代表字符串接收结束'\r'
	for(i=0; i<50; i++)
	{
		//循环实现:接收一个字符后,发送一个字符
		 buf[i] = get_char();
		 put_char(buf[i]);
		 if(buf[i] == '\r')
			 break;
	}
	//字符串补一个'\0'
	buf[i] = '\0';
	put_char('\n');
	return buf;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值