2023年12月25日:串口发出控制命令

代码

uart4.c

#include "uart4.h"void uart4_config()
{//*****************************************//使能GPIOB|GPIOG|UART4外设时钟RCC->MP_AHB4ENSETR |=(0x1<<6);RCC->MP_AHB4ENSETR |=(0x1<<1);RCC->MP_APB1ENSETR |=(0x1<<16);RCC->MP_AHB4ENSETR |=(0x3<<4);//*****************************************//设置PB2|PG11用于UART4的管脚复用//PG11GPIOG->MODER &=(~(0x3<<22));//先清零GPIOG->MODER |=(0x2<<22);//再赋值GPIOG->AFRH &=(~(0xf<<12));GPIOG->AFRH |= (0x6<<12);//PB2GPIOB->MODER &=(~(0x3<<4));GPIOB->MODER |=(0x2<<4);GPIOB->AFRL &=(~(0xf<<8));GPIOB->AFRL |= (0x8<<8);//*****************************************//设置串口禁用USART4->CR1 &=(~0x1);//*****************************************//设置数据位宽为8位USART4->CR1 &=(~(0x1<<28));USART4->CR1 &=(~(0x1<<12));//*****************************************//设置无奇偶校验位USART4->CR1 &=(~(0x1<<10));//*****************************************//设置16倍过采样USART4->CR1 &=(~(0x1<<15));//*****************************************//设置1位的停止位USART4->CR2 &=(~(0x1<<12));//*****************************************//设置波特率为115200USART4->BRR =0x22B;//*****************************************//使能发送器USART4->CR1 |=(0x1<<3);//*****************************************//使能接收器USART4->CR1 |=(0x1<<2);//*****************************************//使能串口USART4->CR1 |=0x1;//*****************************************//LED1的操作GPIOE->MODER &=(~(0x3<<20));//设置PE10输出GPIOE->MODER |=(0x1<<20);GPIOE->OTYPER &=(~(0x1<<10));//设置PE10为推挽输出GPIOE->OSPEEDR &=(~(0x3<<20));//设置低速输出GPIOE->PUPDR &=(~(0x3<<20));//设置无上拉下拉//*****************************************//LED2的操作GPIOF->MODER &=(~(0x3<<20));//设置PF10输出GPIOF->MODER |=(0x1<<20);GPIOF->OTYPER &=(~(0x1<<10));//设置PF10为推挽输出GPIOF->OSPEEDR &=(~(0x3<<20));//设置低速输出GPIOF->PUPDR &=(~(0x3<<20));//设置无上拉下拉//*****************************************//LED3的操作GPIOE->MODER &=(~(0x3<<16));//设置PE10输出GPIOE->MODER |=(0x1<<16);GPIOE->OTYPER &=(~(0x1<<8));//设置PE10为推挽输出GPIOE->OSPEEDR &=(~(0x3<<16));//设置低速输出GPIOE->PUPDR &=(~(0x3<<16));//设置无上拉下拉}//发送一个单字符
void putchar(char a)
{//先判发送器是否为空,不为空阻塞等待while(!(USART4->ISR &(0x1<<7)));//向发送寄存器写入数据USART4->TDR=a;//等待发送完成while(!(USART4->ISR &(0x1<<6)));}
//接收一个单字符
char getchar()
{char a;//判断接收器是否有准备好的数据while(!(USART4->ISR &(0x1<<5)));//读取数据a=USART4->RDR;//返回return a;}//发送一个字符串
void puts(char *s)
{while(*s){putchar(*s);s++;}putchar('\r');putchar('\n');
}
//接受一个字符串
void gets(char *s)
{while(1){*s=getchar();putchar(*s);//键盘输入的内容在串口上回显if(*s=='\r')break;s++;}*s='\0';putchar('\n');
}
//字符串比较
int strcmp(char *src,char *dst)
{while(*src!='\0' || *dst!='\0'){if(*src!=*dst){return *src - *dst;}src++;dst++;}return 0;
}

main.c

//#include "gpio.h"#include "uart4.h"int main(){//	char a;char src[128];uart4_config();while(1){/*		//接受一个字符数据a=getchar();//发送接收到的字符+1putchar(a);putchar('\r');//回车,切换到下一行putchar('\n');//换行*/		gets(src);puts(src);if(strcmp(src,"led1_on")==0){GPIOE->ODR |=(0x1<<10);}else if(strcmp(src,"led1_off")==0){GPIOE->ODR &=(~(0x1<<10));}else if(strcmp(src,"led2_on")==0){GPIOF->ODR |=(0x1<<10);}else if(strcmp(src,"led2_off")==0){GPIOF->ODR &=(~(0x1<<10));}else if(strcmp(src,"led3_on")==0){GPIOE->ODR |=(0x1<<8);}else if(strcmp(src,"led3_off")==0){GPIOE->ODR &=(~(0x1<<8));}}return 0;}

uart4.h

#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"void uart4_config();
void putchar(char a);
char getchar();
void gets(char *s);
void puts(char *s);
int strcmp(char *src,char *dst);#endif

效果图

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

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

相关文章

27 redis 的 sentinel 集群

前言 redis 的哨兵的相关业务功能的实现 哨兵的主要作用是 检测 redis 主从集群中的 master 是否挂掉, 单个哨兵节点识别 master 下线为主管下线, 超过 quorum 个 哨兵节点 认为 master 挂掉, 识别为 客观下线 然后做 failover 的相关处理, 重新选举 master 节点 我们这里…

平衡二叉树的构建(递归

目录 1.概念&#xff1a;2.特点&#xff1a;3.构建方法&#xff1a;4.代码&#xff1a;小结&#xff1a; 1.概念&#xff1a; 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&#xff0c;也称为AVL树&#xff0c;是一种二叉树&#xff0c;它满足每个节点的左子树和右…

异常和智能指针

智能指针的认识 智能指针是一种C语言中用于管理动态内存的工具&#xff0c;它们可以自动管理内存的分配和释放&#xff0c;从而避免内存泄漏和悬空指针等问题。智能指针可以跟踪指向的对象的引用次数&#xff0c;并在需要时自动释放被引用的内存&#xff0c;这极大地提高了内存…

openGauss学习笔记-173 openGauss 数据库运维-备份与恢复-导入数据-对表执行VACUUM

文章目录 openGauss学习笔记-173 openGauss 数据库运维-备份与恢复-导入数据-对表执行VACUUM openGauss学习笔记-173 openGauss 数据库运维-备份与恢复-导入数据-对表执行VACUUM 如果导入过程中&#xff0c;进行了大量的更新或删除行时&#xff0c;应运行VACUUM FULL命令&…

关于合同能源管理

合同能源管理模式&#xff1a;我投资、你节能、收益共享 合同能源管理&#xff08;EPC——Energy Performance Contracting&#xff09;&#xff1a;节能服务公司与用能单位以契约形式约定节能项目的节能目标&#xff0c;节能服务公司为实现节能目标向用能单位提供必要的服务&…

Python 直方图的绘制-`hist()`方法(Matplotlib篇-第7讲)

Python 直方图的绘制-hist()方法(Matplotlib篇-第7讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

什么是制造业的数字化车间

什么是制造业的数字化车间&#xff0c;在企业数字化转型中&#xff0c;数字化车间的存在至关重要&#xff0c;其意思就是将制造业车间里所有的工作流程数字化&#xff0c;实现设备、生产流程、工人等各环节之间的数字化管理与协同&#xff0c;全面提升制造业企业的生产效率和产…

data选项声明-vite项目

新建App.vue,内容如下 <script>export default{//data选项声明响应式状态&#xff0c;必须是返回一个对象的函数data(){return{//声明状态属性&#xff0c;属性名不能以$和_开头&#xff0c;内置使用保留&#xff0c;不让我们声明使用msg:我是谁,age:18,salary:99.99,st…

「Verilog学习笔记」并串转换

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 串并转换操作是非常灵活的操作&#xff0c;核心思想就是移位。串转并就是把1位的输入放到N位reg的最低位&#xff0c;然后N位reg左移一位&#xff0c;在把1位输入放到左移后…

如何做好接口测试?资深测试老鸟总结,一篇带你打通...

前言 1、接口测试 1&#xff09;什么是接口测试&#xff1f; 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相…

TCP协议工作原理及实战(一)

实战项目目标&#xff1a; ui搭建&#xff1a;clientconnect 客户端连接 clientdisconnect 客户端断开 socketreaddate 使用套接字传输数据 newconnection新的连接 获取本机的IP地址&#xff1a; 获取本机的ip地址可以参考前面的QT网络编程协议 将得到的ip地址放入combox中…

VMware安装linux系统一

1、创建虚拟机 1.1、创建新的虚拟机 1.2、进入安装向导 1.3、安装操作系统&#xff0c;选择稍后安装操作系统 1.4、选择Linux,版本选择CentOS64位 1.5、设置虚拟机名称和安装位置 1.6、设置磁盘大小 1.7、创建虚拟机 1.8、完成安装 2、配置虚拟机 2.1、选择编辑虚拟机 2.2、修…

sql_lab之sqli注入中的cookie注入

Cookei注入&#xff08;gxa的从cookei注入&#xff09; 1.打开控制台 2.验证id2时的值 document.cookie"id2" 3.判断是上面闭合方式 document.cookie"id2 -- s" 有回显 说明是’单引号闭合 4.用order by 判断字段数 5.用联合查询判断回显点 接下来的…

“用户名不在 sudoers文件中,此事将被报告” 解决方法

原因 当普通用户需要安装文件时&#xff0c;无法用yum install ** -y直接安装时&#xff0c;采用sudo yum install **; 但是发现提示“用户名不在 sudoers文件中&#xff0c;此事将被报告” 解决方法。 这是因为该普通用户不在sudoers文件中&#xff0c;所以要找到该文件&am…

java数据结构与算法刷题-----LeetCode167:两数之和 II - 输入有序数组

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 思路 题目要求我们找到两个数相加的和&#xff0c;等于target指定的值。而…

数据库01_增删改查

1、什么是数据&#xff1f;什么是数据库&#xff1f; 数据&#xff1a;描述事物的符号记录称为数据。数据是数据库中存储的基本对象。数据库&#xff1a;存放数据的仓库&#xff0c;数据库中可以保存文本型数据、二进制数据、多媒体数据等数据 2、数据库的发展 第一阶段&…

不可能得到的最短骰子序列

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个长度为 n 的整数数组 rolls 和一个整数 k 。你扔一个 k 面的骰子 n 次&#xff0c;…

【知识点随笔分享 | 第九篇】常见的限流算法

目录 前言&#xff1a; 1.固定窗口限流&#xff1a; 缺点&#xff1a; 2.滑动窗口限流&#xff1a; 优点&#xff1a; 滴桶限流&#xff1a; 缺点&#xff1a; 令牌桶限流&#xff1a; 优点&#xff1a; 总结: 前言&#xff1a; 当今互联网时代&#xff0c;随着网络…

creo投影的使用-如何将一个实体的轮廓曲线单独画出来

第一步&#xff1a;先建立一个平面&#xff1a; 比如你需要将实物的曲线正对自己&#xff0c;然后建立此面的偏移平面&#xff0c;然后选中新建立的偏移平面&#xff0c; 然后进入新偏移平面的草绘&#xff0c;然后就可以进行投影了。 第二步&#xff1a;建立参考&#xff1a;…

低代码实施复杂应用的实践方法

内容来自演讲&#xff1a;韦有炬 | 柳州知行远企业管理咨询有限公司 | 总经理 摘要 本文探讨了在全民开发时代如何使用低代码实施复杂应用并降低上线风险。文章分析了复杂系统实施失败的风险&#xff0c;包括项目规划不周、人员变动、企业基础管理不足等&#xff0c;并对比了低…