1.键盘输入的字符加一
2.键盘输出字符
头文件
#ifndef __UART4_H__
#define __UART4_H__
#include "../common/include/stm32mp1xx_uart.h"
#include "../common/include/stm32mp1xx_rcc.h"
#include "../common/include/stm32mp1xx_gpio.h"
// 初始化的函数
void hal_uart4_init(void);
// 发送一个字节的函数
void hal_send_char(const char ch);
// 发送字符串的函数
void hal_send_string(const char *string);
// 接收一个字符的函数
char hal_recv_char(void);
// 接收一个字符串的函数
char * hal_recv_string();
#endif // __UART4_H__
源文件
#include "../include/uart4.h"
void hal_uart4_init()
{
//RCC使能
RCC->MP_AHB4ENSETR |=(0x1<<1)|(0x1<<6);
RCC->MP_APB1ENSETR |=(0x1<<16); //UART使能
//GPIO的配置
GPIOB->MODER &=(~(0x3<<4));
GPIOB->MODER |=(0x1<<5);
GPIOG->MODER &=(~(0x3<<22));
GPIOG->MODER |=(0x1<<23);
//GPIO引脚多功能复用,引脚功能的选用
GPIOB->AFRL &=(~(0xf<<8)); //PB2选用AF8功能1000【11:8】
GPIOB->AFRL |=0x8<<8;
GPIOG->AFRH &=(~(0xf<<12)); //[15:12],PG11选AF6
GPIOG->AFRH |=(0x6<<12);
if (USART4->CR1 & (0x1 << 0))
{ // 等待之前的串口的数据发送完成之后在禁止串口
USART4->CR1 &= (~(0x1 << 0)); // 禁止串口的使能
}
//设置UART4_CR1
USART4->CR1 &=(~(0x1<<12|0x1<<28));//设置长度为8 00 12 28
//使能RE TE寄存器
USART4->CR1 |=0x3<<2;
//校验位不设置
USART4->CR1 &=(~(0x1<<10));
//设置采样率
USART4->CR1 &=(~(0x1<<15)); //设置16倍采样率
//CR2设置停止位 1位
USART4->CR2 &=(~(0x3<<12));
//设置分频 8分频
USART4->PRESC &=(~(0xf));
USART4->PRESC |=0x1<<2;
//设置波特率
USART4->BRR=0x45;
//使能UE 要放在最后
USART4->CR1 |=0x1;
}
// 发送一个字节的函数
void hal_send_char(const char ch)
{
while(1)
{
if(USART4->ISR &0x1<<7)
{
USART4->TDR=ch;
break;
}
}
//如果出现换行,移动光标
if (ch=='\n')
{
hal_send_char('\r');
}
}
// 发送字符串的函数
void hal_send_string(const char *string)
{
for(int i=0;string[i]!='\0';i++)
{
hal_send_char(string[i]);
}
}
// 接收一个字符的函数
char hal_recv_char(void)
{
char ch;
while(!(USART4->ISR & 0x1<<5))
{
}
ch=(char)USART4->RDR;
return ch;
}
// 接收一个字符串的函数
char string[100]={0};
char * hal_recv_string()
{
int i=0;
for(i=0;i<99;i++)
{
string[i]=hal_recv_char();
hal_send_char(string[i]);
if(string[i]=='\r')
{
break;
}
}
string[i]='\0';
hal_send_char('\n');
return string;
}
主函数
#include "./include/led.h"
#include "./include/uart4.h"
extern void printf(const char *fmt, ...);
void delay_ms(unsigned int ms)
{
int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 1800; j++)
;
}
int main()
{
char c;
char *str;
hal_uart4_init();
//hal_send_string("usart test code\n");
//hal_send_string("usart init finished\n");
while (1)
{
#if 0
// 测试接收一个字符
c = hal_recv_char();
hal_send_char(c+1);
#endif
#if 1
// 测试接收一个字符串,并发送一个字符串的函数
str = hal_recv_string();
hal_send_string(str);
hal_send_char('\n');
#endif
}
return 0;
}