物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(11)
文章目录
- 可变参数的使用技巧
- 第三阶段-初级实验
- Lesson5:不一样的点灯实验---学习I/O的输出
 
- ☆点灯的电路图分析
- 1 一起看看点灯的电路图
- Tip1:另一种点灯的电路
- Tip1:如何访问外设的寄存器
- 2 STM32F407中操作GPIO的方法
 
- 通过直接操作寄存器实现点灯实验
- Tip1:硬件编程的基本流程
 
- 2代码实现及分析
可变参数的使用技巧
void fixed_args_func(int a, double b, char c)
{printf("a = 0x%p\n", &a);printf("b = 0x%p\n", &b);printf("c = 0x%p\n", &c);
if(&a==MCULowPower)
}
void var_args_func(const char * fmt, ...)
{... ...
}
void var_args_func(const char * fmt, ...)
{char    *ap;ap = ((char*)&fmt) + sizeof(fmt);printf("%d\n", *(int*)ap);ap =  ap + sizeof(int);printf("%d\n", *(int*)ap);ap =  ap + sizeof(int);printf("%s\n", *((char**)ap));
}
第三阶段-初级实验
Lesson5:不一样的点灯实验—学习I/O的输出
1: 理论基础 CPU工作机制 如何对CPU编程
 外设的的原理
 2:代码实现以及分析
 3:在板实验和调试
 嵌入式开发必知会之三—
 了解LED☆点灯的电路图分析区
 STM32F407中GPIO的特性及操作方法
 1.LED的功能,特点和用途
 
发光二极管
 
2.LED的工作原理
课后作业:请同学们课后了解电阻,电容和电感的功能,特点,用途及电路符号表示
☆点灯的电路图分析
1 一起看看点灯的电路图

 
 
Tip1:另一种点灯的电路
1 STM32F407中GPIO的特性
 Tip1:如何访问外设的寄存器
2 STM32F407中操作GPIO的方法
-  输出的配置 
-  高低电平的配告 
-  手册描述 
 通用IO (GPIO)
 除非特别说明,否则本部分适用于整个STM32F4xx系列。-  7.1 GPIO简介 
 每个通用IO端口包括4个32位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和 GPIOx_PUPDR)、2个32位数据寄存器(GPIOx_IDR和
 GPIOx_ODR)、1个 32位置位/复位寄存器(GPIOx_BSRR)、1个32位锁定寄存器(GPIOx_LCKR)和2个32位复用功能选择寄存器(GPIOx_AFRH 和GPIOx_AFRL)。
-  7.2 GPIO主要特性受控IO多达16个 
 输出状态:推挽或开漏+上拉/下拉
 从输出数据寄存器(GPIOx_ODR)或外设(复用功能输出)输出数据可为每个IO选择不同的速度
 输入状态:浮空、上拉/下拉、模拟
 将数据输入到输入数据寄存器(GPIOx_IDR)或外设(复用功能输入)置位和复位寄存器(GPIOx_BSRR),对GPIOx_ODR具有按位写权限锁定机制(GPIOx_LCKR),可冻结IO配置
 模拟功能
 复用功能输入/输出选择寄存器(一个IO最多可具有16个复用功能>快速翻转,每次翻转最快只需要两个时钟周期
 引脚复用非常灵活,允许将IO引脚用作GPIO或多种外设功能中的一种
-  7.3 GPIO功能描述 
 根据数据手册中列出的每个lO端口的特性,可通过软件将通用IVO(GPIO)端口的各个端口位分别配置为多种模式;
 输入浮空
 输入上拉
 输入下拉模拟功能
 具有上拉或下拉功能的开漏输出具有上拉或下拉功能的推挽输出具有上拉或下拉功能的复用功能推挽具有上拉或下拉功能的复用功能开漏
 每个IO端口位均可自由编程,但IO端口寄存器必须按32位字、半字或字节进行访问。GPIOx_BSRR寄存器旨在实现对GPIO ODR寄存器进行原子读取/修改访问。这样便可确保在读取和修改访问之间发生中断请求也不会有问题。
  
-  8.3.10 Output配置 
    
 当lO口编程为输出时:。输出缓冲区被启用:
  
 -漏极模式:输出寄存器中的“O”激活N-MOS,而“1”激活N-MOS 
 在输出寄存器中离开Hi-Z端口(P-MOS从未激活)
 推挽模式:输出寄存器中的“O”激活N-MOS,而输出寄存器中的“1”激活P-MoS
 施密特触发器输入被激活
 弱上拉和下拉电阻是否激活取决于GPIOx_PUPDR寄存器中的值
 l/O引脚上的数据在每个AHB1时钟周期中被采样到输入数据寄存器中
 对输入数据寄存器的读访问获得I/O状态。
 对输出数据寄存器的区域访问获得最后写入的值。
 图29显示了IO端口位的输出配置。
 原文:
 8.3.10 Output configuration
 When the I/O port is programmed as output:
 • The output buffer is enabled:
 – Open drain mode: A “0” in the Output register activates the N-MOS whereas a “1”
 in the Output register leaves the port in Hi-Z (the P-MOS is never activated)
 – Push-pull mode: A “0” in the Output register activates the N-MOS whereas a “1” in
 the Output register activates the P-MOS
 • The Schmitt trigger input is activated
 • The weak pull-up and pull-down resistors are activated or not depending on the value
 in the GPIOx_PUPDR register
 • The data present on the I/O pin are sampled into the input data register every AHB1
 clock cycle
 • A read access to the input data register gets the I/O state
 • A read access to the output data register gets the last written value
 Figure 29 shows the output configuration of the I/O port bit.
-  
Tip1:如何访问外设的寄存器

 
 
2 STM32F407中操作GPIO的方法
- 输出的配置
- 高低电平的配置
通过直接操作寄存器实现点灯实验
- 实验的需求分析(实验目的) - 学会基本的硬件操作—I/O的输出高低电平
- 操作学习利用系统时钟实现较为精确的延时
- 学习规范的模块化编程
- 学会使用CMSIS的支持库
 
- 通过直接操作寄存器实现点灯代码
- 代码下载及调试演示
 1程序流程分析-  如何利用系统时钟实现较为精确的延时 
 9.5SysTick 定时器
 9.5.1 为什么要有SysTick 定时器
 Cortex-M处理器内集成了一个小型的名为SysTick(系统节拍)的定时器,它属于NVIC的一部分,且可以产生SysTick 异常(异常类型#15)。SysTick 为简单的向下计数的24位计数器,可以使用处理器时钟或外部参考时钟(通常是片上时钟源)。
 在现代操作系统中,需要一个周期性的中断来定期触发OS内核,如用于任务管理和上下文切换,处理器也可以在不同时间片内处理不同任务。处理器设计还需要确保运行在非特权等级的应用任务无法禁止该定时器,否则任务可能会禁止SysTick 定时器并锁定整个系统。
 之所以在处理器内增加一个定时器,是为了提高软件的可移植性。由于所有的Cortex-M处理器都具有相同的SysTick定时器,为一种Cortex-M3/M4微控制器实现的OS也能适用于其他的Cortex-M3/M4微控制器。
 若应用中不需要使用OS,SysTick定时器可用作简单的定时器外设﹐用以产生周期性中断、延时或时间测量。
 9.5.2SysTick定时器操作 
 如表9.6所示,SysTick定时器中存在4个寄存器。CMSIS-Core头文件中定义了一个名为SysTick的结构体,方便对这些寄存器的访问。
  
  
  SysTick内部包含一个24位向下计数器,如图9.15所示。它会根据处理器时钟或一个参考时钟信号(在ARM Cortex-M3或Cortex-M4 技术参考手册中也被称作STCLK)来减小计数。参考时钟信号取决于微控制器的实际设计,有些情况下﹐它可能会不存在。由于要检测上升沿,参考时钟至少得比处理器时钟慢两倍。 
 在设置控制和状态寄存器的第О位使能该计数器后,当前值寄存器在每个处理器时钟周期或参考时钟的上升沿都会减小。若计数减至0,它会从重加载寄存器中加载数值并继续运行。
 另外一个寄存器为SysTick校准值寄存器。它为软件提供了校准信息。由于CMSIS-Core提供了一个名为SystemCoreClock 的软件变量(CMSIS 1.2 及之后版本可用,CMSIS 1.1或之前版本则使用变量SystemFrequency) ,因此它就未使用SysTick校准值寄存器。系统初始
 化函数SystemInit()函数设置了该变量,而且每次系统时钟配置改变时都要对其进行更新。这种软件手段比利用SysTick校准值寄存器的硬件方式更灵活。
 SysTick寄存器的细节如表9.7~表9.10所示。
 9.5.3使用 SysTick定时器
 若只想产生周期性的SysTick中断,最简单的方法就是使用CMSIS-Core函数 SysTick_Config :
 uint32_t SysTick_Conf ig(uint32_t ticks) ;
 该函数将SysTick 中断间隔设置为ticks,使能计数器使用处理器时钟,然后设置SysTick异常为最低优先级。
 例如,若要在30MHz的时钟频率下产生1kHz的SysTick异常,则可以使用:SysTick_Config(SystemCoreClock / 1000) ;
 变量SystemCoreClock应该存放正确的时钟频率数值,也就是30×10°。另外,只需使用:
 SysTick_Config( 30000) ;
 //30MHz / 1000 = 30000
 SysTick_Handler( void)的触发频率就变成了1kHz。
 若SysTick_Config 函数的输入参数不满足24位重加载数值寄存器(大于0xFFFFFF),SysTick_Config函数返回1,否则会返回0。
 许多情况下,可能会使用参考时钟或者不想使能SysTick 中断,那么就不要使用SysTick_Config 函数。此时需要直接操作 SysTick寄存器,推荐使用下面的流程:
 (1)将0写人 SysTick->CTRL禁止 SysTick定时器。这个操作是可选的。若重用了其他代码,则由于SysTick之前可能已经使能过了,因此本操作是推荐使用的。
 (2)将新的重加载值写入SysTick->LOAD,重加载值应该为周期数减1。
 (3)将任何数值写人SysTick当前值寄存器SysTick->VAL,该寄存器会被清零
 (4)写入 SysTick控制和状态寄存器SysTick->CTRL启动SysTick定时器。
 由于SysTick定时器向下计数到0,因此,若要设置SysTick周期为1000,则应该将重加载值(SysTick->LOAD)设置为999。
 若要在轮询模式中使用SysTick定时器,则可以利用SysTick 控制和状态寄存器(SysTick->CTRL)中的计数标志来确定定时器何时变为0。例如,可以将SysTick定时器设置为特定数值,然后等它变为0,并以此实现延时:
 SysTick-> CTRL = 0;
 /禁止SysTick
 SysTick - > LOAD = OxFF;
 //计数范围255~0 (256个周期)
 SysTick-> VAL = 0 ;
 //清除当前值和计数标志
 SysTick- > CTRL = 5;
 //使能SysTick定时器并使用处理器时钟 5的二进制是0101
 while ( (SysTick - >CTRL & Ox00010000) == 0);//等待计数标志置位
 SysTick - > CTRL= 0 ;
 /!禁止 SysTick
 若要将SysTick中断用作在一定时间后触发的单发操作,则可以将重加载值减小12个周期,以补偿中断等待时间。例如,要使SysTick定时器在300个时钟周期后执行:
 volatile int SysTickFired;
 1/全局软件标志,表示 SysTickAlarm已执行
 …
 SysTick-> CTRL= 0 ;
 /禁止 SysTick
 SysTick -> LOAD = (300-12);
 //设置重加载值,由于异常等待减去12
 SysTick - > VAL=0;
 //将当前值清为0
 SysTickFired = 0;
 //将软件标志设为0
 SysTick - > CTRL= 0x7;
 1/使能SysTick,使能 SysTick异常且使用处理器时钟 0x7=0111
 while (SysTickFired == 0 );
 1/等待SysTick处理将软件标志置位
 在单发SysTick处理中﹐需要禁止SysTick,以防SysTick 异常再次产生。若由于所需的处理任务花费的时间太长而导致挂起状态再次置位﹐则可能还需要清除SysTick 的挂起状态:
 void SysTick_Handler(void)
 // SYSTICK异常处理
 {
 SysTick ->CTRL = Ox0 ;
 /1禁止SysTick
 …;
 //执行所需任务
 SCB->ICSR | = 1 <<25;
 //清除SYSTICK挂起位,防止再次挂起
 sysTickFired++ ;
 //更新软件标志,主程序据此可以知道SysTick
 定时任
 务已执行
 return;
 若同时产生了另一个异常,则 SysTick异常可能会延迟。
 SysTick 定时器可用于时间测量。例如,可以用下面的代码测量一个短函数的持续时间:
 unsigned int start_time,stop_time,cycle_count;
 SysTick - > CTRL= 0 ;
 /I/禁止SysTick
 SysTick - > LOAD =0xFFFFFFFF;
 //将重加载值设置为最大
 SysTick -> VAL= 0 ;
 //将当前值清为0
 SysTick ->CTRL= 0x5;
 /1使能SysTick,使用处理器时钟
 while(SysTick- > VAL != 0);
 //等待SysTick重加载
 start_time = SysTick - > VAL;
 //获取开始时间
 function();
 //执行要测量的函数
 stop_time =SysTick- > VAL;
 1/获取停止时间
 由于SysTick定时器向下计数, start_time的数值比 stop_time要大。可能还需要在时间
 测量的结尾检查一下count_flag。若count_tlag 置位时测则风的NE大了 A旧 t六敝还要能SysTick异常且在SysTick处理中计算SyslicK T效奋恤出的认效。nW川心欢u一考虑SysTick 异常。
 SysTick定时器还提供了一个校准值寄存器。若该信息存在,则SysTick->CALIB寄存
 器的最低24位表示要得到10ms SysTick间隔所需的重加载值。个过,计多似丘润’P开仅有这个信息,TENMS位域读出为0。CMSIS-Core方案则提供」一个表水频平信忌的队什受量,这种方式更加灵活且得到了多数微控制器供应商的支持。
 可以利用 SysTick校准值寄存器的第31位确定参考时钟是否存在。9.5.4其他考虑
 在使用SysTick定时器时需要考虑以下几点:
 . SysTick定时器中的寄存器只能在特权状态下访问。·参考时钟在一些微控制器设计中可能会不存在。
 ·若应用中存在嵌入式OS,SysTick定时器会被OS使用,因此就不能冉放应用在方使用了。
 ·当处理器在调试期间暂停时,SysTick定时器会停止计数。
 ·根据微控制器的实际设计,SysTick定时器可能会在某些休眠模式中停止计数。
 
-  
/初始化延迟函数
//当使用uoo=的时候,此函数会初始化uco=的时钟节拍7/SYSTICK的时钟固定为AHB时钟的1/8
//sYSCLK:系统时钟频率
void delay_init (u8 sYSCLK)
{
SysTick->CTRL&=~(1<<2);//SYSTICR使用外部时钟源 只操作了第2位
fac_us=SYSCLK/8;//每个us需要的systick时钟数
fac_ms= (u16) fac_us*1000;//每个ns需要的systick时钟数
}
- 如何初始化I/O
Tip1:硬件编程的基本流程
1、初始化硬件:总线始终初始化,申请区域存放寄存器,配置IO的输出形式,设置IOspeed,是否需要AF(第2功能)
2代码实现及分析
#include "sys tick.h"
#include "led.h"#define SYS_MAX_CLK 168int main(void)
{Led_init();//初始化LED0delay_init(SYS_MAX_CLK);//初始化系统时钟while(1){LED0_ON;//点亮LED0delay_ms(1000);//延时1sLED0_OFF;//关闭leddelay_ms(1000);//延时1s}
}

 
 
相关文章:
 
物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(11)
文章目录 可变参数的使用技巧第三阶段-初级实验Lesson5:不一样的点灯实验---学习I/O的输出 ☆点灯的电路图分析1 一起看看点灯的电路图Tip1:另一种点灯的电路Tip1:如何访问外设的寄存器2 STM32F407中操作GPIO的方法 通过直接操作寄存器实现点灯实验Tip1:硬件编程的基本流程 2代…...
 
30. 利用linprog 解决 生产决策问题(matlab程序)
1.简述 线线规划的几个基本性质:【文献[1]第46页】 (1)线性规划问题的可行域如果非空,则是一个凸集-凸多面体; (2)如果线性规划问题有最优解,那么最优解可在可行域的顶点中确定; (3)如果可行域有界,且可行域…...
 
一百三十九、Kettle——Linux安装Kettle8.2
一、目的 为了方便海豚调度kettle任务,在Linux上安装kettle 二、kettle版本与前提 版本:kettle8.2 pdi-ce-8.2.0.0-342 前提:Linux已经安装好jdk 三、安装步骤 (一)打开安装包所在地 [roothurys22 ~]# cd …...
react路由在layout中的监听
业务中需要在layout里来监听路由的变化,但是layout并不是一个路由组件,所以layout组件内的props并没有location,history等属性,(路由组件:由Route组件处理的才是路由组件)所以我们需要将layout组件转变成路…...
 
Java反射(三)
目录 1.反射与代理设计模式 2.反射与Annotation 3.自定义Annotation 4.Annotation整合工厂设计模式和代理设计模式 1.反射与代理设计模式 代理模式是指通过业务真实类实现业务接口,再通过设置代理类创建业务真实类子类从而间接访问业务真实类。但是这存在一个弊…...
ansible-playbook roles编写lnmp剧本
目录 集中式编写lnmp剧本 执行 分布式编写lnmp剧本 一定要设置ssh免交互 nginx mysql php 执行 集中式编写lnmp剧本 vim /etc/ansible/lnmp.yml - name: lnmp playhosts: dbserversremote_user: roottasks:- name: perpare condifurecopy: src/etc/yum.repos.d/nginx.r…...
相机可用性变化监听AvailabilityCallback流程分析
相机可用性变化监听及流程分析 一、接口说明  相机可用性变化监听可以通过CameraManager中的接口registerAvailabilityCallback()来设置回调,接口如下: /** *注册一个回调以获得有关相机设备可用性的通知。 * *<p>再次注册相同的回调将用提供…...
使用Python多线程实现生产者消费者模型
“Talk is cheap, show me the code.” 废话不多说,直接上代码: """ 生产者消费者模型 Python实现 """ import queue import threading import random import timeclass ConsProd:# 队列参数_que None # 队列# 生产者…...
 
Notepad++工具通过正则表达式批量替换内容
1.每行末尾新增特定字符串 CtrlH弹出小窗口;查找目标输入$,替换为输入特定字符串;选中循环查找,查找模式选正则表达式;最后点击全部替换 2.每行行首新增特定字符串 CtrlH弹出小窗口;查找目标输入^&…...
从零构建深度学习推理框架-3 手写算子relu
Relu介绍: relu是一个非线性激活函数,可以避免梯度消失,过拟合等情况。我们一般将thresh设为0。 operator类: #ifndef KUIPER_COURSE_INCLUDE_OPS_OP_HPP_ #define KUIPER_COURSE_INCLUDE_OPS_OP_HPP_ namespace kuiper_infer {…...
 
想做上位机,学C#还是QT?
学习C#还是Qt,取决于你的具体需求和偏好。 如果你计划开发跨平台的桌面应用程序,并且希望使用一种更轻量级、直观的界面框架,那么Qt可能是一个不错的选择。Qt是一个功能丰富且成熟的跨平台框架,支持多种开发语言(包括…...
 
Ansible —— playbook 剧本
Ansible —— playbook 剧本 一、playbook的概述1.playbook简介2.什么是Ansible playbook剧本?3.Ansible playbook剧本的特点4.如何使用Ansible playbook剧本?5.playbooks 本身由以下各部分组成 二、playbook示例1.运行playbook2.定义、引用变量3.指定远…...
ARM寻址方式
寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找操作数地址的方式,ARM中有以下8种基本的寻址方式。 1、寄存器寻址 将寄存器中的值作为操作数,指令中的地址码字段是寄存器编号。 MOV R1,R2 ;R1 R2 ADD R0,R1,R2 ;R0 R1 R22、立即寻…...
 
【JAVA】String ,StringBuffer 和 StringBuilder 三者有何联系?
个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言StringBufferStringBuffer方法 StringBuilderStringBuilder方法 String ,StringBuffer 和 StringBuilder的区别String和StringBuffer互相转换 前言 在之前的文章…...
关于计数以及Index返回订单号升级版(控制字符长度,控制年月标记)
数据库表操作: EXEC sys.sp_dropextendedproperty nameNName , level0typeNSCHEMA,level0nameNdbo, level1typeNTABLE,level1nameNSetNoIndexGOEXEC sys.sp_dropextendedproperty nameNMS_Description , level0typeNSCHEMA,level0nameNdbo, level1typeNTABLE,level…...
 
【计算机网络】11、网桥(bridge)、集线器(hub)、交换机(switch)、路由器(router)、网关(gateway)
文章目录 一、网桥(bridge)二、集线器(hub)三、交换机(switch)四、路由器(router)五、网关(gateway) 对于hub,一个包过来后,直接将包转发到其他口。 对于桥&…...
第九篇-自我任务数据准备
格式化自我意识数据用于ChatGLM微调 准备数据源 https://github.com/hiyouga/ChatGLM-Efficient-Tuning cd data self_cognition.json代码self_process.py #!/usr/bin/python # -*- coding: UTF-8 -*- # 读取self_cognition自我认知解析并写入转换新文件import json# 读取se…...
 
2023.8.1号论文阅读
文章目录 MCPA: Multi-scale Cross Perceptron Attention Network for 2D Medical Image Segmentation摘要本文方法实验结果 SwinMM: Masked Multi-view with SwinTransformers for 3D Medical Image Segmentation摘要本文方法实验结果 MCPA: Multi-scale Cross Perceptron Att…...
webpack优化前端框架性能
webpack优化目的 webpack优化目的1. 提升开发体验提升开发体验使用 SourceMap 2. 提升打包构建速度提升打包构建速度(开发模式)提升打包速度 oneOf提升打包速度 include(包含)/exclude(排除)提升第二次打包…...
Unity UGUI的Outline(描边)组件的介绍及使用
Unity UGUI的Outline(描边)组件的介绍及使用 1. 什么是Outline(描边)组件? Outline(描边)组件是Unity UGUI中的一种特效组件,用于给UI元素添加描边效果。通过设置描边的颜色、宽度和模糊程度,可以使UI元素在视觉上更加突出。 2. Outline(描…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
 
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
 
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
 
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
 
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
 
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
 
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
如何在Spring Boot中使用注解动态切换实现
还在用冗长的if-else或switch语句管理多个服务实现? 相信不少Spring Boot开发者都遇到过这样的场景:需要根据不同条件动态选择不同的服务实现。 如果告诉你可以完全摆脱条件判断,让Spring自动选择合适的实现——只需要一个注解,你是否感兴趣? 本文将详细介绍这种优雅的…...
Git 切换到旧提交,同时保证当前修改不丢失
在 Git 中,可以通过以下几种方式切换到之前的提交,同时保留当前的修改 1. 使用 git checkout 创建临时分离头指针(推荐用于查看代码) git checkout <commit-hash>这会让你进入"分离头指针"状态,你可…...
