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

结果

相关推荐
Dev_XH几秒前
【成品设计】基于 STM32 的智能鞋柜系统
stm32·单片机·嵌入式硬件
LeonDL1683 小时前
YOLOv8 在单片机上的几种部署方案
人工智能·python·单片机·嵌入式硬件·深度学习·yolo·yolov8 在单片机上的部署
LeonDL1683 小时前
YOLOv8 在单片机上部署的缺点和应对方案
python·单片机·嵌入式硬件·深度学习·yolo·yolov8在单片机上的缺点·yolov8 在单片机上的优化
尚久龙3 小时前
STM32实现RS485通讯
stm32·单片机·嵌入式硬件
嵌入式Linux,3 小时前
ESP32和STM32 就不应该放在一起比,
stm32·单片机·嵌入式硬件
硬件智障4 小时前
51单片机实现流水灯
单片机·嵌入式硬件·51单片机
暮雪倾风4 小时前
【STM32】ST-Link V2.1制作
stm32·单片机·嵌入式硬件
yuanpan4 小时前
支持python的单片机有哪些
开发语言·python·单片机
MaoXian_n6 小时前
[IMX] 05.串口 - UART
汇编·arm开发·驱动开发·单片机·嵌入式硬件
一只小灿灿7 小时前
基于 Keil 的 STM32 全模块开发
stm32·单片机·嵌入式硬件