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

作业2.25----通过操作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,...........)

}

led.h

#ifndef __TEST_H__
#define __TEST_H__#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"#define GPIO_PIN_8 8
#define GPIO_PIN_9 9
#define GPIO_PIN_10 10//GPIO章节初始化
void GPIO_INIT();//UART章节初始化
void UART_INIT();//RCC章节初始化
void RCC_INIT();//发送一个字符
void put_char(const char str);//发送一个字符串
void put_string(const char* str);//接收一个字符
char get_char();//接收一个字符串
char* get_string();//字符串比较函数
int my_strcmp(char *a,char *b);//封装灯泡亮灭枚举
typedef enum 
{reset_t,set_t,
}status_t;//结构体封装
typedef struct{char* cmd_arr; gpio_t* gpiox;unsigned int pin; status_t status;   void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status);  
}cmd_t;
cmd_t* find_command(char* str);//重写函数
void hall_gpio_write(gpio_t* gpiox,unsigned int pin,status_t state);
#endif

led.c

#include "test.h"//GPIO章节初始化                                                                
void GPIO_INIT()
{//设置3个灯的模式GPIOE->MODER&=(~(0x3<<20));GPIOE->MODER|=(0x1<<20);GPIOF->MODER&=(~(0x3<<20));GPIOF->MODER|=(0x1<<20);GPIOE->MODER&=(~(0x3<<16));GPIOE->MODER|=(0x1<<16);//设置推挽输出GPIOE->OTYPER&=(~(0x1<<10));GPIOF->OTYPER&=(~(0x1<<10));GPIOE->OTYPER&=(~(0x1<<8));//设置低速GPIOE->OSPEEDR&=(~(0x3<<20));GPIOF->OSPEEDR&=(~(0x3<<20));GPIOE->OSPEEDR&=(~(0x3<<16));//不需要上拉GPIOE->PUPDR&=(~(0x3<<20));GPIOF->PUPDR&=(~(0x3<<20));GPIOE->PUPDR&=(~(0x3<<16));/**********************************///设置GPIOB引脚输出为复用模式GPIOB->MODER&=(~(0x3<<4));GPIOB->MODER|=(0x2<<4);//设置GPIOG引脚输出模式GPIOG->MODER&=(~(0x3<<22));GPIOG->MODER|=(0x2<<22);//设置GPIOB功能复用模式GPIOB->AFRL&=(~(0x15<<8));GPIOB->AFRL|=(0x8<<8);//设置GPIOG功能复用模式GPIOG->AFRH&=(~(0x6<<12));GPIOG->AFRH|=(0x6<<12);}//UART章节初始化                                                                
void UART_INIT()
{//设置宽度USART4->CR1&=(~(0x1<<12));USART4->CR1&=(~(0x1<<28));USART4->CR1&=(~(0x1<<15));USART4->CR1&=(~(0x1<<10));USART4->CR1|=(0x1<<3);USART4->CR1|=(0x1<<2);USART4->CR1|=(0x1);USART4->CR2&=(~(0x3<<12));	//3.设置一级分配USART4->PRESC&=(~(0x15));//4.USART_BRR:设置串口波特率USART4->BRR=0x22B;}//RCC章节初始化                                                                 
void RCC_INIT()
{//对GPIOE和GPIOG使能RCC->MP_AHB4ENSETR|=(0x3<<4);       //对GPIOB使能RCC->MP_AHB4ENSETR|=(0x1<<1);//对GPIOG使能RCC->MP_AHB4ENSETR|=(0x1<<6);//对UART4使能RCC->MP_APB1ENSETR|=(0x1<<16);}//发送一个字符                                                                  
void put_char(const char str)
{while(!(USART4->ISR & (0x1 << 7)));                        //2.将要发送的字符,写到发送数据寄存器中                   USART4->TDR = str;                                         //3.判断发送数据是否完成 ISR[6]                            while(!(USART4->ISR & (0x1<<6)));}//发送一个字符串                                                                
void put_string(const char* str)
{//判断是否为'\0',一个字符一个字符发送  for(int i=0;str[i]!='\0';i++){put_char(str[i]);	}put_char('\n');put_char('\r');}//接收一个字符                                                                  
char get_char()
{char ch;                                         //1.判断接收数据寄存器是否有数据可读 ISR[5]      while(!(USART4->ISR & (0x1<<5)));  //2.将接收到的数据读出来                         ch = USART4->RDR;                                return ch;    }char buf[50]={0};//接收一个字符串                                                                
char* get_string()
{//for循环int i=0;//当键盘的回车键'\r'按下之后,字符串输入完成  for(i=0;(buf[i]=get_char())!='\r';i++){put_char(buf[i]);}//字符串补'\0'                                 buf[i] = '\0';  put_char('\n');put_char('\r');return buf;}//字符串比较函数                                                                
int my_strcmp(char *a,char *b)
{while(*a || *b){if(*a!=*b){return *a-*b;}a++;b++;}return 0;}//结构体封装                                                                    
cmd_t cmd_arr[6] ={[0]={"led1on" ,GPIOE,GPIO_PIN_10,set_t,hall_gpio_write},[1]={"led1off",GPIOE,GPIO_PIN_10,reset_t,hall_gpio_write},[2]={"led2on" ,GPIOF,GPIO_PIN_10,set_t,hall_gpio_write},[3]={"led2off",GPIOF,GPIO_PIN_10,reset_t,hall_gpio_write},[4]={"led3on" ,GPIOE,GPIO_PIN_8 ,set_t,hall_gpio_write},[5]={"led3off",GPIOE,GPIO_PIN_8 ,reset_t,hall_gpio_write}
};cmd_t* find_command(char* str)
{for(int i=0; i<6; i++){if(my_strcmp(str,cmd_arr[i].cmd_arr)==0){return &cmd_arr[i];}}return 0; 		//失败返回0}//对GPIO引脚写控制灯光亮灭函数
void hall_gpio_write(gpio_t* gpiox,unsigned int pin,status_t state)
{if(state == set_t){gpiox->ODR |=(0x1<<pin);}else if(state == reset_t){gpiox->ODR &= (~(0x1<<pin)); }
}

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()
{RCC_INIT();GPIO_INIT();UART_INIT();while(1){cmd_t* cmd_arr;char *string = get_string();cmd_arr = find_command(string);if(cmd_arr == 0){put_string("error");}else{cmd_arr->gpio_write_pin(cmd_arr->gpiox,cmd_arr->pin,cmd_arr->status);}}return 0;}

测试结果

 

相关文章:

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

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

0101基础概念-图-数据结构和算法(Java)

文章目录1 图1.1 定义1.2 4种图模型2 无向图2.1 定义2.2 术语后记1 图 1.1 定义 图是一种非线性的数据结构&#xff0c;表示多对多的关系。 图&#xff08;Graph&#xff09;是由顶点的有穷非空集合和顶点之间边的集合组成&#xff0c;通常表示为&#xff1a;G(V, E)&#xf…...

Linux基础命令和工具使用详解

Linux基础命令和工具使用详解一、grep搜索字符二、find查找文件三、ls 显示文件四、wc命令计算字数五、uptime机器启动时间负载六、ulimit用户资源七、curl http八、scp远程拷贝九、dos2unix和unix2dos十、sed 行处理10.1、简单模式10.2、替换模式十一、awk 列处理11.1、打印某…...

一个好的python文件可以有几种用途?

大家好鸭&#xff01;我是小熊猫~ 这次来带大家浅浅回顾一点python小知识~ 源码资料电子书:点击此处跳转文末名片获取 python文件总共有两种用途&#xff1a; 一种是执行文件另一种是被当做模块导入 编写好的一个python文件可以有两种用途&#xff1a; 1. 脚本&#xff0c;…...

HDFS优化

单节点多块磁盘数据均衡 生成HDFS块均衡计划 hdfs diskbalancer -plan node1 执行均衡计划,node1.plan.json均衡计划文件 hdfs diskbalancer -execute node1.plan.json 查看当前均衡任务的执行情况 hdfs diskbalancer -query node1 取消均衡任务hdfs diskbalancer -cancel nod…...

行测-判断推理-图形推理-样式规律-黑白运算

黑白元素个数不同&#xff0c;优先考虑黑白运算白白白黑黑白黑白黑选A考试时&#xff0c;这种题不要先把规律全部推出来&#xff0c;再去做题&#xff0c;太慢了直接看要推的图&#xff0c;通过排除法选答案黑白元素个数不同&#xff0c;优先考虑黑白运算白白白黑黑白黑白黑选B…...

java+springboot+vue高校学生医疗保险管理系统

医保管理系统是对与职工健康息息相关的档案进行的系统化、自动化的管理&#xff0c;主要是对职工办理的医疗保险的管理&#xff0c;本系统能够很好的适应社会的需求&#xff0c;最大化的为城镇职工提供服务。医疗保险是国家社会保障体系的重要组成部分&#xff0c;也是社会保险…...

[已解决] AHK 映射 ESC 延迟 500 ms 的严重问题

问题描述 今天发现一个重大bug&#xff0c;我竟然用了一年多都不知道&#xff01; CapsLock::Esc 我的 ahk 脚本将 capslock 映射为 esc&#xff0c;但这在vim环境中&#xff0c;估算响应 500ms。 也就说按下 caps 键&#xff0c;还要等一会&#xff0c;才进入normal模式 如果…...

QML state详解

1.state简介 changes&#xff08;list<Change>&#xff09;&#xff1a;保存当前State下的多个Change对象,比如PropertyChanges、StateChangeScript、ParentChange等。 extend&#xff08;string&#xff09;&#xff1a;表示该状态要在哪个State的基础上进行扩展,当一个…...

一起Talk Android吧(第五百零六回:如何调整组件在约束布局中的角度)

文章目录背景介绍相关属性使用方法示例程序各位看官们大家好&#xff0c;上一回中咱们说的例子是"如何调整组件在约束布局中的大小",这一回中咱们说的例子是"如何调整组件在约束布局中的角度"。闲话休提&#xff0c;言归正转&#xff0c; 让我们一起Talk A…...

微信投票-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-5】 微信投票 【任务介绍】 1.任务描述 如今微信聊天已经普及到几乎每一个人&#xff0c;在聊天中&#xff0c;经常会有人需要帮忙在某个APP中投票。本案例要求编写一个模拟微信投票的程序&#xff0c;通过在控制台输入指令&#xff0c;实现添加候选人、查看当前投票…...

duboo+zookeeper分布式架构入门

分布式 dubbo Zookeeper 分布式系统就是若干独立计算机的集合&#xff08;并且这些计算机之间相互有关联&#xff0c;就像是一台计算机中的C盘F盘等&#xff09;&#xff0c;这些计算对于用户来说就是一个独立的系统。 zookeeper安装 下载地址&#xff1a;Index of /dist/z…...

黑盒测试用例设计方法-等价类划分法

目录 一、等价类的作用 二、等价类的分类 三、等价类的方法 四、等价类的原则 五、按照测试用例的完整性划分等价类 六、等价类步骤 七、案例 一、等价类的作用 为穷举测试设计测试点。 穷举&#xff1a;列出所有的可能情况&#xff0c;对其一一判断。 测试点&#x…...

4.OCR文本识别Connectionist Temporal Classification(CTC)算法

文章目录1.基础介绍2.Connectionist Temporal Classification(CTC)算法2.1 什么是Temporal Classification2.2 CTC问题描述2.2关于对齐2.3 前向后向算法2.4 推理时3.pytorch中的CTCLOSS参考资料欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f3…...

误删了Ubuntu/Linux的一些默认用户目录怎么办?

用户目录&#xff1a;指位于 $HOME 下的一系列常用目录&#xff0c;例如 Documents&#xff0c;Downloads&#xff0c;Music&#xff0c;还有 Desktop等。本文不是讲如何恢复原有目录及其重要文件&#xff0c;适用于仅恢复目录功能一&#xff1a;仅恢复个别目录如误删了Desktop…...

ArXiv简介以及论文提交

arXiv网站简介 arXiv是一个收集物理学、数学、计算机科学、生物学与数理经济学的论文预印本的网站。其中arXiv发音同“archive”&#xff0c;因为“X”代表希腊字母 &#xff0c;国际音标为[kai]。它于1991年8月14日成立&#xff0c;现由美国康奈尔大学维护。 ——维基百科 对…...

pytorch学习

目录如下&#xff1a; pytorch常用操作 pytorch 常用操作 pytorch 的 detach()函数 1. 什么是detach()函数 我们在将输出特征矩阵进行存储的时候&#xff0c;经常需要将torch.Tensor类型的数据转换成别的如numpy类型的数据&#xff0c;但是Tensor类型的数据是会自动计算梯度…...

【OC】块初识

Block简介 Blocks是C语言的扩充功能。可以用一句话来表示Blocks的扩充功能&#xff1a;带有自动变量的匿名函数。 匿名函数 所谓匿名函数就是不带有名称的函数。C语言的标准不允许存在这样的函数。例&#xff1a; int func(int count);它声明了名称为func的函数。下面的源代…...

3-2 创建一个至少有两个PV组成的大小为20G的名为testvg的VG

文章目录1. 在vmware添加多块20G的硬盘&#xff0c;并创建分区2. 创建一个至少有两个PV组成的大小为20G的名为testvg的VG&#xff0c;要求PE大小为16M&#xff0c;而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录3. 新建用户archlinux,要求其家目录为/users/archlinu…...

【密码学】 一篇文章讲透数字证书

【密码学】 一篇文章讲透数字证书 数字证书介绍 数字证书是一种用于认证网络通信中参与者身份和加密通信的证书&#xff0c;人们可以在网上用它来识别对方的身份。 我们在上一篇博客中介绍了数字签名的作用和原理&#xff0c;数字签名可以防止消息被否认。有了公钥算法和数字签…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...