1、键盘输入一个字符,串口回显该字符值加1。
2、键盘输入一个字符串,串口回显字符串。
头文件UART.h
#ifndef __GPIO_H__
#define __GPIO_H__
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_uart.h"
#include"stm32mp1xx_gpio.h"
//UART4初始化
void hal_uart4_init();
//发送一个字符
void put_char(const char str);
//发送一个字符串
void put_string(const char* string);
//接收一个字符
char get_char();
//接受一个字符串
char *get_string();
#endif
功能函数UART.c:
#include "gpio.h"
//UART4初始化
void hal_uart4_init()
{
//RCC章节初始化
RCC->MP_AHB4ENSETR |= (0x1<<1);
RCC->MP_AHB4ENSETR |= (0x1<<6);
RCC->MP_APB1ENSETR |= (0x1<<16);
//GPIO章节初始化
GPIOB->MODER &= (~(0x3<<4));
GPIOB->MODER |= (0x1<<5);
GPIOB->AFRL &= (~(0xF<<8));
GPIOB->AFRL |= (1<<11);
GPIOG->MODER &= (~(0x3<<22));
GPIOG->MODER |= (0x1<<23);
GPIOG->AFRH &= (~(0xf<<12));
GPIOG->AFRH |= (3<<13);
//UART4章节初始化
//UE禁止
if(USART4->CR1 & 0x1)
{
USART4->CR1 &= ~0x1;
}
//设置8位数据位宽度
USART4->CR1 &= (~(0x1<<28));
USART4->CR1 &= (~(0x1<<12));
//设置串口1位停止位
USART4->CR1 &= (~(0x3<<12));
//设置串口无奇偶校验位
USART4->CR1 &= (~(0x1<<10));
//设置串口16倍采样率
USART4->CR1 &= (~(0x1<<15));
//设置串口不分频
USART4->PRESC &= (~0xf);
//设置串口发送寄存器使能
USART4->CR1 |= (0x1<<3);
//设置串口接受寄存器使能
USART4->CR1 |= (0x1<<2);
//设置串口使能
USART4->CR1 |= 1;
//设置波特率
//USART4->BRR &= (~0xFF);
USART4->BRR = (0x22b);
}
//发送一个字符
void put_char(const char str)
{
while(!((USART4->ISR)&(1<<7)));
USART4->TDR = str;
while (!((USART4->ISR)&(1<<6)));
}
char buf[100] = {0};
//发送一个字符串
void put_string(const char* string)
{
while (*string)
{
put_char(*string++);
}
put_char('\n');
}
//接收一个字符
char get_char()
{
char mych;
while(!(USART4->ISR & (1<<5)));
mych = USART4->RDR ;
return mych ;
}
//接受一个字符串
char *get_string()
{
unsigned int i;
for(i=0 ;i<99;i++)
{
buf[i] = get_char();
put_char(buf[i]);
if(buf[i]=='\r')
break;
}
buf[i] = '\0';
return buf;
}
主函数main.c
#include "gpio.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)
{
put_char(get_char() + 1);
//put_string(get_string());
}
return 0;
}
结果演示:
显示字符加1:
显示字符串: