UART串口收发数据

uart4.h 

ubuntu@ubuntu:05_uart$ cat include/uart4.h 
#ifndef __UART_H__
#define __UART_H__//初始化相关操作
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

uart4.c

ubuntu@ubuntu:05_uart$ cat src/uart4.c
#include"uart4.h"
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_uart.h"
#include"stm32mp1xx_rcc.h"//初始化相关操作
void hal_uart4_init()
{/******RCC章节初始化*******///1.使能GPIOB组控制器  MP_AHB4ENSETR[1] = 1RCC->MP_AHB4ENSETR |= (0x1 << 1);  //使能AHB4连接的GPIOB//2.使能GPIOG组控制器  MP_AHB4ENSETR[6] = 1RCC->MP_AHB4ENSETR |= (0x1 << 6);  //使能AHB4连接的GPIOG//3.使能UART4组控制器  MP_APB1ENSETR[16] = 1RCC->MP_APB1ENSETR |= (0x1 << 16); //使能APB1连接的UART4/******GPIO章节初始化*******///1.设置PB2引脚为复用功能模式 MODER[5:4] = 10	GPIOB->MODER &= (~(0x3 << 4));GPIOB->MODER |= (0X1 << 5);//2.设置PB2引脚为复用功能为 UART4_RX AFRL[11:8] = 1000GPIOB->AFRL &= (~(0xf << 8));GPIOB->AFRL |= (0x8 << 8);//1.设置PG11引脚为复用功能模式 MODER[23:22] = 10GPIOG->MODER &= (~(0x3 << 22)); GPIOG->MODER |= (0x1 << 23);  //2.设置PG11引脚为复用功能为 UART4_TX AFRH[15:12] = 0110GPIOG->AFRH &= (~(0xf << 12));GPIOG->AFRH |= (0x6 << 12);/******UART4章节初始化*******///0.设置串口UE=0USART4->CR1 &= (~(0x1));//1.设置1位起始位,8位数据位USART4->CR1 &= (~(0x1 << 12));USART4->CR1 &= (~(0x1 << 28));//2.没有奇偶校验位USART4->CR1 &= (~(0x1 << 10));//3.设置1位停止位USART4->CR2 &= (~(0x3 << 12));//4.设置16倍采样率,第15位置0USART4->CR1 &= (~(0x1 << 15));//5.设置串口不分频USART4->PRESC &= (~(0xf));//6.设置串口波特率为115200USART4->BRR = 0x22b;//7.设置串口发送器使能USART4->CR1 |= (0x1 << 3);//8.设置串口接收器使能USART4->CR1 |= (0x1 << 2);//9.设置串口使能USART4->CR1 |= 0x1;
}//发送一个字符
void hal_put_char(const char str)
{//1.判断发送数据寄存器是否为空ISR[7]//特点:为空才可以发送下一位的数据,为满需要等待//读0:满,需要等待     读1:发送数据while(!(USART4->ISR & (0x1 << 7)));//2.将发送的内容,赋值给发送数据寄存器USART4->TDR = str;//3.判断一帧数据是否发送完成 ISR[6]//读0:没有发送完成,等待   读1:发送完成while(!(USART4->ISR & (0x1 << 6)));
}//发送一个字符串
void hal_put_string(const char* string)
{hal_put_char('\r');hal_put_char('\n');   //换到下一行的开头//判断是否为'\0'while(*string != '\0'){//一个字符一个字符进行发送hal_put_char(*string);string++;}hal_put_char('\r');hal_put_char('\n');
}//接收一个字符
char hal_get_char()
{//1.判断接收数据寄存器中是否接收到数据ISR[5]while(!(USART4->ISR & (0x1 << 5)));//2.将接收数据寄存器中的内容读出来char ch = USART4->RDR; return ch;
}
//接收一个字符串
char* hal_get_string()
{//循环进行接收//当键盘的回车键按键之后,代表字符串输出完成,'\r'是回车static char str[128] = "";int i;for(i=0;;i++){	//判断接收数据寄存器中是否接收到数据ISR[5]while(!(USART4->ISR & (0x1 << 5)));str[i] = USART4->RDR;if(str[i] == '\r')break;hal_put_char(str[i]);   //回显}str[i] = '\0';return str;
}

main.c

ubuntu@ubuntu:05_uart$ cat main.c
#include "uart4.h"int main()
{hal_uart4_init();while(1){//hal_put_char(hal_get_char()+1);  //实验一hal_put_string(hal_get_string());  //实验二}return 0;
}

实验一现象:

实验二现象:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15742.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在没有软件的情况下将 PDF 转换为 PPT(100% 免费)

演示文稿由文字、图片、音频、动画等元素组成&#xff0c;通常用于会议、课堂或演讲中&#xff0c;展示演讲者想要表达的主要内容。如果您遇到重要文档以 PDF 格式存储&#xff0c;但现在需要转换为 PPT 格式的情况&#xff0c;请不要担心。我们本指南的目标是帮助用户将 PDF 转…

一起学SF框架系列5.7-模块Beans-BeanDefinition解析

开发人员按元数据规则定义了应用bean&#xff0c;了解SF如何根据定义解析成BeanDefiniton有助于深入理解框架实现。解析过程如下&#xff1a; 资源加载 从资源文件加载bean的元数据配置&#xff0c;实际过程如下图&#xff1a; 实际从指定的XML文件加载bean定义是从XmlBeanD…

Spring系列2 -- Spring的创建和使用

Spring 就是⼀个包含了众多工具方法的 IOC容器。既然是容器那么它就具备两个最基本的功能&#xff1a; 将对象存储到容器&#xff08;Spring&#xff09;中&#xff1b;从容器中将对象取出来。 在Java中对象也叫做Bean&#xff0c;后续我们就把对象称之为Bean&#xff1b; 目录…

4.5 x64dbg 探索钩子劫持技术

钩子劫持技术是计算机编程中的一种技术&#xff0c;它们可以让开发者拦截系统函数或应用程序函数的调用&#xff0c;并在函数调用前或调用后执行自定义代码&#xff0c;钩子劫持技术通常用于病毒和恶意软件&#xff0c;也可以让开发者扩展或修改系统函数的功能&#xff0c;从而…

ARM64学习笔记---建立异常向量表(二)

源码: #include "mm.h" #include "sysregs.h".section .rodata .align 3 .globl el_string1 el_string1:.string "Booting at EL".section ".text.boot" .globl _start _start://读取mpidr_el1寄存器的值&#xff0c;该寄存器决定了…

高级运维开发工程师带你处理linux木马(挖矿病毒)实战例子

一、事态描述 centos7测试服务器&#xff0c;突然密码登不上去了&#xff0c;然后CPU占100%。已经猜到&#xff0c;登录密码过于简单&#xff0c;密码被破解挂马了。大概率是CPU挖矿病毒。 二、重置centos7登录root密码 步骤1 启动Linux Centos7系统&#xff0c;当出现如下画…

DevOps系列文章 之 Java使用jgit管理git仓库

最近设计基于gitops新的CICD方案,需要通过java读写git仓库&#xff0c;这里简单记录下。 在jgit中&#xff0c;存在最核心的三个组件&#xff1a;Git类&#xff0c;Repository类。Git类中包含了push commit之类的常见git操作&#xff0c;而Repository则实现了仓库的初始化和基…

使用黑盒测试在 Go 中重写 Bash 脚本

目录 前言&#xff1a; 开始 准备工作 描述行为&#xff1a;Bats 简介 行为描述&#xff1a;陷阱 描述行为&#xff1a;设计测试 重写&#xff1a;让我们开始用go吧&#xff01; 重构和更新&#xff1a;实现胜利 结论 前言&#xff1a; 使用黑盒测试在Go中重写Bash脚本…

百度--搜索引擎是怎么实现的--如何制作一个搜索浏览器

1.搜索引擎是怎么实现的&#xff1f; 搜索引擎是通过以下步骤实现的&#xff1a; 网页抓取&#xff08;Crawling&#xff09;&#xff1a;搜索引擎会使用网络爬虫&#xff08;Web Crawler&#xff09;自动地从互联网上抓取网页内容。爬虫按照一定的规则遍历网页并提取网页内容…

做题遇见的PHP函数汇总

mb_substr函数 mb_substr() 函数返回字符串的一部分&#xff0c;之前学过 substr() 函数&#xff0c;它只针对英文字符&#xff0c;如果要分割的中文文字则需要使用 mb_substr() 语法&#xff1a; mb_substr ( $str ,$start [, $length NULL [, $encoding mb_encoding() ]] …

docker中运行RabbitMq的启用插件指南

我们使用 Docker 来运行 RabbitMQ&#xff0c;有时需要启用一些插件&#xff0c;这个与正常安装的启用插件的步骤会有所不同。以下是在 Docker 中启用 RabbitMQ 插件的一般步骤&#xff1a; 首先&#xff0c;确认已经将 rabbitmq_delayed_message_exchange-3.12.0.ez 插件文件复…

adb: failed to install .\xxxxxx.apk: Failure [INSTALL_FAILED_USER_RESTRICTED

开发者模式和USB调试均已打开&#xff0c;adb安装时报错。看了一下&#xff0c;小米手机还需要开启USB安装才行。 问题已解决