通过操作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 数据走…...
nvm-setup安装步骤详解
nvm-setup是 Node Version Manager(Node.js 版本管理器) 的安装包。装了它,你就能在一台电脑上随时切换多个 Node.js 版本,做前端开发、跑不同项目的必备工具。一、准备工作安装包下载:https://wwbkk.lanzoub.com/iU…...
2026出纳岗位新人如何快速提升能力:从基础上手到能力跃升的最快路径
2026年,出纳岗位已经不再只是“收付款、跑银行、登记现金日记账”这么简单。随着企业财务数字化、业财一体化和AI工具普及,新人想快速成长,必须同时具备规范意识、系统操作能力、数据思维和风险意识。这也是为什么越来越多财务新人会关注像CD…...
Anthropic Managed Agents:AI代理的运行时操作系统时刻
1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了你有没有试过让一个 AI 代理连续工作四十分钟?不是闲聊,而是真干活:查数据库、调 API、读 PDF、写代码、改配置、再回传结果——一环扣一环,中间不能断。我去年就…...
P1311 选择客栈【洛谷算法习题】
P1311 选择客栈 网页链接 P1311 选择客栈 题目描述 丽江河边有 nnn 家很有特色的客栈,客栈按照其位置顺序从 111 到 nnn 编号。每家客栈都按照某一种色调进行装饰(总共 kkk 种,用整数 0∼k−10 \sim k-10∼k−1 表示)&#x…...
从实战出发:聊聊Serial口静态路由在老旧网络设备迁移中的那些事儿
从实战出发:聊聊Serial口静态路由在老旧网络设备迁移中的那些事儿 第一次在机房里见到那台积满灰尘的Cisco 1841时,我差点以为这是个博物馆展品。但客户坚持说这台服役超过15年的老伙计承载着他们最重要的生产线控制数据,任何闪失都可能造成六…...
跨平台macOS组件获取:系统部署专家的高效解决方案
跨平台macOS组件获取:系统部署专家的高效解决方案 【免费下载链接】gibMacOS Py2/py3 script that can download macOS components direct from Apple 项目地址: https://gitcode.com/gh_mirrors/gi/gibMacOS 在macOS系统部署和维护的复杂环境中,…...
2026降AI率工具红黑榜:AI智能降重工具怎么选?用数据说话!
红榜优先选千笔AI、ThouPen、豆包,适配国内高校AI率检测规范;黑榜避开低质免费降AI工具、无正规检测对接、改写痕迹生硬的工具,优先按需求匹配三维模型(降AI效果-学术合规性-使用成本)。 一、红榜:10 款高分…...
深度解析ESLyric-LyricsSource:Foobar2000逐字歌词插件的终极技术方案
深度解析ESLyric-LyricsSource:Foobar2000逐字歌词插件的终极技术方案 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource ESLyric-LyricsSource是…...
打造梦幻岛屿的5个秘诀:免费在线规划工具完整指南
打造梦幻岛屿的5个秘诀:免费在线规划工具完整指南 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)",是一个在线工具,它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(Animal Crossing)启发…...
终极FileBrowser上手指南:10分钟掌握Web文件管理神器
终极FileBrowser上手指南:10分钟掌握Web文件管理神器 【免费下载链接】filebrowser 📂 Web File Browser 项目地址: https://gitcode.com/gh_mirrors/fi/filebrowser FileBrowser是一个功能强大的Web文件管理器,让你能够通过浏览器界面…...
