自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 【C】static

2、如果1.c和2.c都只调用b.h,b.h中定义一个变量,则在c文件编译时不出错,但是在链接成可执行文件时会报错。1、一个main.c文件调用a.h和b.h,a.h中又调用b.h,如果在b.h中定义一个变量,则main.c编译报错重复定义,通过h中的#ifndef这种宏定义即可解决。因为所谓h文件就是在编译时展开在c文件中而已。1、修饰局部变量:使其变为静态变量,这个局部变量在函数执行完成后不会被释放,而是继续保留在内存里。3、修饰函数:使函数只能在本文件中使用,同时不会与其他文件的同名函数产生干扰。

2026-04-08 00:32:36 6

原创 【C】定义一个不占用内存的数组

使用关键字const。

2026-04-08 00:32:06 2

原创 【单片机】减小ROM占用的小技巧

对于初始化非0的全局变量,存在.data,既占用ROM,也消耗RAM。所以建议这些全局变量,初始化为0,在初始化函数里赋值,这样就从.data变成.bss,不占用ROM。

2026-04-08 00:29:50 3

原创 【单片机】常用设计模式

单例模式源自面向对象的思想,将多个业务都会用到的功能,打包成一个实例,自我管理,封装接口,从而节约资源,避免冲突。比如多线程下都想打印,可以创建一个打印实例,有打印锁,有环,专门管理打印业务。将操作封装成表的形式,用命令绑定某个操作,当命令来的时候,查表运行即可。分成两个维度,遥控器(普通、语音、触屏)和电视(小米、TCL),“桥”就是“遥控器控制电视”,遥控器只管按键,电视只管播放。适用于同类对象很多,很复杂,还需要动态处理的情况。注册器模式,就是将各种对象注册到一个链表里,用的时候查表即可,省心高效。

2026-04-08 00:29:17 201

原创 【单片机】STM32Fxx启动模式怎么接

BOOT0接高,BOOT1接低,芯片会从内部一块特定区域启动。芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。如果芯片程序因为一上电就修改了下载引脚导致下不了程序可以通过这个模式重新下程序恢复。

2026-04-08 00:28:41 11

原创 【单片机】STM32Fxx关闭下载口

【代码】【单片机】STM32Fxx关闭下载口。

2026-04-07 09:45:25 172

原创 【单片机】读GPIO引脚开漏输出引脚

读GPIO开漏输出引脚的前提是该引脚不能输出低,如果输出低则读到的电平一直是低,如果输出高(上拉),还是可以读到该引脚连的地方的高低电平。//为了防止死锁发生时单片机的SDA拉高,IIC芯片的SDA拉低可能导致短路,SDA和SCL都配置开漏输出。//不是所有单片机都支持引脚开漏输出可以当输入用,SDA需要切换输出和输入。

2026-04-07 09:44:55 131

原创 【单片机】51单片机的晶振选择

51单片机的晶振可以是12MHz,但更多的使用11.0592MHz。定时器计数采用机器周期,51单片机指令集属于CISC,可能与此有关,导致12个晶振时钟周期等于1个机器周期等于1/N个指令周期。因此Fosc/12与波特率强相关,12000000/12/9600≈104.17,11059200/12/9600=96,12MHz算不出整数,波特率会存在偏差。arm系列的单片机使用RISC指令集,1个时钟周期等于1个机器周期等于1个指令(绝大部分汇编指令)周期。

2026-04-07 09:43:32 188

原创 【单片机】事件驱动和消息驱动

注意:STM32上中断和事件中的“事件”是一个硬件概念,和事件驱动的事件不是同一个东西。事件驱动和消息驱动本质上是一样的,事件是本质,消息是实现的手段。

2026-04-07 09:43:00 187

原创 【单片机】文件系统的扇区、块

