
STM32
文章平均质量分 97
STM32
Projectsauron
昨夜西风凋碧树,独上高楼,望尽天涯路。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【STM32】通过 DWT 实现毫秒级延时
在 FreeRTOS 中,SysTick被用于作为调度器的一部分进行任务调度,那么如果我需要使用软件模拟通信,例如软件 I2C,需要使用 delay,就无法使用 SysTick 实现的 delay。因此,这里提供一种基于 DWT 实现的 delay。原创 2024-11-02 11:03:57 · 1599 阅读 · 2 评论 -
STM32 调试之栈回溯和 CmBacktrace 的使用
上图将通用寄存器分为 low register 和 high registers 就是根据指令集来说的,对于 Thumb 指令,是 16 位的,只能访问到 low register,也就是 R0-R7,而对于 32 位的 Arm 指令,是所有的指令都可以访问到。在不同的模式下,R0-R12、SP、LR 是各有一份的,所以这样算下来,总共是 32 个寄存器,但是在不同的模式下,并不能完全看到这 32 个寄存器的状态,只能看到其中的一部分。栈中数据和前面提到的寄存器是对应的,现在 SP 指针指向了地址。原创 2024-10-24 00:35:16 · 5111 阅读 · 4 评论 -
Cortex-M 内核的 OS 特性
PendSV典型使用场合是在上下文切换时(在不同任务之间切换)。上下文切换的本质就是保存当前执行现场 A,切换到另一个任务 B 里面。切换回来时又要恢复执行现场 A(将一系列的寄存器入栈、出栈)。由于PendSV的特点就是支持缓期执行,所以 RTOS 可以利用它这个特点,进行任务调度过程的上下文切换。而为什么要使用缓期执行的特点来进行上下文切换呢?简单的说就是任何 RTOS,都需要尽量不打断外设中断。执行一个系统调用系统滴答定时器 SYSTICK 中断,触发了任务的调度。原创 2024-10-13 13:08:07 · 8150 阅读 · 16 评论 -
DMA 详解
DMA,直接存储器访问)顾名思义,就是绕开 CPU 直接访问 Memory。在计算机中,相比 CPU,Memory 和外设的速度是非常慢的,因而在 Memory 和 Memory (或者 Memory 和外设)之间搬运数据,非常浪费 CPU 的时间,造成 CPU 无法及时处理一些实时事件。因此,工程师们就设计出来一种专门用来搬运数据的器件——DMA 控制器(DMAC),协助 CPU 进行数据搬运。原创 2024-10-10 18:35:39 · 7772 阅读 · 9 评论 -
STM32 位带操作
如果你学过 51,是否还记得你是如何点亮的 led?// 控制到 P2.0 脚LED1 = 0;// 输出一个低电平通过简单的两句话就可以点亮一个 led 了。这就是位带()操作,支持位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。而我们也知道,在 STM32 中并不能直接操作寄存器的某一个 Bit 位,而只能通过字来读写寄存器,例如:那能否实现 51 类似的 GPIO 控制功能,能够直接操作位?原创 2024-10-08 14:44:37 · 9640 阅读 · 23 评论 -
Cortex-M3/M4/M7 芯片 Fault 分析原理与实战
HardFault(硬件错误)是一类在嵌入式系统开发中较为常见的系统异常,优先级仅低于复位和 NMI(不可屏蔽中断)。当系统运行过程中遇到了某些错误时程序就会跳转至函数中,引发程序故障进而影响程序的正常运行。HardFault(硬件故障):默认异常,由于异常处理过程中的错误或由于任何其他异常机制无法管理异常而触发。MemManage(内存管理故障):检测内存管理单元(MPU)中定义的区域的内存访问违规;例如,在一个只有读/写访问权限的内存区域中执行代码。BusFault。原创 2024-10-07 19:38:58 · 11828 阅读 · 13 评论 -
基于 STM32F407 的 SPI Flash下载算法
本文将介绍如何使用 MDK 创建STM32F407的SPI Flash下载算法。其中,SPI Flash芯片使用的是W25Q128,其相关操作源码可以参考STM32 通过 SPI 驱动 W25Q128,本文所使用的驱动 SPI Flash 的 API 和里面是一样的。单片机的 Flash 下载算法是一个 FLM 文件,FLM 通过编译链接得到,其内部包含一系列对 FLASH 的操作,包括初始化、擦除、写、读、校验等等操作。想要制作下载算法,先要了解下载算法的工作原理。下载工具(比如jlink。原创 2024-10-06 17:09:25 · 12228 阅读 · 19 评论 -
基于 STM32F407 的串口 IAP
STM32 芯片启动过程。从地址取出 MSP(主堆栈寄存器)的值从地址取出 PC(程序计数器)的值然后取出第一条指令执行不过,STM32 比较特殊,它对地址做了一个重定向(由 MCU 启动配置决定的),一般它是将地址映射到从地址取出 MSP(主堆栈寄存器)的值从地址取出 PC(程序计数器)的值然后取出第一条指令执行为什么要设置到,而不直接使用?原创 2024-10-01 16:39:05 · 15792 阅读 · 15 评论 -
hex 文件和 bin 文件剖析
二进制文件()是一种以二进制形式存储的计算机文件,其中的数据以字节为单位进行编码。二进制文件可以包含任意类型的数据,如图像、音频、视频、可执行文件等。与之相对的是文本文件,文本文件使用字符编码(如 ASCII 或 Unicode)表示数据。十六进制文件(Hex File)是一种特殊的二进制文件,其中的数据以十六进制表示。每个十六进制数对应 4 个二进制位,因此可以更直观地查看和编辑二进制数据。十六进制文件常用于存储和传输机器码(即可执行文件),特别是在处理嵌入式系统中常见的固件或软件升级时。原创 2024-09-30 11:03:05 · 18004 阅读 · 19 评论 -
浅析 Keil 中的 sct 文件
当工程按默认配置构建时,MDK 会根据我们选择的芯片型号,获知芯片的内部 FLASH 及内部 SRAM 存储器概况,生成一个以工程名命名的后缀为*.sct的分散加载文件(),链接器根据该文件的配置分配各个节区地址,生成分散加载代码,因此我们通过修改该文件可以定制具体节区的存储位置。可以设置源文件中定义的所有变量自动按地址分配到外部 SDRAM,这样就不需要再使用关键字按具体地址来指定了;原创 2024-09-29 15:29:08 · 17215 阅读 · 13 评论 -
STM32 时钟树(基于 STM32F407)
STM32 内部也是由多种多样的电路模块组合在一起实现的。当一个电路越复杂,在达到正确的输出结果前,它可能因为延时会有一些短暂的中间状态,而这些中间状态有时会导致输出结果会有一个短暂的错误,这叫做电路中的“毛刺现象”,如果电路需要运行得足够快,那么这些错误状态会被其它电路作为输入采样,最终形成一系列的系统错误。原创 2024-09-25 15:32:02 · 22132 阅读 · 25 评论 -
STM32 map 文件浅析
map文件是编译器链接时生成的一个文件,它主要包含了交叉链接信息。通过.map文件,我们可以知道整个工程的函数调用关系、FLASH和RAM占用情况及其详细汇总信息,能具体到单个源文件(.c/.s)的占用情况,根据这些信息,我们可以对代码进行优化。原创 2024-09-24 21:48:08 · 22322 阅读 · 22 评论 -
STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器
下表是AT24CXXX 的容量AT24C01,AT24C02,AT24C04,AT24C08,AT24C16,AT24C32,AT24C64,AT24C128,AT24C256… 不同的 xxx 代表不同的容量。AT24CXXXbit容量Byte容量AT24C011Kbit128ByteAT24C022Kbit256ByteAT24C044Kbit512ByteAT24C088Kbit1024ByteAT24C1616Kbit2048ByteAT24C3232Kbit。原创 2024-09-23 12:34:28 · 23123 阅读 · 42 评论 -
单片机内存区域划分
/ val1存放在.data段// 初始化的全局变量存放在.data段// 未初始化的全局变量存放在.bss段// val4存放在.rodata(只读数据段)unsigned char Demo(unsigned int num) // num 存放在栈区// var存放在栈区,"123456"存放在常量区// num1存放在栈区// num2存放在.data段// num3存放在栈区void *p;// p存放在堆区free(p);return 1;原创 2024-09-01 18:09:25 · 43549 阅读 · 29 评论 -
STM32 芯片启动过程
下面主要讲解从上电复位到 main 函数的过程。初始化中断向量表配置系统时钟调用 C 库函数_main初始化用户堆栈,然后进入main函数至此,启动过程圆满结束!原创 2024-09-18 16:56:24 · 31409 阅读 · 26 评论 -
STM32 通过 SPI 驱动 W25Q128
// ctl_spi.h#ifndef __CTL_SPI_H#define __CTL_SPI_Hvoid spi_init(void);uint8_t spi_read_write_byte(uint8_t tx_data);#endif /* __CTL_SPI_H */原创 2024-09-21 13:33:00 · 24561 阅读 · 27 评论