通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作增加编程要求
2.编程要求:
1)结构体封装
typedef struct{
char* cmd_arr; //命令行字符串
gpio_t* gpiox;//GPIO组号
unsigned int pin; //引脚编号
status_t status; //LED灯状态
void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status);
}cmd_t;
2)结构体数组
方式1:cmd_t cmd_arr[6] = {{"led1off",GPIOE,GPIO_PIN_10,GPIO_RESET_T},{},};
cmd_t cmd_arr[6] = {
[0] ={
.cmd_arr = "led1off",
.gpiox = GPIOE,
.pin = GPIO_PIN_10,
.status = GPIO_RESET_T,
.gpio_write_pin = hal_gpio_write, },
[1] = {},
[2] = {}, };
3)在串口输入一个字符串
1>在串口输入一个字符串,需要定义一个变量接收,串口接收到的字符串 char* string = uart_get_string();
2>串口中输入的字符串,与结构体中每个元素中的cmd_arr变量进行比较
3>如果比较成功,代表查到输入的字符串
思考:函数实现如何编写?
cmd_t* find_command(const char* str)
{
//串口中输入的字符串,与结构体中每个元素中的cmd_arr变量进行比较
//遍历比较,自己编写strcmp比较的函数
return 0;//失败返回0 }
4)思考main.c函数编写
cmd_t* cmd_arr;
char* string = uart_get_string();
cmd_arr = find_command(string);
if(cmd_arr == 0){
查找失败
}else
{
cmd_arr->gpio_write_pin(cmd_arr->gpiox,...........) }
实现结果:
头文件:
#ifndef __UART_LED_H__
#define __UART_LED_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
#include "gpio.h"
typedef struct{char * cmd_str;gpio_t* gpiox;unsigned int pin;status_t status;void (*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status);
}cmd_t;//串口初始化
void uart_init();//发送一个字符
void uart_put_char(const char str);//发送一个字符串
void uart_put_string(const char *str);//接收一个字符
char uart_get_char();//接收一个字符串
char* uart_get_string();void led1_init();void led2_init();void led3_init();//控制LED灯亮灭#endif源文件:
#include"uart_led.h"
extern void delay_ms(int ms);void uart_init()
{RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |=(0x1<<6);RCC->MP_AHB4ENSETR |=(0x1<<16);GPIOB->MODER &= (~(0x3<<4));GPIOB->MODER |=(0x1<<5);GPIOG->MODER &=(~(0x3<<22));GPIOG->MODER |=(0x1<<23);GPIOB->AFRL &=(~(0xf<<8));GPIOB->AFRL |=(0x1<<11);GPIOG->AFRH &=(~(0xf<<12));GPIOG->AFRH |=(0x6<<12);if(USART4->CR1 &=(0x1)){delay_ms(500);USART4->CR1 &= (~(0x1));}USART4->CR1 &=(~(0x1<<28));USART4->CR1 &=(~(0x1<<12));USART4->CR1 &=(~(0x1<<15));USART4->CR1 &=(~(0x1<<10));USART4->CR1 |=(0x1<<3);USART4->CR1 |=(0x1<<2);USART4->CR2 &=(~(0x3<<12));USART4->BRR |=0x22b;USART4->PRESC &= (~(0xf));USART4->CR1 |=(0x1);}//发送一个字符
void uart_put_char(const char str)
{while(!(USART4->ISR &(0x1<<7)));USART4->TDR =str;while(!(USART4->ISR &(0x1<<6)));
}//发送一个字符串
void uart_put_string(const char *str)
{while(!(USART4->ISR &(0x1<<7)));int i=0;while(str[i]!='\0'){USART4->TDR = str[i];i++;}}//接收一个字符
char uart_get_char()
{char ch;while(!(USART4->ISR &(0x1<<5)));ch=USART4->RDR;return ch;
}//接收一个字符串
char buffer[50]={0};
char* uart_get_string()
{int i=0;for(i=0;i<47;i++){buffer[i]=uart_get_char();uart_put_char(buffer[i]);if(buffer[i]=='\r')break;}buffer[i]='\0';uart_put_char('\n');return buffer;
}void led1_init()
{RCC->MP_AHB4ENSETR |=(0x1<<4);GPIOE->MODER &= (~(0x3<<20));GPIOE->MODER|= (0x1<<20);GPIOE->OTYPER &= (~(0x1<<10));GPIOE->OSPEEDR &= (~(0x3<<20));GPIOE->PUPDR &= (~(0x3<<20));}void led2_init()
{RCC->MP_AHB4ENSETR |=(0x1<<5);GPIOF->MODER &= (~(0x3<<20));GPIOF->MODER|= (0x1<<20);GPIOF->OTYPER &= (~(0x1<<10));GPIOF->OSPEEDR &= (~(0x3<<20));GPIOF->PUPDR &= (~(0x3<<20));}void led3_init()
{RCC->MP_AHB4ENSETR |=(0x1<<4);GPIOE->MODER &= (~(0x3<<16));GPIOE->MODER|= (0x1<<16);GPIOE->OTYPER &= (~(0x1<<8));GPIOE->OSPEEDR &= (~(0x3<<16));GPIOE->PUPDR &= (~(0x3<<16));}void hal_gpio_write(gpio_t * gpiox,unsigned int pin,status_t status)
{if(status==gpio_reset_t){gpiox->ODR &= (~(0x1<<pin));}else{gpiox->ODR |= (0x1<<pin);}
}测文件:
#include "uart_led.h"extern void printf(const char *fmt, ...);void delay_ms(int ms){int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; j++);}cmd_t cmd_arr[6]={[0] ={.cmd_str ="led1_up",.gpiox=GPIOE,.pin=GPIO_PIN_10,.status=gpio_set_t,.gpio_write_pin=hal_gpio_write,},[1] ={.cmd_str ="led1_off",.gpiox=GPIOE,.pin=GPIO_PIN_10,.status=gpio_reset_t,.gpio_write_pin=hal_gpio_write,},[2] ={.cmd_str ="led2_up",.gpiox=GPIOF,.pin=GPIO_PIN_10,.status=gpio_set_t,.gpio_write_pin=hal_gpio_write,},[3] ={.cmd_str ="led2_off",.gpiox=GPIOF,.pin=GPIO_PIN_10,.status=gpio_reset_t,.gpio_write_pin=hal_gpio_write,},[4] ={.cmd_str ="led3_up",.gpiox=GPIOE,.pin=GPIO_PIN_8,.status=gpio_set_t,.gpio_write_pin=hal_gpio_write,},[5] ={.cmd_str ="led3_off",.gpiox=GPIOE,.pin=GPIO_PIN_8,.status=gpio_reset_t,.gpio_write_pin=hal_gpio_write,},};cmd_t* find_command(char *str1){int j,i;for( j=0;j<6;j++){for(i=0;str1[i]!='\0';i++){if(str1[i]!=cmd_arr[j].cmd_str[i]){break;}}if(str1[i]=='\0'){return cmd_arr+j;}}return 0;}int main(){//串口初始化//实现串口数据收发led1_init();led2_init();led3_init();uart_init();cmd_t* cmd_ack;while(1){char *str=uart_get_string();cmd_ack=find_command(str);if(cmd_ack==0){printf("查找失败\n");}else{cmd_ack->gpio_write_pin(cmd_ack->gpiox,cmd_ack->pin,cmd_ack->status);}}return 0;}测试结果:


