当前位置: 首页 > news >正文

通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作

1.通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作
例如在串口输入led1on,开饭led1灯点亮

2.例如在串口输入led1off,开饭led1灯熄灭

3.例如在串口输入led2on,开饭led2灯点亮

4.例如在串口输入led2off,开饭led2灯熄灭

5.例如在串口输入led3on,开饭led3灯点亮

6.例如在串口输入led3off,开饭led3灯熄灭

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 __TEST_H__
#define __TEST_H__#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
#include "gpio.h"typedef struct{char* cmd_str;  //命令行字符串gpio_t* gpiox;  //GPIO组号unsigned int pin;  //引脚编号gpio_status_t status;  //LED灯状态void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,gpio_status_t status);
}cmd_t;//UART初始化
void uart_init();
//LED初始化
void LED_init(gpio_t* GPIOX,unsigned int PIN);
//发送一个字符
void put_char(const char ch);
//接收一个字符
char get_char();
//发送一个字符串
void put_string(const char* str);
//接收一个字符串
char* get_string();
//点亮LED
void LED_lighting(gpio_t* GPIOX,unsigned int PIN,gpio_status_t status);
//字符串比较函数
int strcmp(const char* string,const char* arr_string);
cmd_t* find_command(const char* str);#endif


源文件

#include "test.h"cmd_t cmd_arr[6] = {                                     [0] ={                                               .cmd_str = "led1on",                             .gpiox = GPIOE,                                  .pin = gpio_PIN_10,                              .status = gpio_set,                              .gpio_write_pin = LED_lighting,                  },                                                   [1] ={                                               .cmd_str = "led1off",                            .gpiox = GPIOE,                                  .pin = gpio_PIN_10,                              .status = gpio_reset,                            .gpio_write_pin = LED_lighting,                  },                                                   [2] ={                                               .cmd_str = "led2on",                             .gpiox = GPIOF,                                  .pin = gpio_PIN_10,                              .status = gpio_set,                              .gpio_write_pin = LED_lighting,                  },                                                   [3] ={                                               .cmd_str = "led2off",                            .gpiox = GPIOF,                                  .pin = gpio_PIN_10,                              .status = gpio_reset,                            .gpio_write_pin = LED_lighting,                  },                                                   [4] ={                                               .cmd_str = "led3on",                             .gpiox = GPIOE,                                  .pin = gpio_PIN_8,                               .status = gpio_set,                              .gpio_write_pin = LED_lighting,                  },                                                   [5] ={                                               .cmd_str = "led3off",                            .gpiox = GPIOE,                                  .pin = gpio_PIN_8,                               .status = gpio_reset,                            .gpio_write_pin = LED_lighting,                  }                                                    
};                                                       //UART初始化
void uart_init(){//RCC_AHB4ENSETRRCC->MP_AHB4ENSETR |= (0x1<<1);   //GPIOB使能RCC->MP_AHB4ENSETR |= (0x1<<6);   //GPIOG使能//RCC_APB1ENSETRRCC->MP_APB1ENSETR |= (0x1<<16);  //UART4使能//GPIOBGPIOB->MODER &= (~(0x3<<4));  //GPIOB_MODER设置复用功能模式GPIOB->MODER |= (0x1<<5);GPIOB->AFRL &= (~(0xf<<8));   //设置GPIOB引脚功能复用模式 GPIOB->AFRL |= (0x1<<11);//GPIOGGPIOG->MODER &= (~(0x3<<22));  //GPIOG_MODER设置复用功能模式GPIOG->MODER |= (0x1<<23);GPIOG->AFRH &= (~(0xf<<12));   //设置GPIOG引脚功能复用模式 GPIOG->AFRH |= (0x3<<13);//uart初始化USART4->CR1 &= (~(0x1<<0));   //判断UE是否等于0USART4->CR1 &= (~(0x1<<12));  USART4->CR1 &= (~(0x1<<28));   //设置数据位宽度为8位USART4->CR2 &= (~(0x3<<12));   //设置1位停止位USART4->CR1 &= (~(0x1<<15));   //设置16倍采样率USART4->CR1 &= (~(0x1<<10));   //设置串口无奇偶位USART4->BRR = 0x22B;USART4->CR1 &= (~(0x1<<3));  USART4->CR1 |= (0x1<<3);   //发送使能USART4->CR1 &= (~(0x1<<2)); USART4->CR1 |= (0x1<<2);   //接收器使能USART4->PRESC &= (~(0xf<<0));  //一级分配USART4->CR1 |= (0x1<<0);   //UART使能
}//LED初始化
void LED_init(gpio_t* GPIOX,unsigned int PIN){//RCC_AHB4ENSETRif(GPIOX == GPIOE){RCC->MP_AHB4ENSETR |= (0x1<<4);   //GPIOE使能}else{RCC->MP_AHB4ENSETR |= (0x1<<5);   //GPIOF使能}//GPIOXGPIOX->MODER &= (~(0x3<<(PIN*2)));   //设置输出模式GPIOX->MODER |= (0x1<<(PIN*2));GPIOX->OTYPER &= (~(0x1<<PIN));  //设置推挽输出GPIOX->OSPEEDR &= (~(0x3<<(PIN*2))); //设置低速输出模式GPIOX->PUPDR &= (~(0x3<<(PIN*2)));  //设置禁止上下拉电阻}
//发送一个字符
void put_char(const char ch){//判断发送寄存器是否为空while(!(USART4->ISR & (0x1<<7)));//将数据放入发送寄存器中USART4->TDR = ch;//如果字符是\n,则再发送一个回车\rif(ch == '\n'){while(!(USART4->ISR & (0x1<<7)));USART4->TDR = '\r';}//判断一帧数据是否发送成功while(!(USART4->ISR & (0x1<<6)));}
//接收一个字符
char get_char(){char ch;//判断接收数据寄存器是否为空while(!(USART4->ISR & (0x1<<5)));//将接收到的数据放入接收数据寄存器中ch = USART4->RDR;return ch;
}
//发送一个字符串
void put_string(const char* str){//循环发送字符for(int i=0; str[i]!='\0'; i++){put_char(str[i]);}put_char('\n');put_char('\r');
}
char buf[50]={0};
//接收一个字符串
char* get_string(){int i = 0;for(i=0; (buf[i]=get_char()) != '\r';i++){put_char(buf[i]);}buf[i]='\0';put_char('\n');put_char('\r');return buf;
}
//点亮LED
void LED_lighting(gpio_t* GPIOX,unsigned int PIN,gpio_status_t status){if(status == gpio_set){    //如果num=1,则点亮灯GPIOX->ODR |= (0x1<<PIN);}else{          //否则熄灭灯GPIOX->ODR &= (~(0x1<<PIN));}
}
//字符串比较函数
int strcmp(const char* string,const char* arr_string){while((*string != '\0') && (*arr_string != '\0')){if(*string > *arr_string){return *string-*arr_string;}else if(*string < *arr_string){return *string-*arr_string;}string++;arr_string++;}return 0;
}
cmd_t* find_command(const char* str){for(int i=0; i<6;i++){if(strcmp(str,cmd_arr[i].cmd_str)==0){return &cmd_arr[i];}}return 0;
}


main.c

#include "test.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++);
}int main()
{	//初始化UARTuart_init();//初始化LED1LED_init(GPIOE,10);//初始化LED2LED_init(GPIOF,10);//初始化LED3LED_init(GPIOE,8);put_string("UART AND LED TEST!!!");while(1){cmd_t* cmd_p;char* string = get_string();cmd_p = find_command(string);   //让接收到的字符串进行比较if(cmd_p == 0){printf("输入错误\n");}else{cmd_p->gpio_write_pin(cmd_p->gpiox,cmd_p->pin,cmd_p->status);}}return 0;
}

运行结果

 

相关文章:

通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作

1.通过操作Cortex-A7核&#xff0c;串口输入相应的命令&#xff0c;控制LED灯进行工作 例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输入led2off,开饭led2灯熄灭 5.例如在串口输入led…...

Python实现某du文库vip内容下载,保存成PDF

前言 是谁&#xff0c;是谁在网页上搜索往年考试卷题答案的时候只能阅读前两页的选择题&#xff0c;是谁在搜几千字的文档资料只能看25%&#xff0c;是谁在百度文库找七找八的时候所有的东西都要付费才能继续看… 我先说 是我自己 我又不经常用&#xff0c;只有偶尔需要看看…...

vue3.0 模板语法

文章目录前言&#xff1a;1. 内容渲染指令1.1 v-text1.2 {{ }}插值表达式1.3 v-html2. 双向绑定指令2.1 v-model2.2 v-model的修饰符3. 属性绑定指令3.1 动态绑定多个属性值3.2 绑定class和style属性4.条件渲染指令4.1 v-if、v-else-if、v-else4.2 v-show4.3 v-if与v-show的区别…...

【GlobalMapper精品教程】054:标签(标注)功能案例详解

同ArcGIS标注一样,globalmapper提供了动态标注的功能,称为标签,本文详解标签的使用方法。 文章目录 一、标签配置二、创建标签图层三、标签图层选项1. 标签字段2. 标签样式3. 标签格式4. 标签语言5. 标签优先级一、标签配置 在配置页面的【矢量显示】→标签选项卡下,有标签…...

超详细树状数组讲解(+例题:动态求连续区间和)

树状数组的作用&#xff1a;快速的对数列的一段范围求和快速的修改数列的某一个数为什么要使用树状数组&#xff1a;大家从作用中看到快速求和的时候可能会想到为什么不使用前缀和只需要预处理一下就可以在O(1)的时间复杂度下实行对于数列的一段范围的和但是我们可以得到当我们…...

【学习笔记】AGC055

A - ABC Identity 如果只有AAA,BBB两种字符的话&#xff0c;我们发现要寻找p∈[1,n]p\in [1,n]p∈[1,n]&#xff0c;使得[1:p][1:p][1:p]中AAA的数目与[p1:n][p1:n][p1:n]中BBB的数目相同。 如果有A,B,CA,B,CA,B,C三种字符&#xff0c;我们可以先将A,BA,BA,B分离出来&#xf…...

墨者——内部文件上传系统漏洞分析溯源 内部文件上传系统漏洞分析溯源

墨者——内部文件上传系统漏洞分析溯源 内部文件上传系统漏洞分析溯源 1.选择合适的文件上传 2.可以看到为*.asp文件 3.可以推测出此站点为IIS 4.上传shell.asp试试 5.上传报错&#xff0c;将其改名为shell.asp.txt上传&#xff0c;发现上传成功 6.有个问题就是服务器将我们所…...

5.2 Python if语句

5.2.3 检查是否不相等要判断两个值是否不等&#xff0c;可结合使用惊叹号和等号(!)&#xff0c;其中的惊叹号表示不&#xff0c;在很多编程语言中都如此。下面再使用一条if语句来演示如何使用不等运算符。我们将把要求的比萨配料存储在一个变量中&#xff0c;再打印一条消息&am…...

ubuntu gerrit 配置

1 - 简介 参考地址: https://www.cnblogs.com/anliven/p/12019974.html https://www.cnblogs.com/anliven/p/11980432.html 虽然Gerrit 本身提供 Code Review和 Git 仓库的两大功能,但实际上很多项目用的是其他的Git仓库,例如GitLab和GitHub。 一般情况下,Gerrit位于最终…...

运动蓝牙耳机什么牌子好,运动蓝牙耳机品牌推荐

现在市面上运动耳机的品牌越来越多&#xff0c;还不知道选择哪一些运动耳机品牌&#xff0c;可以看看下面的一些耳机分享&#xff0c;运动耳机需要注意耳机的参数配置以及佩戴舒适度&#xff0c;根据自己最根本的使用需求来选择运动耳机。 1、南卡Runner Pro4骨传导蓝牙运动耳…...

(7)C#传智:方法及参数、重载(第7天)

一、方法作用域 被调用者需要调用者的值,方法有二: 1.传参数. private static void Main(string[] args){int m 3;Console.WriteLine(m);Console.ReadKey();}public static int GetMax(int m){return m 3;} 2.使用静态字段模拟全局. 多个方法都需要时&#x…...

Python 函数式编程

函数式编程&#xff1a;允许把函数本身作为参数传入另一个函数&#xff0c;还允许返回一个函数&#xff01; 1.高阶函数 一个函数可以接收另一个函数作为参数&#xff0c;这种函数称之为高阶函数 abs(-10) 是函数调用 abs是函数本身 abs函数名其实是一个变量名 变量可以…...

pandas读取EXCEL列名重复问题解决——pandas设置多行为列名(多层列名)

问题呈现 这是我在问答区看到的一个问题。 问&#xff1a;在python中使用pandas读取Excel数据&#xff0c;重复数据被区分了&#xff0c;如何做到重复数据不被区分&#xff1f; 解决思路 很明显&#xff0c;这是pandas读取excel文件时列名设置问题&#xff0c;我第一时间想…...

CMake常用语法

1. cmake_minimum_required(VERSION 3.4.1) 指定需要的最小的cmake版本 2. aux_source_directory 查找源文件并保存到相应的变量中: #查找当前目录下所有源文件并保存至SRC_LIST变量中 aux_source_directory(. SRC_LIST)3. add_library 3.1 添加一个库 add_library(<n…...

Java知识复习(一)基础知识

1、什么是JVM、JDK和JRE&#xff1f; JVM是指运行Java字节码的虚拟机。而字节码文件指的就是扩展名为.class的文件&#xff0c;JDK指功能齐全的Java SDK&#xff0c;能够创建和编译程序JRE指Java运行的环境&#xff0c;包括JVM、类库和命令等 2、重载和重写的主要区别 重载&…...

springboot+vue.js校园车辆用车预约管理系统

springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 前端技术&#xff1a;nodejsvueelementui本项目的应用场景描述如下&…...

【 K8s 源码之调度学习】Pod 间亲和性和反亲和性的源码分析

查看案例 字段含义podAffinityPod 间的亲和性定义podAntiAffinityPod 间的反亲和性定义requiredDuringSchedulingIgnoredDuringExecution硬性要求&#xff0c;必须满足条件&#xff0c;保证分散部署的效果最好使用用此方式preferredDuringSchedulingIgnoredDuringExecution软性…...

计及绿证交易及碳排放的含智能楼宇微网优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

场景扩展,体验升级 | DBMotion新增无公网数据库迁移、支持监控报警等多项功能

丝滑的零停机数据库在线迁移工具——DBMotion&#xff0c;又双叒叕发新版&#xff1a;新增的网关、数据源功能&#xff0c;让你无公网IP的数据库也可以迁移&#xff1b;新增的监控功能&#xff0c;让你对迁移性能一目了然&#xff1b;新增的报警功能&#xff0c;让你及时获得同…...

【正点原子FPGA连载】第十五章eMMC读写测试实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十五章eMMC读写…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...