具体文件系统所操作的基本单位是逻辑块,只有需要进行I/O操作时才进行逻辑块到物理块的映射,这样避免了大量了I/O操作。块和簇都是扇区的集合,只是不同系统使用的名称不同而已。比如:windows系统用的簇,linux系统用的块。所以物理扇区、物理块的大小和文件系统的逻辑扇区、逻辑块的大小没有关系。文件系统也有扇区和块,也就是逻辑扇区和逻辑块。器件有扇区和块,也就是物理扇区和物理块。

2026-04-07 09:42:17 171

原创 【单片机】STM32的FSMC总线什么情况需要复用

在芯片参考手册里,有FSMC具体的连接方式,非复用总线都可以接PSRAM或者SRAM,但复用总线只可以接PSRAM(这边只讨论SRAM和PSRAM,别的也是类似的)。这时为什么,因为非复用接的是非复用的存储芯片,SRAM只有非复用型的,PSRAM有非复用型和复用型。所以复用总线可以直接接复用型的PSRAM。非复用的PSRAM和SRAM接口或者时序是一样的,这种锁存器法也完全可以用在SRAM上。在芯片引脚多的情况下A和D总线可以分开,但是如果引脚少,比如STM32F103Vx,就只能数据总线和地址总线复用。

2026-04-04 11:25:44 60

原创 【单片机】STM32晶振引脚不连晶振时的做法

1、对于100脚或者144脚的产品,OSC_IN应接地,OSC_OUT应悬空;

2026-04-04 11:25:07 44

原创 【单片机】位域非原子写的风险

举个例子,比如a.bit0和a.bit1,现在a是0,低优先级线程给a.bit0置1,然后高优先级线程给a.bit1置1,结束后发现,a.bit0是1,a.bit1是0。位域的非原子操作问题,如果位域的各个bit之间没有关联,可以用独立整数处理,因为独立整数(小于总线大小)的写是原子操作。单字节变量的写是原子操作,但是位域,比如a.bit0和a.bit1的写,和“a++”属于“读-改-写”。先读出一个临时变量,改完这个临时变量,再将临时变量写回去(原子操作问题无法用volatile处理)。

2026-04-03 14:35:03 22

原创 【单片机】RAM和ROM

程序的运行不一定非要RAM,有些指令的执行没有用到RAM,就不需要RAM。NOR FLASH可以选择按字节或者半字读写,NAND FLASH按扇区读写,扇区大小不定,一般总是512字节的倍数。PC:主板上有BIOS,BIOS是一段固定在主板上的程序,开机先运行它,先检查机器是否正常,然后加载操作系统到内存里。RAM就是内存,存储运行中的数据,速度快,掉电丢失数据。机械硬盘作用与NAND FLASH类似,但是制作方法不同,HDD是磁盘,SSD是半导体。SRAM(静态),容量小,贵,速度非常快,不需要刷新。

2026-04-03 14:33:18 45

原创 【VSCode】在类似Trae的软件上使用VSCode的插件市场

安装Trae时,先不导入VSCode的配置,安装成功后,进入设置项调整插件市场路径。搜索Market,调整插件源地址。

2026-04-02 08:52:04 170

原创 【AI】Vibe Coding尝试

Vibe Coding = 用人话和AI聊天 + AI帮你写代码 + 你们一起迭代优化。本质就是将用C语言的语法写代码,变成用自然语言去写代码,只有规范话的流程和语法才能提高AI写代码的效率。

2026-04-02 08:50:13 221

原创 【单片机】系统时钟和串口波特率的关系

串口波特率关联你代码中算出来的时钟频率,如果你的HSE_VALUE或者HSI_VALUE定义的值和实际的不符,那么你的时钟频率也和实际不符,波特率自然也不对。

2026-04-01 13:04:45 14

原创 【单片机】STM32Fxx中RTC掉电不走

