自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于IAP跳转部分的代码的理解

ApplicationAddress + 4 即为0x0800 3004 ,里面放的是中断向量表的第二项“复位地址” JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);也就是说,这句话即通过推断栈顶地址值是否正确(是否在0x2000 0000 - 0x 2000 2000之间) 来推断是否应用程序已经下载了,由于应用程序的启动文件刚開始就去初始化化栈空间,假设栈顶值对了,说应用程已经下载了启动文件的初始化也运行了;这个看上去有点奇怪;

2024-06-05 20:39:08 198

原创 关于stm32的软件复位

这里有一个要注意的问题:从SYSRESETREQ 被置为有效,到复位发生器运行复位命令, 往往会有一个延时。所以,最好在发出复位请求前,先把 FAULTMASK 置位。软件复位并不会擦除存储器中的数据,它只是将处理器恢复到复位状态,即中断使能位被清除,系统寄存器被重置,但RAM和Flash存储器中的数据保持不变。相同的官方 core_cm3.h 文件中也直接提供了该函数。在官方软件库的 core_cm3.h 文件中 直接提供了 系统复位的函数。把上面这两个函数写在一起就能够实现软件复位了。

2024-06-05 20:25:39 809

原创 大端存储和小端存储

大端模式:即高位字节排放在内存地址低地址端,低位字节排放在内存的高地址端。小端模式:即低位字节排放在内存地址低地址端,高位字节排放在内存的高地址端。

2024-06-04 17:31:19 243

原创 结构体里的函数指针

