通过操作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 数据走…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...