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;
}

结果

相关推荐
易板13 分钟前
ES7210高性能四通道音频ADC转换模拟麦克风为IIS数字咪头
单片机·嵌入式硬件·iis·音视频·麦克风
是梅梅森1 小时前
STM32-01 推挽输出-点亮LED
stm32·单片机·嵌入式硬件
luckyme_2 小时前
STM32-I2C
stm32·单片机·嵌入式硬件
luckyme_2 小时前
STM32-ADC+DMA
stm32·单片机·嵌入式硬件
biaobiao_hust2 小时前
芯片封装简介
单片机·嵌入式硬件
几个几个n3 小时前
51单片机-第一节-LED和独立按键
单片机·嵌入式硬件·51单片机
weixin_452600696 小时前
如何为老化的汽车铅酸电池充电
开发语言·单片机·安全·汽车·电机·电源模块·充电桩
极客小张8 小时前
ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验
单片机·嵌入式硬件·mcu·物联网·机器人·硬件工程
Jack1530276827914 小时前
什么是上拉电阻器?上拉和下拉电阻的典型应用
stm32·单片机·嵌入式硬件·智能家居·医疗器械·新能源汽车充电枪锁
极客小张16 小时前
Zigbee智能家居数据中心:微信小程序实时掌控家居传感器信息
javascript·单片机·嵌入式硬件·物联网·硬件架构·硬件工程