这里使用一堆函数指针的目的是为了让固件里模仿向量表里的函数对应起来,同时uint32_t也是为了标志位和字节对齐的目的。细看其实没啥,把原本是函数的变成函数指针类型,函数指针类型的再加一层,就是为了方便后面的统一调用。结构体实例是结构体类型的一个具体变量,它在内存中占据一块连续的存储空间。它不包含结构体定义的所有成员变量,而是包含指向这些成员变量的指针。结构体指针是一个变量,它存储另一个变量(结构体实例)的地址。访问结构体指针所指向的结构体实例的成员时,使用箭头(它包含结构体定义的所有成员变量。

2024-06-03 14:07:40 154

原创 函数指针实例

在 C 语言中,当你使用数组名作为表达式时,它被自动转换为指向数组第一个元素的指针。数组的第一个元素,并且可以通过它来访问数组中的其他元素。数组的指针,通过这个指针可以访问数组中的元素。是一个 uint8_t 类型的数组,那么。调用者可以使用这个地址来访问数组中的元素。是一个 uint8_t 类型的数组,函数返回这个数组的地址。

2024-06-03 13:44:28 129

原创 如何修改CubeMx创建的的keil工程名

如图,打开MDK_ARM路径,只保留图中的文件,其余全部删除,LH_boot是我已经修改过的,这个目录下只用LH_boot就行。借着返回上一目录,修改cubemx工程名,再重新生成keil文件即可。

2024-06-01 17:12:00 198

原创 代码重定位与清除BSS段简单理解

MDK环境下,STM32启动文件中的__main帮我们做了重定位等一系列操作,如果不使用编译器提供的__main函数(主函数名称为main也会默认调用__main),则RW-DATA中变量的值仅保存在ROM中,没有将值复制到RAM中,但程序访问变量时,是去从该变量所在RAM内存地址处加载值的,但此地址却并未初始化,所以读取的数值为脏数据。这时候就需要我们手动去实现这个操作!ROdata段和text段通常保持在ROM中,不需要复制到RAM,因为它们是只读的,并且在ROM中可以直接执行。二.为啥需要重定位?

2024-05-31 18:28:21 328

原创 stm32 启动文件分析

启动文件前面的介绍启动文件是后缀为.s的汇编语言文本文件,每行前面的分号表示此行是注释行。启动文件主要完成如下工作,即程序执行过程:- 设置堆栈指针SP = __initial_sp。- 设置PC指针 = Reset_Handler。- 设置中断向量表。- 配置系统时钟。- 配置外部SRAM/SDRAM用于程序变量等数据存储(这是可选的)。- 跳转到C库中的 __main ,最终会调用用户程序的main()函数。

2024-05-29 20:37:27 1097

原创 IAP串口升级

IAP是(In Application Programming)即应用编程,IAP是指用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通俗的来说,IAP是将Flash划分为两部分,两部分区域各存放一个程序,一个叫Bootloader(引导加载程序),另一个叫user application(用户应用程序),下文简称APP。

2024-05-22 17:35:31 228 1

原创 Ymodem协议详解

若第1字节为SOH时有128字节,为STX时有1024字节,这部分为数据区。这个状态机的设计允许函数根据YModem协议的规范来处理文件传输的不同阶段,并且能够在出现问题时(例如CRC校验失败)采取适当的措施。YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。当接收到数据时,它会根据当前状态和接收到的数据(如。发送方收到'C'后,开始发送第二帧,第二帧中的数据存放的是第一包数据。:根据当前状态和接收到的数据,函数会执行不同的动作,如发送确认命令(

2024-05-22 17:04:28 565 1

原创 基于STM32的模拟SPI通讯

1.CS:片选线也叫NSS,当有多个SPI设备与SPI主机相连时,设备的其他信号线SCK、MOSI、MISO同时并联到相同的SPI总线上(无论由多少个从设备,都共用这3条总线),而每个从设备都有独立的CS片选线,有多少个从设备就有多少个CS线。SPI通讯无设备地址,当主机要选择从设备时,把该从设备的CS线拉低该从设备就会被选中,片选有效,主机就可以开始和从设备进行SPI通讯。当CPOL=1,即空闲时为高电平,从高电平变为低电平再变为高电平,第二个时钟边沿(上升沿)即进行采样。器、数字信号解码器等设备之间。

2024-03-07 20:30:40 1249

原创 GPIO应用之蜂鸣器驱动

蜂鸣器主要有电磁式和电压式两种, 而且都有无源蜂鸣器和有源蜂鸣器两类。开发板使用的是电磁式无源蜂鸣器, 而有源和无源的区别是有源蜂鸣器内部自带振荡器,给个电压就能发声, 但频率是固定的,只能发出一种声音,而无源蜂鸣器频率可控,给个方波才可以发声, 并且根据不同频率发出不同的声音效果。

2024-03-06 21:25:43 562

原创 GPIO应用之按键FIFO驱动

eg:FIFO机制和状态机一样,都是在裸机编程中非常重要的编程思想。FIFO是先入先出的意思,即谁先进入队列,谁先出去。比如我们需要串口打印数据,当使用缓存将该数据保存的时候,在输出数据时必然是先进入的数据先出去,那么该如何实现这种机制呢?首先就是建立一个缓存空间,这里假设为10个字节空间进行说明。从上图可知,使用FIFO就先要定义一个结构体,来储存他的三个成员。缓存区Buf[]数组,缓存区写指针Write,缓存区读指针Read。初始状态下,Read=Write=0;//缓存区//缓存区写指针。

2024-03-02 00:21:43 1141

原创 stm32 软件I2C读取MPU6050

【代码】stm32 软件I2C读取MPU6050。

2023-10-29 21:16:55 102 1

原创 STM32 待机模式+实时闹钟

【代码】STM32 待机模式+实时闹钟。

2023-10-25 21:04:17 225 2

原创 STM32 独立看门狗

【代码】STM32 独立看门狗。

2023-10-25 21:01:50 61 1

原创 STM32 窗口看门狗

【代码】STM32 窗口看门狗。

2023-10-25 21:00:59 42 1

原创 stm32 AD单通道

【代码】stm32 AD单通道。

2023-10-21 22:29:23 41 1

原创 stm32 AD多通道

【代码】stm32 AD多通道。

2023-10-21 22:27:37 36 1

原创 stm32 DMA数据运输

【代码】stm32 DMA数据运输。

2023-10-21 22:24:05 27 1

原创 stm32 DMA+AD多通道

【代码】stm32 DMA+AD多通道。

2023-10-21 22:22:16 40 1

原创 stm32_实时时钟

【代码】stm32_实时时钟。

2023-10-21 22:20:06 68 1

原创 STM32 PWM驱动舵机(标准库)

【代码】STM32 PWM驱动舵机(标准库)

2023-10-16 18:46:13 287 1

原创 STM32 定时器 涉及到的计算总结

这里的频率的意思就是1s中记 Tclk/(psc+1)M个数 (1M=10的6次方) ,每记一个数的时间为(psc+1)/Tclk ,很好理解频率的倒数是周期,这里每一个数的周期就是(psc+1)/Tclk 秒。我们将分配的时钟进行分频,指定分频值为psc,就将我们的Tclk分了psc+1,我们定时器的最终频率就是Tclk/(psc+1) MHz。定时器更新(7199+1)*(1/7200)=1s,也就是1s进入一次更新。然后我们从0记到arr 就是 (arr+1)*(psc+1)/Tclk。

2023-10-16 18:28:05 2099 2

原创 STM32 超声波模块输入捕获测距(标准库)

通道2设置为下降沿触发,触发瞬间会将CNT的记录到CCR2中,由于上升沿触发时已经将CNT置零所以此时的CNT的值就是高电平的持续时间。通道1设置为上升沿触发,触发的瞬间会将CNT的值记录到CCR1里面,同时设置通道1触发带有从模式,并把从模式设置为置零CNT。超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应)。输入捕获原理可以看看这位大佬,感觉写的很清楚,工作电压与电流:5V,15mA。感测角度:不小于15度。

2023-10-16 18:18:24 869 4

原创 STM32定时器中断类型分析

TIM_IT_Update:更新中断,计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)TIM_IT_Trigger:触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)调用TIM_GetITStatus()函数来查看是否有中断发生,入口参数都是平等的。TIM_IT_CC1~4:都是捕获/比较中断,貌似都是平等的,即输入捕获,输出比较。使用的时候都是调用函数TIM_ITConfig()来使能指定的中断类型。可能就是不同的事件导致中断的发生略有不同。还是得多看数据手册!

2023-10-15 17:26:09 188 1

原创 stm32 标准库 TIM输入捕获模式测频率(上)

【代码】stm32 标准库 TIM输入捕获模式测频率(上)

2023-10-07 22:43:16 54 1

空空如也

空空如也

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

TA关注的人

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