7.1作业6

uart4.h

cs 复制代码
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
//rcc/gpio/uart4初始化
void hal_uart4_init();
//发送一个字符
void hal_put_char(const char str);
//发送一个字符串
void hal_put_string(const char* string);
//接收一个字符
char hal_get_char();
//接收一个字符串
char* hal_get_string();
#endif

uarrt4.c

cs 复制代码
#include "uart4.h"
char buf[65]="";
//rcc/gpio/uart4初始化
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);
    //PG11复用模式
    GPIOB->MODER &=(~(0X3<<22));
    GPIOB->MODER |=(0X2<<22);
    //PB2为UART_RX复用模式
    GPIOB->AFRL &=(~(0XF<<8));
    GPIOB->AFRL |=(0X8<<8);
    //PG11为UART_TX复用模式
    GPIOB->AFRL &=(~(0XF<<12));
    GPIOB->AFRL |=(0X6<<12);

    /******UART初始化*************/
    //禁用串口 UE=0
    USART4->CR1 &=(~0X1);
    //设置8位数据位
    USART4->CR1 &=(~(0X1<<12));
    USART4->CR1 &=(~(0X1<<28)); 
    //设置16倍采样率
    USART4->CR1 &=(~(0X1<<15));
    //设置无校验位
    USART4->CR1 &=(~(0X1<<10));
    //设置发送位使能
    USART4->CR1 |=(0X1<<3);
    //设置接收位使能
    USART4->CR1 |=(0X1<<2);
    //串口1位停止位
    USART4->CR2 &=(~(0X3<<12));
    //串口不分频
    USART4->PRESC &=(~0XF);
    //设置串口波特率115200
    USART4->BRR=0X22b;
    //串口使能 UE=1
    USART4->CR1 |=(0X1);
}

//发送一个字符
void hal_put_char(const char str)
{
    //判断发送数据寄存器是否为空,不为空则阻塞等待
    while(!(USART4->ISR&(0X1<<7)));
    //当为空时将数据写入到数据发送寄存器
    USART4->TDR=str;
    //阻塞等待数据发送完毕,函数结束
    while(!(USART4->ISR&(0X1<<6)));
}

//发送一个字符串
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_char()
{
    //判断接收数据寄存器中有没有有效数据。如果没有就阻塞等待,如果有直接读取
    while(!(USART4->ISR&(0X1<<5)));
    //将读取的数据返回
    return USART4->RDR;
}

//接收一个字符串
char* hal_get_string()
{
   unsigned int a;
   for(a=0;a<64;a++)
   {
    buf[a]=hal_get_char();
    hal_put_char(buf[a]);
    if(buf[a]=='\r')
        {
            break;
        }
    }
    
    buf[a]='\0';
    hal_put_char('\n');
    hal_put_char('\r');
    return buf;
}

main.c

cs 复制代码
#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()
{
	void hal_uart4_init();
	//char a;
   // char buf[32];
    while(1)
    {
        /*a=hal_get_char();//读取一个字符
        hal_put_char(a+1);//将读取到的字符+1返回   win下换行符是'\n',回车键对应的字符是'\r'
        hal_put_char('\n');
        hal_put_char('\r');*/
        //读取字符串
        hal_put_string(hal_get_string());
    }
	return 0;
}

结果

相关推荐
Funing72 分钟前
系列一:STM32 外设初始化
stm32·单片机·嵌入式硬件
zcmodeltech1 小时前
钢铁冶金沙盘模型多工序协同控制系统设计:基于STM32与Modbus RTU的高炉-连铸-热轧全流程联动方案
stm32·单片机·嵌入式硬件·数据库架构·嵌入式实时数据库·多分类
西城微科方案开发2 小时前
充气泵PCBA方案:数字传感器VS模拟传感器
单片机
zcmodeltech3 小时前
供热系统模型多工况控制系统设计:基于STM32与Modbus RTU的热源-管网-末端联动方案
大数据·stm32·单片机·嵌入式硬件·制造·数据库系统
智闲电子设计4 小时前
STM32 定时器 PWM 实战:从呼吸灯到舵机控制
c语言·stm32·单片机·嵌入式硬件·学习
azwsm12 小时前
驱动第一阶段——启动流程
单片机·嵌入式硬件
lhbweilai16 小时前
STM32 I2C(hal库)
stm32·单片机·嵌入式硬件
单片机杂货铺20 小时前
基于STM32的智能市政清洁小车系统设计
stm32·单片机·嵌入式硬件·物联网·硬件工程
单片机杂货铺20 小时前
基于STM32的智能书房系统的设计
stm32·单片机·嵌入式硬件·51单片机·硬件工程
普科PRBTEK20 小时前
电流探头的常见应用场景
单片机·嵌入式硬件