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;
}
结果: