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

2月24日作业

题目:

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

1.例如在串口输入led1on,开饭led1灯点亮

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

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

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

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

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

编程要求:

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,...........)

}

代码:

mix.h

#ifndef __MIX_H__                                                                      
#define __MIX_H__                                                                      #include "stm32mp1xx_rcc.h"                                                            
#include "stm32mp1xx_gpio.h"                                                           
#include "stm32mp1xx_uart.h"                                                           
#include "gpio.h"                                                                      
typedef struct                                                                         
{                                                                                      char* cmd_arr;                                                                     gpio_t* gpiox;                                                                     unsigned int pin;                                                                  gpio_status_t status;                                                              void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,gpio_status_t status);        
}cmd_t;                                                                                
void hal_mix_rcc();                                                                    
void hal_mix_gpio();                                                                   
void hal_mix_uart();                                                                   
void func();                                                                           
void hal_gpio_write(gpio_t* gpiox,unsigned int pin,gpio_status_t status);              
cmd_t* find_command(const char* str);                                                  
char *get_string();                                                                    
#endif                                                                                 

mix.c

#include "mix.h"extern void delay_ms(int ms);
cmd_t cmd_arr[6]=
{[0]={.cmd_arr="led1on",.gpiox=GPIOE,.pin=GPIO_PIN_10,.status=GPIO_SET_T,.gpio_write_pin=hal_gpio_write,},[1]={.cmd_arr="led1off",.gpiox=GPIOE,.pin=GPIO_PIN_10,.status=GPIO_RESET_T,.gpio_write_pin=hal_gpio_write,},[2]={.cmd_arr="led2on",.gpiox=GPIOF,.pin=GPIO_PIN_10,.status=GPIO_SET_T,.gpio_write_pin=hal_gpio_write,},[3]={.cmd_arr="led2off",.gpiox=GPIOF,.pin=GPIO_PIN_10,.status=GPIO_RESET_T,.gpio_write_pin=hal_gpio_write,},[4]={.cmd_arr="led3on",.gpiox=GPIOE,.pin=GPIO_PIN_8,.status=GPIO_SET_T,.gpio_write_pin=hal_gpio_write,},[5]={.cmd_arr="led3off",.gpiox=GPIOE,.pin=GPIO_PIN_8,.status=GPIO_RESET_T,.gpio_write_pin=hal_gpio_write,}
};void hal_mix_rcc()
{RCC->MP_AHB4ENSETR|=(0x1<<1);RCC->MP_AHB4ENSETR|=(0x1<<4);RCC->MP_AHB4ENSETR|=(0x1<<5);RCC->MP_AHB4ENSETR|=(0x1<<6);RCC->MP_APB1LPENSETR|=(0x1<<16);
}
void hal_mix_gpio()
{GPIOB->MODER&=(~(0x3<<4));GPIOB->MODER|=(0x2<<4);GPIOG->MODER&=(~(0x3<<22));GPIOG->MODER|=(0x2<<22);GPIOB->AFRL&=(~(0xf<<8));GPIOB->AFRL|=(0x8<<8);GPIOG->AFRH&=(~(0xf<<12));GPIOG->AFRH|=(0x6<<12);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));
}
void hal_led_on(int num)
{switch(num){case 1:GPIOE->ODR|=(0x1<<10);break;case 2:GPIOF->ODR|=(0x1<<10);break;case 3:GPIOE->ODR|=(0x1<<8);break;}
}
void hal_led_off(int num)
{switch(num)                   {                             case 1:                   GPIOE->ODR&=(~(0x1<<10));break;                case 2:                   GPIOF->ODR&=(~(0x1<<10));break;                case 3:                   GPIOE->ODR&=(~(0x1<<8)); break;                }                            
}
void hal_mix_uart()
{delay_ms(20);USART4->CR1&=(~(0x1<<0));USART4->CR1&=(~(0x1<<28));USART4->CR1&=(~(0x1<<12));USART4->CR1&=(~(0x1<<15));USART4->CR1&=(~(0x1<<10));USART4->CR2&=(~(0x3<<12));USART4->PRESC&=(~(0xf<<0));USART4->BRR=0x22B;USART4->CR1|=(0x1<<3);USART4->CR1|=(0x1<<2);USART4->CR1|=(0x1<<0);
}
void put_char(const char ch)
{while(!(USART4->ISR&(0x1<<7)));USART4->TDR=ch;while(!(USART4->ISR&(0x1<<6)));
}
void put_string(const char *string)
{int i=0;char ch;while(1){ch=string[i];put_char(ch);if(ch=='\0'){break;}i++;}
}
char get_char()
{char ch;while(!(USART4->ISR&(0x1<<5)));ch=USART4->RDR;    return ch;
}
char buffer[20];
char *get_string()
{for(int i=0;i<19;i++){buffer[i]=get_char();put_char(buffer[i]);if(buffer[i]=='\r'){put_char('\n');buffer[i]='\0';break;}}return buffer;    
}
int my_strcmp(const char *a,char *b)
{int i=0;int j=0;while(*(a+i)!='\0'&&*(b+j)!='\0'&&*(a+i)==*(b+j)){i++;j++;}return *(a+i)-*(b+j);
}
void buffer_clear()
{for(int i=0;i<20;i++){buffer[i]=0;}
}
void func()
{get_string();if(my_strcmp(buffer,"led1on")==0){hal_led_on(1);}else if(my_strcmp(buffer,"led1off")==0){hal_led_off(1);}else if(my_strcmp(buffer,"led2on")==0){hal_led_on(2);}else if(my_strcmp(buffer,"led2off")==0){hal_led_off(2);}else if(my_strcmp(buffer,"led3on")==0){hal_led_on(3);}else if(my_strcmp(buffer,"led3off")==0){hal_led_off(3);}
}
void hal_gpio_write(gpio_t* gpiox,unsigned int pin,gpio_status_t status)
{if(status==GPIO_SET_T){gpiox->ODR|=(0x1<<pin);}else{gpiox->ODR&=(~(0x1<<pin));}
}
cmd_t* find_command(const char* str)
{//串口中输入的字符串,与结构体中每个元素中的cmd_arr变量进行比较//遍历比较,自己编写strcmp比较的函数 for(int i=0;i<6;i++){if(my_strcmp(str,cmd_arr[i].cmd_arr)==0){return &cmd_arr[i];}}return 0;//失败返回0                   
}

main.c

 #include "mix.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(){hal_mix_rcc();                                           hal_mix_gpio();                              hal_mix_uart();                              cmd_t* cmd_arr1;while(1){char* string = get_string();cmd_arr1 = find_command(string);if(cmd_arr1 == 0){                                   printf("find warning\n");                       }else{cmd_arr1->gpio_write_pin(cmd_arr1->gpiox,\cmd_arr1->pin,\cmd_arr1->status);    }}return 0;}

运行结果:

相关文章:

2月24日作业

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

SpringBoot可以同时处理多少请求?

本文已收录至我的Github仓库DayDayUP&#xff1a;github.com/RobodLee/DayDayUP&#xff0c;欢迎Star ⭐⭐⭐⭐⭐转载请注明出处&#xff1a;https://blog.csdn.net/weixin_43461520/article/details/129207427 前言 前两天面试的时候&#xff0c;面试官问我&#xff1a;一个i…...

代码随想录【Day23】| 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接 题目描述&#xff1a; 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新…...

Wsl2 ubuntu 配置git 阿里云codeup

目录 创建一个跟你windows git使用相同的用户名,特别重要 配置git 用户名和邮箱 配置阿里云codeup 拉取仓库提示文件权限问题 给用户目录权限 配置项目文件别名 key_load_public: invalid format 怎么办&#xff1f; WSL ubuntu sshd: no hostkeys available -- exiting…...

展会邀约 | 昂视与您相约BTF第12届上海锂电展

BTF第12届上海国际新能源锂电展将于3月7日在上海新国际博览中心举办。此次展会以“锂想动力&#xff0c;共创未来”为主题&#xff0c;汇聚行业内一众翘楚企业与专业观众&#xff0c;为各位展商以及观众提供专业的锂电交流平台&#xff0c;了解与碰撞新产品、新技术与解决方案&…...

RK3568平台开发系列讲解(驱动基础篇)中断子系统框架

🚀返回专栏总目录 文章目录 一、中断硬件的组成二、软件框架三、中断常见概念沉淀、分享、成长,让自己和他人都能有所收获!😄 📢中断是指 CPU 正常运行期间,由于内外部事件或程序预先安排的事件,引起的 CPU 暂时停止正在运行的程序, 转而为该内部或外部预先安排的事…...

消费复苏迎“春”暖,服装行业如何开启“狂飙”模式?

2023年开年前2个月&#xff0c;全国多地消费市场的“热度”一直在持续上涨&#xff0c;商场、餐馆、娱乐场所等消费市场人气旺盛&#xff0c;消费复苏的“暖”意十足&#xff0c;一幕幕“忙”起来、“热”起来的场景&#xff0c;让各行各业的商家都对未来充满了期待与信心。在消…...

Springboot 整合Flowable工作流框架搭建

我们在开发自动化办公软件时经常会遇到各种审批流程功能&#xff0c;这个使用就需要使用到工作流引擎。目前主流的工作流引擎有Activiti、Flowable、camunda&#xff0c;其中Flowable是在Activiti的基础上开发出来的&#xff0c;基于BPMN2.0协议&#xff0c;它包括 BPMN&#x…...

ASE0510SH-ASEMI的MOS管ASE0510SH

编辑-Z ASE0510SH在SOT-89封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为140mΩ&#xff0c;是一款N沟道中低压MOS管。ASE0510SH的最大脉冲正向电流ISM为15A&#xff0c;零栅极电压漏极电流(IDSS)为1uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。ASE0510…...

Golang学习Day2

Go语言中的函数go语言中函数特性go语言有三种函数&#xff1a;普通函数、匿名函数&#xff08;没有名称的函数&#xff09;方法&#xff08;定义在struct上的函数&#xff09;。receivergo语言中不运算函数重载&#xff08;overload&#xff09;&#xff0c;也就是说不允许函数…...

Android 中malloc_debug 原理详解

版本基于&#xff1a;Android R 0. 前言 最近上项目中遇到一个native 可能内存泄漏的问题&#xff0c;曾考虑使用HWASAN&#xff0c;但这个工具是针对整个系统&#xff0c;运行代价还是很高的。而笔者遇到的问题大致有所方向&#xff0c;能指定到某一个进程&#xff0c;针对单…...

D. Triangle Coloring【组合数学,乘法逆元】

链接 分析 题目要求我们去求出最优的染色的方法数。首先什么时候是最优的&#xff0c;这里只有两种颜色&#xff0c;不可能取到三条边&#xff0c;即蓝色为B&#xff0c;红色为R&#xff0c;有BBB,RRR,BBR,RRB四种组合&#xff0c;显然最多的就是取两条边&#xff0c;我们想取到…...

【读论文】AttentionFGAN

【读论文】AttentionFGAN介绍网络架构提取红外图像目标信息的网络辨别器损失函数生成器损失函数辨别器损失函数总结参考论文&#xff1a; https://ieeexplore.ieee.org/document/9103116/如有侵权请联系博主介绍 好久没有读过使用GAN来实现图像融合的论文了&#xff0c;正好看…...

ClickHouse 配置文件使用说明

本文主要介绍 ClickHouse 的配置文件。在 ClickHouse 中配置主要分为两类&#xff0c;一类是负责 server 端配置的&#xff0c;另一类是负责用户端配置的。负责 server 端配置的一般会放在 config.xml 文件中&#xff0c;负责用户端配置的一般会放在 users.xml 文件中。当然如果…...

如果不是互联网人,谁会找到这些神器?

一、上线啦 你肯定该问了&#xff0c;这个是什么鬼东西。它本来是一个创建自己网站的网站。 现在使用它可以创建自己的小程序&#xff0c;又不是有点小厉害了。 而且功能强大&#xff0c;还支持微信支付&#xff0c;分销&#xff0c;优惠券&#xff0c;营销等多种功能。 还有多…...

Neo4j优化

使用参数 查询参数 :params设置参数 :param actorName: Tom Hanks参数的冒号后要用空格使用参数用 $ MATCH (p:Person)-[:ACTED_IN]->(m:Movie) WHERE p.name $actorName RETURN m.released AS releaseDate,m.title AS title ORDER BY m.released DESC多个参数 MATCH (p:Pe…...

CF1692G 2^Sort 题解

CF1692G 2^Sort 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码实现题目 链接 https://www.luogu.com.cn/problem/CF1692G 字面描述 题面翻译 给你一个长度为 n(∑n<2⋅105)n \ (\sum n < 2\cdot 10^5)n (∑n<…...

关于物理像素,逻辑像素,像素比

关于物理像素、逻辑像素&#xff08;css像素&#xff09;、分辨率、像素比的超详细讲解 在日常生活中&#xff0c;有这样一个问题。同样的图片为什么在不同的设备上显示的大小是不一样的。&#x1f912;带着这个问题来说明一下。 一、物理像素 设备刚生产出来就已经固定了&a…...

JavaSE基础部分总结

JavaSe基础部分 文章目录JavaSe基础部分1.命名规范2.基本的数据类型3.方法3.1方法的基本格式3.2 方法的分类3.3 方法的注释4.数组4.1 数组的命名格式4.2 数组中存在的址交换的操作4.3数组Arrays常用的方法1. Arrays.asList(数组作为参数或者数据作为参数)&#xff1a;2.Arrays.…...

C++基础知识

目录类和对象C static_cast、dynamic_cast、const_cast和reinterpret_cast1、为什么要引入这四种类型转化&#xff1f;2、应用场景。C/C类型转换的本质struct和class的区别为什么会诞生面向对象的编程思想析构函数的执行时机初始化 const 成员变量C const对象&#xff08;常对象…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...