7.1作业6

news/2024/7/8 1:41:58 标签: 单片机

uart4.h

#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

#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

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

结果


http://www.niftyadmin.cn/n/5537042.html

相关文章

[Go 微服务] Kratos 使用的简单总结

文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施&#xff0c;不限定于某种注册中心&#xff0c;或数据库ORM等&#xff0c;所以您可以十分轻松地将任意库集成进项目里&#xff0c;与Kratos共同运作。 API -&…

ETCD 基本介绍与常见命令的使用

转载请标明出处&#xff1a;https://blog.csdn.net/donkor_/article/details/140171610 文章目录 一、基本介绍1.1 参考1.2 什么是ETCD1.3 ETCD的特点1.4 ETCD的主要功能1.5 ETCD的整体架构1.6 什么时候用ETCD&#xff0c;什么时候用redis 二、安装三、使用3.1 etcdctl3.2 常用…

k8s-第八节-Helm

Helm & 命名空间 介绍 Helm类似 npm,pip,docker hub, 可以理解为是一个软件库,可以方便快速的为我们的集群安装一些第三方软件。使用 Helm 我们可以非常方便的就搭建出来 MongoDB / MySQL 副本集群,YAML 文件别人都给我们写好了,直接使用。官网 https://helm.sh/zh/ …

Vue2中跨组件共享公共属性的方法、优缺点与实现

一、vuex&#xff08;最常用&#xff09; 优缺点 优点&#xff1a;集中管理状态&#xff0c;组件间解耦&#xff0c;易于调试和测试。缺点&#xff1a;学习成本较高&#xff0c;对于小项目可能过于复杂。 适用场景 大型、复杂的单页面应用&#xff08;SPA&#xff09;。需要全局…

【等保2.0是什么意思?等保2.0的基本要求有哪些? 】

一、等保2.0是什么意思&#xff1f; 等保2.0又称“网络安全等级保护2.0”体系&#xff0c;它是国家的一项基本国策和基本制度。在1.0版本的基础上&#xff0c;等级保护标准以主动防御为重点&#xff0c;由被动防守转向安全可信&#xff0c;动态感知&#xff0c;以及事前、事中…

《昇思25天学习打卡营第7天|函数式自动微分》

文章目录 今日所学&#xff1a;一、函数与计算图二、微分函数与梯度计算三、Stop Gradient四、Auxiliary data五、神经网络梯度计算总结 今日所学&#xff1a; 今天我学习了神经网络训练的核心原理&#xff0c;主要是反向传播算法。这个过程包括将模型预测值&#xff08;logit…

【抽代复习笔记】25-群(十九):一个关于循环群的重要定理以及三道证明例题

定理&#xff1a;G (a)是n阶循环群&#xff0c;则&#xff1a; &#xff08;1&#xff09;|a^r| n/(r,n)&#xff08;(r,n)是r和n的最大公因数&#xff09;&#xff1b; &#xff08;2&#xff09;当(r,n) 1时&#xff0c;a^r也是一个生成元&#xff1b; &#xff08;3&a…

第二十九天 第八章 贪心算法 part03 134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列

134. 加油站 两种情况讨论&#xff0c;(容量-消耗量)的累加和小于0时不可环绕一周&#xff0c;反之即可&#xff0c;同时如果当前容量-消耗量小于0&#xff0c;那么当前加油站也不是加油站&#xff0c;往后推一站&#xff0c;但是我们一定能找到一个加油站作为开始加油站环绕…