2、由于LSI内部晶振,在断电的时候不在后备供电区域,而外接的电池连在VBAT上,只给后备供电区域供电,导致芯片断电后,电池只能维持后备RTC的计数,并没有给LSI晶振供电,导致RTC总是保持在断电之前的时间。注意:VBAT给RTC供电,包括RTC的所有寄存器,比如上一版代码打开了RTC的秒中断,VBAT不断电的情况下重新烧代码,新代码不打开RTC的秒中断,但是依旧产生秒中断。1、由于LSI晶振频率大约在40KHz附近,实际上会在30~60KHz之间波动,导致计时不准,基本上一小时会有1分钟左右的偏差。

2026-04-01 13:04:15 51

原创 【单片机】单字节赋值和4字节赋值那个快

2026-03-31 09:05:11 191

原创 【单片机】STM32的启动流程(Keil)

注意:__initial_sp是栈顶地址,DCD表示分配一个4字节空间,所以Reset_Handler的地址就是0x08000004,0x08000000作为程序的第一个地址保留,实际存的是栈顶的地址。所以STM32的启动流程是,上电,CPU的时序逻辑电路完成两件事:1、将0x08000000存放的栈顶地址放入SP,0x08000004存放的复位中断处理函数的地址放入PC程序计数器,然后进入复位中断,在Reset_Handler里初始化,然后跳转main函数。2、保持堆栈8字节对齐,设置使用的指令集。

2026-03-31 09:04:38 336

原创 【单片机】编译器指令宏

【代码】【单片机】编译器指令宏。

2026-03-30 09:58:42 321

原创 【单片机】IAR中的__no_init(启动流程)

启动文件中DATA表示后面是编译出来的固件的前几个字节的内容,用户可以自己的需求调整。如果放置中断表,中断向量表不能动。如果是下图的这种,生成固件B,固件A可以运行nonlegal_sysInit_init启动固件B。在IAR中__no_init主要修饰.bss或者zi-data等静态未初始化数据。作用:复位时不对该变量初始化,用于保留其之前的值。

2026-03-30 09:58:07 144

原创 【单片机】单片机的位数由什么决定

哈佛结构就是将程序的逻辑代码段和变量分开存放的一种结构,而他们存放的位置可以是相同也可以是不同,但只要是分成两个部分单独访问的结构都可以叫哈佛结构。而ARM芯片(S3C2440)的逻辑代码段和变量都是存放在RAM中的,但它在内存中划分了两部分的空间,其中一部分放逻辑代码段,另一部分放变量,之间不会相互干扰(51、STM32)。也就是说,地址总线的宽度决定了CPU能够使用的内存的大小。由于控制总线要对所有的外设进行控制,因此,他是双向的且十分的灵活,而其总线的宽度也是不确定的,主要由外设的数量决定。

2026-03-29 18:25:10 185

原创 【单片机】中断标志位什么时候清

单片机中断处理中,建议先清除中断标志位,再执行其他业务操作。原因在于假如最后清除,可能程序已经跳出中断函数,但是硬件上还未真的清除完毕,会再次进入中断。

2026-03-29 18:24:38 127

原创 【单片机】C语言程序在单片机上运行时的内存分布情况

在PC上的C语言中const修饰全局变量和局部变量,直接修改都语法不通过,但是通过定义一个指针,指向这个变量的地址,修改指针所指向的值,这种情况下,语法是可以通过的,全局变量失败,局部变量成功,通过查看地址可得,const修饰的全局或静态变量是放在文字常量区,但局部变量还是放在栈区。因为函数指针的值并不是一个确定的值。IAR上map的框起来的ROM就是keil上Code+RO-data+RW-data,框起来的SRAM就是keil上的RW-data+ZI-data,这个是找个项目实际验证的。

2026-03-28 15:57:10 374

原创 【单片机】IAR上__disable_interrupt未定义