相关文章:
通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作增加编程要求
2.编程要求: 1)结构体封装 typedef struct{ char* cmd_arr; //命令行字符串 gpio_t* gpiox;//GPIO组号 unsigned int pin; //引脚编号 status_t status; //LED灯状态 void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status); }cmd_t; 2…...
银行家算法
银行家算法 银行家算法是一种用来避免操作系统死锁出现的有效算法,所以在引入银行家算法的解释之前,有必要简单介绍一下死锁的概念。 一、死锁 死锁:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成…...
181、【动态规划】leetcode ——72. 编辑距离(C++版本)
题目描述 原题链接:72. 编辑距离 解题思路 动态规划五步曲: (1)dp[i][j]含义: 以word1[i - 1]和word2[j - 1]结尾子串,经过最少次增删改后,可让word1变为word2的步数。dp中的i对应word1中的i…...
mysql 中关于慢查询日志
慢查询日志 慢查询日志主要用来记录执行时间超过设置的某个时长的SQL语句,能够帮助数据库维护人员找出执行时间比较长、执行效率比较低的SQL语句,并对这些SQL语句进行针对性优化。 开启慢查询 可以在 my.cnf 文件或者 my.ini 文件中配置开启慢查询日志…...
程序员必备的软技能-金字塔原理拆解(上)
原书 290千字,本文预计 14千字,拆解比 20:1,预计阅读时长 15分钟序言日常工作中,常常因为思维、表达方式不对产生不想要的结果:写了一个小时的周报,领导却不满意?跟团队讲了半天自己…...
关于我利用python开发的PC端标注软件及目标检测软件
如何利用python快速开发PC端目标检测及数据标注软件概述开发软件背景开发第一步:功能需求分析开发第二步: 前端分区设计开发第三步:功能开发开发第四步:程序功能的打包与检查开发第五步:程序的反馈与改善一个例子的展示…...
Git导出增量包的操作步骤
前言在项目开发部署中,通常是将一个Git项目全量打包发布,但有的场景只需要导出有变更的那部分文件,增量发布,此时就需要使用Git导出增量包了。一、查看提交记录拿到提交ID码①例如使用的gitlab使用方法参考下图(一目了然) 【推荐】…...
JavaWeb--JavaScript
JavaScript1 JavaScript简介2 JavaScript引入方式2.1 内部脚本2.2 外部脚本3 JavaScript基础语法3.1 书写语法3.2 输出语句3.3 变量3.4 数据类型3.5 运算符3.5.1 \\ 和 区别3.5.2 类型转换3.6 流程控制语句3.6.1 if 语句3.6.2 switch 语句3.6.3 for 循环语句3.6.4 while 循环语…...
mars3d加载建筑物白膜及简单建筑物样式
首先需要拥有shp格式的数据。可以通过水经微图下载,注意此软件是付费的将shp格式的数据处理为切片数据,可以使用cesiumlab处理完成得到json数据就可以在mars3d中加载了 function init() { // 判断webgl支持 if (!mars3d.Util.webglreport()) { …...
数据结构之顺序表
本章重点: 1.线性表 2.顺序表 3.链表 4.顺序表和链表的区别和联系 目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 2.2.1 SeqList.h 2.2.2 SeqList.c 2.3数组相关面试题 2.3.1移除元素 2.3.2删除有序数组中的重复项 编辑 2.3.3合并两个有序数组…...
【数据挖掘实战】——家用电器用户行为分析及事件识别
项目地址:Datamining_project: 数据挖掘实战项目代码 目录 一、背景和挖掘目标 1、问题背景 2、原始数据 3、挖掘目标 二、分析方法与过程 1、初步分析 2、总体流程 第一步:数据抽取 第二步:探索分析 第三步:数据的预处…...
肠道核心菌属——双歧杆菌属,了解并拥有它
双歧杆菌 双歧杆菌属(Bifidobacterium)是放线菌门严格厌氧的革兰氏阳性多形性杆状细菌。末端常常分叉,故名双歧杆菌。是人和动物肠道的重要核心菌群和有益生理菌群,也是母乳喂养婴儿中发现的第二大菌。 肥胖、糖尿病和过敏等各种疾…...
Python 之 Pandas 生成时间戳范围、Pandas 的时期函数 Period() 和时间序列 - 重采样 resample
文章目录一、生成时间戳范围1. 指定值2. 指定开始日期并设置期间数3. 频率 freq4. closed二、Pandas 的时期函数 Period()三、时间序列 - 重采样 resample在开始之前,我们先导入 numpy 和 pandas 库,同时导入 python 内置的模块。 import pandas as pd…...
利用Python和Sprak求曲线与X轴上方的面积
有n组标本(1, 2, 3, 4), 每组由m个( , , ...)元素( , )组成(m值不定), . 各组样本的分布 曲线如下图所示. 通过程序近似实现各曲线与oc, cd直线围成的⾯积. 思路 可以将图像分成若干个梯形,每个梯形的底边长为(Xn1 - Xn-1),面积为矩形的一半,…...
利用机器学习(mediapipe),进行人手的21个3D手关节坐标检测
感知手的形状和动作的能力可能是在各种技术领域和平台上改善用户体验的重要组成部分。例如,它可以构成手语理解和手势控制的基础,并且还可以在增强现实中将数字内容和信息覆盖在物理世界之上。虽然自然而然地出现在人们手中,但是强大的实时手感知力无疑是一项具有挑战性的计…...
【添砖java】谁说编程第一步是hello world
编程第一步明明是下载编译器和配置环境(小声逼逼)。 Windows下的java环境安装: java的安装包分为两类,一类是JRE(Java Runtime Environmental),是一个独立的java运行环境;一类是JDK…...
el-table大数据量渲染卡顿问题
1、场景描述 在项目开发中,遇到在表格中一次性加载完的需求,且加载数量不少,有几百几千条,并且每条都可能有自己的下拉框,输入框来做编辑功能,此时普通的el-table肯定会导致浏览器卡死,那么怎么…...
MyBatis-Plus 实现分页的几种写法
简介MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。快速开始添加依赖全新的 MyBatis-Plus 3.0 版本基于 JDK8ÿ…...
记一次Binder内存不足导致的应用被杀
每个进程的可用Binder内存大小是 1M-8KB 也就是900多KB 事情的起因的QA压测过程发生进程号变更,怀疑APP被杀掉过,于是开始看日志(实际后来模拟的时候可以发现app确实被杀掉了) APP的压测平台会上报进程号变更时间点,发…...
Zabbix4.0架构理解-zabbix的工作方式
目录 1.1、zabbix4.0架构图 1.2、zabbix的进程 1、 zabbix server 2、zabbix agent 3、 zabbix proxy 4、 java gateway 5、zabbix get 1.3、zabbix的几种工作方式 1、通过zabbix agent 2、通过zabbix proxy 3、通过 zabbix java gateway 4、其他 1.3、zabbix 数据走…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
