串口通信实验
main.c
#include"uart4.h"
//手动封装一个延时函数
void delay_ms(int ms)
{
int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<2000;j++)
{
}
}
}
int main()
{
hal_uart4_init();
while(1)
{
hal_put_char(hal_get_char);
}
return 0;
}
uart4.c
#include "uart4.h"
//rcc/gpio/uart初始化
void hal_uart4_init()
{
//RCC章节初始化
//使能GPIOB
RCC->MP_AHB4ENSETR |= (0x1 << 1);
//使能GPIOG
RCC->MP_AHB4ENSETR |= (0x1 << 6);
//使能UART4
RCC->MP_APB1ENSETR |= (0x1 << 16);
//GPIO章节初始化
//设置PB2为复用模式
GPIOB->MODER &= (~(0x3 << 4));
GPIOB->MODER |= (0x2 << 4);
//设置PB2为UART_RX复用功能
GPIOB->AFRL &= (~(0xF << 8));
GPIOB->AFRL |= (0x8 << 8);
//设置PG11为复用模式
GPIOG->MODER &= (~(0x3 << 22));
GPIOG->MODER |= (0x2 << 22);
//设置PG11为UART_TX复用功能
GPIOB->AFRH &= (~(0xF << 12));
GPIOB->AFRH |= (0x6 << 12);
//UART章节初始化
//设置CR1寄存器
USART4->CR1 &= (~(0x1 << 28));
USART4->CR1 &= (~(0x1 << 12)); //设置8位数据位
USART4->CR1 &= (~(0x1 << 15)); //设置16倍采样率
USART4->CR1 &= (~(0x1 << 10)); //设置无校验位
USART4->CR1 |= (0x1 << 3); //设置发送位使能
USART4->CR1 |= (0x1 << 2); //设置接收位使能
USART4->CR1 |= 0x1; //设置串口使能
//设置CR2寄存器
USART4->CR2 &= (~(0x3 << 12)); //设置串口1位停止位
//设置PRESC寄存器
USART4->PRESC &= (~(0xF)); //设置串口不分频
//设置BRR寄存器
USART4->BRR = 0x160A;
}
//封装单个字符发送函数
void hal_put_char(const char str)
{
//判断发送数据寄存器是否为空,不为空则阻塞等待
while(!(USART4->ISR&(0X1<<7)));
//当为空时将数据写入到数据发送寄存器
USART4->TDR=c;
//阻塞等待数据发送完毕,函数结束
while(!(USART4->ISR&(0X1<<6)));
}
//封装单个字符接收的函数
char hal_get_char()
{
//判断接收数据寄存器中有没有有效数据。如果没有就阻塞等待,如果有直接读取
while(!(USART4->ISR&(0X1<<5)));
//将读取的数据返回
return USART4->RDR;
}
//发送一个字符串
void hal_put_string(const char *string)
{
while(*string)
{
hal_put_char(*string);
string++;
}
//发送完字符串让光标显示在下一行最开头
hal_put_char('\n');
hal_put_char('\r');
}
//接收字符串
char * hal_get_string()
{
char * str
while(1)
{
*str=hal_get_string();
str++;
if(*str=='\n')
{
return str;
}
}
}
uart4.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
//rcc/gpio/uart初始化
void hal_uart4_init();
//发送一个字符
void hal_put_char(const char str);
//接收一个字符
char hal_get_char();
//发送一个字符串
void hal_put_string(const char * string);
//接收一个字符串
char * hal_get_string();
#endif