因为__disable_interrupt和__disable_irq不同,是IAR上特有指令,需要增加头文件。功能上两者相同,就是关中断,屏蔽CPU对中断的处理。同时关中断期间,来了中断,会记录中断优先级,开中断后,再根据中断优先级先后运行。在rtthread中通过rt_hw_interrupt_disable和rt_hw_interrupt_enable实现开关中断的多级嵌套。中断嵌套是指A中断运行期间,来了B中断,如果B优先级高,会先运行B,B运行完了继续运行A。

2026-03-28 15:56:24 331

原创 【单片机】串口的波特率偏差

有的单片机支持7816,7816接口和串口引脚复用,7816的时钟要求比较精准,一般低于2%。如果硬件无法分频到需要的波特率上,可以采用模拟7816。串口的波特率分频误差通常是由于系统时钟频率与目标波特率之间的关系导致的。比如72M无法除以一个整数得到115200。:8N1的情况下,5% = 1 / (2 * 10),则一般要求通过系统时钟频率算出的波特率偏差低于5%波特率误差容忍度:传一个字节,累计偏差不能超过半个位。

2026-03-27 11:59:57 242

原创 【单片机】内核中断及NVICPending

对于支持优先级分组的芯片来说,void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)的设置的优先级和void NVIC_Init(NVIC_InitType* NVIC_InitStruct)是一样的。若分组NVIC_PriorityGroup_2,优先级6,则抢占优先级1,响应优先级2。STM32的默认分组是NVIC_PriorityGroup_0,无抢占优先级,钜泉的默认分组4,全是抢占优先级。

2026-03-27 11:59:21 371

原创 【单片机】i2c总线死锁

i2c总线的信号规定,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的电平才允许变化。i2c死锁是指在i2c通信过程中,由于主从设备状态不一致,导致总线无法正常释放,通信停滞的故障。at24cxx的型号参数。

2026-03-25 11:37:11 254

原创 【单片机】不同芯片SPI的从选择管理差异,及MCU作为从机的概念

SSM = 0,SSOE = 0:硬件输入模式,外部引脚高电平,内部NSS高电平,才可以通信,外部引脚配置复用功能,还需要一个GPIO控制从机。SSNSEN = 0,内部NSS受硬件控制,SSN可0可1,外部引脚配置成普通IO控制从机(项目中使用SSNSEN = 0,SSN = 1 )。SSM = 0,SSOE = 1:硬件输出模式,发送数据时,外部引脚拉低,控制从机,外部引脚配置复用功能。SSNSEN = 0,内部NSS受硬件控制,SSN可0可1,外部引脚配置成复用功能,发送时自动拉低,

2026-03-25 11:36:35 297

原创 【单片机】J-Link的RTT-Viewer连不上?

2026-03-24 11:27:08 171

原创 【单片机】boot跳转app

给boot分配空间大小时,需要考虑到IAR的flashloader算法中的最小擦除单元,不同芯片不一样。如果最小擦除单元8K,给boot分配12K空间,则使用IAR烧写都会擦除有用信息,调试运行异常。上图是无跳转的情况,app中断发生时进入中断向量表,直接跳转到对应中断向量,路线③,中断向量存的是对应函数地址,然后运行中断处理函数,路线④。上图是有跳转的情况,app中断发生时根据VTOR进入中断向量表,直接跳转到对应中断向量。所以路线④⑤画的不对,只能当作一个示意,④的箭头应该指向app的中断向量表。

2026-03-24 11:26:14 167

原创 【单片机】为变量指定绝对地址、USED

补充:如果定义了绝对地址或者固定段,且map文件里有显示定义的,会导致编译出的bin文件膨胀到包含绝对地址。但是map文件最后显示ROM大小和bin文件不一定一样,map显示的是由map里面各种所占空间累加得出,编译报错也是根据map来的。##IAR上也支持__attribute__((section(x)))和__attribute__((at(x)))####GCC不直接支持将变量放置到指定地址,需要结合链接器脚本##

2026-03-23 00:32:09 244

原创 【单片机】RTC校准原理

