07.01

串口通信实验

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值