键盘输入一个字符 a’,串口工具显示“b 实现现象:键盘输入一个字符串,串口工具回显输入的字符串

文章描述了一个基于STM32MP1xx微控制器的UART4串口配置和通信过程。代码实现了串口的初始化,包括GPIO、RCC设置,以及字符和字符串的发送与接收函数。在实际应用中,存在键盘输入字符与串口工具显示不一致的问题。
摘要由CSDN通过智能技术生成


1.键盘输入一个字符 a’,串口工具显示"b


2.实现现象:键盘输入一个字符串,串口工具回显输入的字符串

uart4.h

#ifndef __UART4__H__
#define __UART4__H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"

void hal_uart4_init();

char hal_get_char();

void hal_put_char(const char str);

char* hal_get_string();

void hal_put_string(const char* string);








#endif

uart4.c

#include "uart4.h"



void hal_uart4_init()
{
	/*************RCC章节*************/
	RCC->MP_AHB4ENSETR|=(0x1<<1);
	RCC->MP_AHB4ENSETR|=(0x1<<6);
	RCC->MP_APB1ENSETR|=(0x1<<16);
	/*************GPIO章节****************/
	//PB2
	//设置引脚为复用模式 MODER[5:4]=10
	GPIOB->MODER&=(~(0x3<<4));
	GPIOB->MODER|=(0x1<<5);
	//设置引脚为复用功能UART4_RX AFRL[11:8]=1000
	GPIOB->AFRL&=(~(0xf<<8));
	GPIOB->AFRL|=(0x1<<11);
	
	//PG11
	//设置引脚为复用模式 MODER[23:22]=10
	GPIOG->MODER&=(~(0x3<<22));
	GPIOG->MODER|=(0x1<<23);

	//设置引脚为复用功能UART4_RX AFRH[12:15]=0110
	GPIOG->AFRH&=(~(0xf<<12));
	GPIOG->AFRH|=(0x3<<13);

	/************UART4章节*************/
		
	//串口使能 CR1[0]=1
	USART4->CR1|=(0x1<<0);

	//发送器使能 CR1[3]=1 
	USART4->CR1|=(0x1<<3);

	//接收器使能 CR1[2]=1 
	USART4->CR1|=(0x1<<2);

	//设置数据位为8位 CR1[12]=0 CR1[28]=0 
	USART4->CR1&=(~(0x1<<12));
	USART4->CR1&=(~(0x1<<28));

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

	//设置无奇偶校验位 CR1[10]=0 
	USART4->CR1&=(~(0x1<<10));

	//设置1位停止位 CR2[13:12]=00 
	USART4->CR2&=(~(0x3<<12));

	//设置串口的波特率
	USART4->BRR|=0x22b;

	//设置串口不分频 PRESC[3:0]=0000
	USART4->PRESC&=(~(0xf<<0));
}

char hal_get_char()
{
	char str;
	//循环判断ISR[5]是否为1,为1后接收到数据,才能读取
	while(!(USART4->ISR & (0x1 << 5)));
	//ISR[5]==1
	str=USART4->RDR;
	return str;
}

void hal_put_char(const char str)
{
	//循环判断ISR[7]是否为1,为1后TDR寄存器为空,可以赋值
	while(!(USART4->ISR & (0x1 << 7)));
	USART4->TDR=str;
	//循环判断ISR[6]是否为1,为1后,寄存器发送完毕
	while(!(USART4->ISR & (0x1 << 6)));

}
char str[50]={0};
char* hal_get_string()
{
	int i;
	for(i=0;i<49;i++)
	{
		str[i]=hal_get_char();
		hal_put_char(str[i]);
		if(str[i]=='\r')
		{
			break;
		}
	}
	hal_put_char('\0');
	hal_put_char('\n');
	return str;
}


void hal_put_string(const char* string)
{
	while(*string)
	{
		hal_put_char(*string++);
	}
	int i;
	for(i=0;i<49;i++)
	{
		str[i]=0;
	}
	hal_put_char('\0');
	hal_put_char('\n');
}

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()
{
	hal_uart4_init();	
	while(1)
	{
		//hal_put_char(hal_get_char());	
		hal_put_string(hal_get_string());
	}
	return 0;
}

结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值