但是一般只用15~35度的点,如果在低温下调,可能常温下精度又不行了。低温下调也只能微调,像一个翘翘板,调一点点,改善低温下的精度,常温下误差可以高一点点,取一个平衡。钜泉校准RTC方式类似方式3,不关闭校准,参数存在寄存器中。精校时,取5个点,挨个调整晶振抛物线。一般可能只用3个点,高低温加常温。批量时,只校准常温。先关闭校准,取5个不同温度点及对应时钟偏差,可以拟合一个晶振曲线。其中B为多项式系数,Ti为顶点温度,C为顶点偏移,f为晶振频率,T为实际温度。所以校准可以采用第3种方式。

2026-03-23 00:31:33 351

原创 【单片机】如何指定某个函数的优化等级

上述代码块中,IAR编译中的优化等级指定只作用下一个函数,无需函数结束后再定义恢复。

2026-03-22 16:28:52 17

原创 【单片机】开发中遇到的复杂问题

现有算法服务虽然不是标准的易理解的,但是足够使用,并具有较大共识,所以。在不用OS的程序里,相当于单线程,任务与任务之间只能只用标志位交流,但是如果使用OS,是多线程使用,任务之间的交流需要更加紧密、次序分明,所以需要使用信号量,如果离的比较远,要求不高可以使用标志位。easyflash可以认为是一个简化版的文件系统,如果用来存参数,比较适合参数量少的情况,一旦数量上去,读写会很慢,也不能接受。SPI全双工,是因为它的总线设计,但在单片机应用中,分主机从机,一问一答,信息是以半双工的方式传递的。

2026-03-22 16:28:07 351

原创 【单片机】使用达夫设备提高拷贝效率

【代码】【单片机】使用达夫设备提高拷贝效率。

2026-03-21 12:23:12 15

原创 【单片机】状态机的使用

实用性上考虑,FSM用switch-case即可,一般是先判断状态,再在每个状态的处理中判断消息。如果代码量太多,可以考虑先判断消息,再在消息处理中判断状态,将不同状态的相同处理合并。如果状态很多,分了层次,可以用HSM,父状态子状态。由于消息的处理是紧密关联子状态,所以优化代码量的思路是先判断父状态,处理父状态的代码里面先判断消息再判断子状态。,只适用FSM,不能用于HSM,同时状态切换需要有明确的事件发生,很多情况用不了。状态机分有限状态机和层次状态机,有限状态机是单层,层次状态机是多层。

2026-03-21 12:22:25 18

原创 【单片机】串口的环形队列通信

批量解析和流式解析一般都是中断收数据,主流程判断报文是否完整,区别在于批量解析没有状态机,每次判断都把所有字节拿出来判断,流式解析有一个状态机,每次判断都会记录下当前状态,下次只取新数据判断。半双工模型只适用批量解析,全双工模型可用流式解析和批量解析,全双工下一般会有个较长的重置时间(1s),超过1s没有新数据,重置接收缓存和解析状态。半双工不使用环,是因为有状态机的切换,在“COM_RECVED”的状态下无法接收新数据,环没有意义。接收完成时保持不变,也可以发送接收都关,但是没必要关。

2026-03-20 13:10:15 190

原创 【单片机】利用双缓冲机制保护全局变量不受中断影响以及环形队列

如果SIZE是2的幂次时,队头队尾变量的天然的回绕点是SIZE的整倍数,无需特殊处理,只需要++即可(这种一定是队头队尾变量可以达到2^32,),队头队尾一直加,直到回绕点清零,这样通过头尾差值判断队满还是队空,差值最大不超过元素总数。以上方法只用于简单的主循环读、中断写的情况,且读的过程中只能有1次中断写,如果复杂点可以采用循环队列或者读写锁(中断不能阻塞)之类(),如果A区剩余空间不够则用B区,B区剩余空间不够则用A区,总能提供一段连续内存给DMA之类的用。只是逻辑上区分,且不等长,比“乒乓”高级。

2026-03-20 13:09:36 799

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除