作业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);
#endifled.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核,串口输入相应的命令,控制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 定义 图是一种非线性的数据结构,表示多对多的关系。 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E)…...
 
Linux基础命令和工具使用详解
Linux基础命令和工具使用详解一、grep搜索字符二、find查找文件三、ls 显示文件四、wc命令计算字数五、uptime机器启动时间负载六、ulimit用户资源七、curl http八、scp远程拷贝九、dos2unix和unix2dos十、sed 行处理10.1、简单模式10.2、替换模式十一、awk 列处理11.1、打印某…...
 
一个好的python文件可以有几种用途?
大家好鸭!我是小熊猫~ 这次来带大家浅浅回顾一点python小知识~ 源码资料电子书:点击此处跳转文末名片获取 python文件总共有两种用途: 一种是执行文件另一种是被当做模块导入 编写好的一个python文件可以有两种用途: 1. 脚本,…...
 
HDFS优化
单节点多块磁盘数据均衡 生成HDFS块均衡计划 hdfs diskbalancer -plan node1 执行均衡计划,node1.plan.json均衡计划文件 hdfs diskbalancer -execute node1.plan.json 查看当前均衡任务的执行情况 hdfs diskbalancer -query node1 取消均衡任务hdfs diskbalancer -cancel nod…...
 
行测-判断推理-图形推理-样式规律-黑白运算
黑白元素个数不同,优先考虑黑白运算白白白黑黑白黑白黑选A考试时,这种题不要先把规律全部推出来,再去做题,太慢了直接看要推的图,通过排除法选答案黑白元素个数不同,优先考虑黑白运算白白白黑黑白黑白黑选B…...
 
java+springboot+vue高校学生医疗保险管理系统
医保管理系统是对与职工健康息息相关的档案进行的系统化、自动化的管理,主要是对职工办理的医疗保险的管理,本系统能够很好的适应社会的需求,最大化的为城镇职工提供服务。医疗保险是国家社会保障体系的重要组成部分,也是社会保险…...
[已解决] AHK 映射 ESC 延迟 500 ms 的严重问题
问题描述 今天发现一个重大bug,我竟然用了一年多都不知道! CapsLock::Esc 我的 ahk 脚本将 capslock 映射为 esc,但这在vim环境中,估算响应 500ms。 也就说按下 caps 键,还要等一会,才进入normal模式 如果…...
QML state详解
1.state简介 changes(list<Change>):保存当前State下的多个Change对象,比如PropertyChanges、StateChangeScript、ParentChange等。 extend(string):表示该状态要在哪个State的基础上进行扩展,当一个…...
 
一起Talk Android吧(第五百零六回:如何调整组件在约束布局中的角度)
文章目录背景介绍相关属性使用方法示例程序各位看官们大家好,上一回中咱们说的例子是"如何调整组件在约束布局中的大小",这一回中咱们说的例子是"如何调整组件在约束布局中的角度"。闲话休提,言归正转, 让我们一起Talk A…...
 
微信投票-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)
【实验7-5】 微信投票 【任务介绍】 1.任务描述 如今微信聊天已经普及到几乎每一个人,在聊天中,经常会有人需要帮忙在某个APP中投票。本案例要求编写一个模拟微信投票的程序,通过在控制台输入指令,实现添加候选人、查看当前投票…...
 
duboo+zookeeper分布式架构入门
分布式 dubbo Zookeeper 分布式系统就是若干独立计算机的集合(并且这些计算机之间相互有关联,就像是一台计算机中的C盘F盘等),这些计算对于用户来说就是一个独立的系统。 zookeeper安装 下载地址:Index of /dist/z…...
 
黑盒测试用例设计方法-等价类划分法
目录 一、等价类的作用 二、等价类的分类 三、等价类的方法 四、等价类的原则 五、按照测试用例的完整性划分等价类 六、等价类步骤 七、案例 一、等价类的作用 为穷举测试设计测试点。 穷举:列出所有的可能情况,对其一一判断。 测试点&#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参考资料欢迎访问个人网络日志🌹🌹知行空间🌹dz…...
误删了Ubuntu/Linux的一些默认用户目录怎么办?
用户目录:指位于 $HOME 下的一系列常用目录,例如 Documents,Downloads,Music,还有 Desktop等。本文不是讲如何恢复原有目录及其重要文件,适用于仅恢复目录功能一:仅恢复个别目录如误删了Desktop…...
 
ArXiv简介以及论文提交
arXiv网站简介 arXiv是一个收集物理学、数学、计算机科学、生物学与数理经济学的论文预印本的网站。其中arXiv发音同“archive”,因为“X”代表希腊字母 ,国际音标为[kai]。它于1991年8月14日成立,现由美国康奈尔大学维护。 ——维基百科 对…...
pytorch学习
目录如下: pytorch常用操作 pytorch 常用操作 pytorch 的 detach()函数 1. 什么是detach()函数 我们在将输出特征矩阵进行存储的时候,经常需要将torch.Tensor类型的数据转换成别的如numpy类型的数据,但是Tensor类型的数据是会自动计算梯度…...
 
【OC】块初识
Block简介 Blocks是C语言的扩充功能。可以用一句话来表示Blocks的扩充功能:带有自动变量的匿名函数。 匿名函数 所谓匿名函数就是不带有名称的函数。C语言的标准不允许存在这样的函数。例: int func(int count);它声明了名称为func的函数。下面的源代…...
 
3-2 创建一个至少有两个PV组成的大小为20G的名为testvg的VG
文章目录1. 在vmware添加多块20G的硬盘,并创建分区2. 创建一个至少有两个PV组成的大小为20G的名为testvg的VG,要求PE大小为16M,而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录3. 新建用户archlinux,要求其家目录为/users/archlinu…...
 
【密码学】 一篇文章讲透数字证书
【密码学】 一篇文章讲透数字证书 数字证书介绍 数字证书是一种用于认证网络通信中参与者身份和加密通信的证书,人们可以在网上用它来识别对方的身份。 我们在上一篇博客中介绍了数字签名的作用和原理,数字签名可以防止消息被否认。有了公钥算法和数字签…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
 
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
 
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
 
【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应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
 
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
