头文件和封装函数
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->MP_AHB4ENSETR |= 0x1 << 1;
RCC->MP_AHB4ENSETR |= 0x1 << 6;
RCC->MP_APB1ENSETR |= 0x1 << 16;
GPIOB->MODER &= (~(0x3) << 4);
GPIOB->MODER |= (0x1 << 5);
GPIOB->AFRL &= (~(0xF) << 8);
GPIOB->AFRL |= (0x1 << 11);
GPIOG->MODER &= (~(0x3) << 22);
GPIOG->MODER |= (0x1 << 23);
GPIOG->AFRL &= (~(0xF) << 12);
GPIOG->AFRL |= (0x6 << 13);
if(USART4->CR1 & (0x1<<0))
{
USART4->CR1 &= (0x1 << 0);
}
USART4->CR1 &= (~(0x1) << 12);
USART4->CR1 &= (~(0x1) << 28);
USART4->CR1 &= (~(0x1) << 10);
USART4->CR2 &= (~(0x3) << 12);
USART4->CR1 &= (~(0x1) << 15);
USART4->PRESC &= (~(0xf) << 0);
USART4->BRR = 0x22b;
USART4->CR1 |= (0x1 << 3);
USART4->CR1 |= (0x1 << 2);
USART4->CR1 |= (0x1 << 0);
}
void put_char(const char str)
{
while(!(USART4->ISR & (0x1 << 7)));
USART4->TDR = str;
while(!(USART4->ISR & (0x1 << 6)));
}
void put_string(const char* str)
{
for(int i=0; str[i]!='\0'; i++)
put_char(str[i]);
}
char get_char()
{
char ch;
while(!(USART4->ISR & (0x1 << 5)));
ch = USART4->RDR;
return ch;
}
char buf[50] = {0};
char* get_string()
{
int i;
for(i=0; i<50; i++)
{
buf[i] = get_char();
put_char(buf[i]);
if(buf[i] == '\r')
break;
}
buf[i] = '\0';
put_char('\n');
return buf;
}