stm32mp1xx_uart.h
#ifndef __STM32MP1XX_UART_H__
#define __STM32MP1XX_UART_H__
typedef struct {
volatile unsigned int CR1;
volatile unsigned int CR2;
volatile unsigned int CR3;
volatile unsigned int BRR;
volatile unsigned int GTPR;
volatile unsigned int RTOR;
volatile unsigned int RQR;
volatile unsigned int ISR;
volatile unsigned int ICR;
volatile unsigned int RDR;
volatile unsigned int TDR;
volatile unsigned int PRESC;
}uart_t;
#define USART1 ((uart_t *)0x5C000000)
#define USART2 ((uart_t *)0x4000E000)
#define USART3 ((uart_t *)0x4000F000)
#define USART4 ((uart_t *)0x40010000)
#define USART5 ((uart_t *)0x40011000)
#define USART6 ((uart_t *)0x44003000)
#define USART7 ((uart_t *)0x40018000)
#define USART8 ((uart_t *)0x40019000)
#endif // __STM32MP1XX_UART_H__
uart4.h
#ifndef __UART4_H__
#define __UART4_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 "../include/uart4.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 "../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)
{
put_char(get_char() + 1);
//put_string(get_string());
}
return 0;
}