- 博客(70)
- 收藏
- 关注
原创 使用vscode开发stm32
摘要:本文介绍使用VSCode开发STM32的快速方法。首先安装STM32CubeIDE插件,然后通过CubeMX生成CMake工程,选择STLink调试器连接开发板,最后在VSCode中直接运行调试,实现LED闪烁等功能。该方法简化了STM32开发环境配置,让开发者能在熟悉的VSCode环境中高效完成嵌入式开发。
2026-03-20 21:05:29
196
原创 单片机的工厂方法模式和桥接模式结合使用
本文介绍了在单片机开发中结合使用工厂方法模式和桥接模式实现多传感器管理的方案。通过定义统一的传感器接口(Sensor_t结构体),封装了DS18B20和MAX31855等传感器的初始化(Init)和读取(Read)操作。工厂方法模式体现在Sensor_Create函数中,根据传感器类型和实例号创建对应对象;桥接模式则通过pPrivate指针将传感器抽象与具体硬件实现分离。该设计支持多个传感器实例管理,如最多5个DS18B20和MAX31855传感器,每个实例可独立配置硬件参数(如GPIO引脚或SPI接口)。
2026-03-13 23:41:36
140
原创 单片机的工厂方法模式
摘要: 本文展示了在STM32嵌入式系统中实现简单工厂模式的示例,以传感器管理为应用场景。通过定义抽象传感器接口(包含初始化、读取等函数指针),并实现具体传感器(DS18B20温度传感器和DHT22湿度传感器),最后通过工厂函数根据类型创建对应的传感器实例。该设计使用结构体和函数指针模拟面向对象特性,提高了代码的可扩展性和维护性,便于新增传感器类型而不影响现有代码。文中提供了完整的头文件和实现代码,包括传感器枚举定义、抽象接口结构体、工厂函数实现以及具体传感器的驱动细节。
2026-03-06 22:34:03
113
原创 单片机的命令模式
本文摘要: 该代码实现了基于命令模式的单片机通信协议解析框架。通过定义命令码枚举(CmdCode_t)和命令处理函数类型(CmdHandler),构建了可扩展的命令表(CmdTableItem_t)。框架采用状态机逐字节解析协议帧(0x7E起始标志+长度+payload+校验),校验通过后通过命令表查找对应的处理函数执行。优势在于将协议解析与命令执行解耦,新增命令只需扩展命令表而无需修改核心解析逻辑,提高了代码的可维护性和扩展性。示例实现了LED控制和温度读取等基本命令,支持参数长度校验和错误码返回。
2026-03-01 16:34:39
443
原创 单片机实现的观察者模式
本文实现了观察者模式在STM32传感器数据更新场景中的应用。通过定义SensorSubject结构体作为被观察者,其中包含观察者回调函数数组和传感器值。关键函数sensor_attach()用于注册观察者,sensor_set_value()更新传感器值并触发所有注册的回调函数。测试中注册了显示、日志和报警三个观察者模块,当传感器值更新时,各模块能自动同步数据并执行相应操作。该模式通过函数指针实现动态绑定,有效解耦了传感器模块与其他依赖模块,实现了高效的一对多数据同步机制。
2026-02-24 21:51:52
761
1
原创 单片机实现的SPI桥接模式
本文展示了STM32F4系列微控制器的软件SPI实现代码。SPI.h文件定义了SPI模式、数据顺序、时钟分频等枚举类型,并构建了包含引脚配置、传输模式和延时函数的SoftSPI_HandleTypeDef结构体。SPI.c文件提供了具体实现,包括默认延时函数、波特率计算、数据传输等核心功能。该实现支持四种SPI模式,通过GPIO模拟时序,可选择硬件或软件延时,并提供了字节/批量数据传输接口。这种软件SPI方案在硬件SPI资源不足时特别有用,虽然速度较慢但具有高度灵活性。
2026-01-18 17:51:00
79
原创 单片机实现的I2C桥接模式
本文介绍了一种使用桥接模式实现AT24CXX系列EEPROM驱动的方法。通过软件模拟I2C接口,将硬件I2C功能抽象为结构体IIC_Type,包含GPIO配置和操作函数指针。该设计实现了硬件无关性,AT24CXX只需依赖抽象的I2C接口,而不直接绑定具体硬件。I2C.h文件定义了接口结构体和函数原型,I2C.c实现了GPIO初始化、起始/停止信号、数据读写等基础操作。这种桥接模式提高了代码的可移植性和复用性,便于在不同硬件平台上实现I2C通信功能。
2026-01-18 17:45:12
43
原创 定时器计数溢出引发的bug
摘要:在移植multitimer到STM32项目时,发现运行49天后定时器失效。原因是multitimer使用64位接口,而STM32默认32位时基导致溢出。解决方案是实现64位时间获取函数,通过记录32位溢出次数并组合当前tick值,形成64位时间戳,解决了49.7天后的定时器故障问题。关键修改包括扩展SysTick获取函数和更新平台接口。
2025-12-19 21:37:18
218
原创 时间片轮询框架
本文介绍了一种基于时间片轮询的单片机裸机任务调度框架。该框架通过定义任务结构体、初始化任务列表、添加任务函数、处理就绪任务和定时更新任务计时器等步骤,实现了类似RTOS的多任务调度功能。测试结果显示,LED闪烁、按键扫描、数据处理和显示等任务能够按照预设的时间间隔准确执行。这种轻量级的时间片轮询方法为裸机系统提供了一种高效的任务调度解决方案,特别适用于资源受限的单片机应用场景。
2025-12-17 21:20:07
185
原创 单片机的策略模式
本文介绍了一种基于策略模式的协议解析框架设计。通过parser_manager模块管理多个协议解析器,支持动态注册/注销不同协议的解析器,实现字节流的分发处理。框架采用轻量级设计,包含初始化、注册、注销功能,并提供单字节/多字节输入接口。特别实现了超时通知机制,支持Modbus等需要静默时间检测的协议。解析器状态机包含DONE、IN_PROGRESS等状态,便于扩展不同协议处理逻辑。该设计适用于嵌入式系统,具有可扩展性,可通过优先级调度或独占模式等策略增强功能。
2025-12-12 23:57:56
295
原创 FreeRTOS的二值信号量,计数信号量,互斥信号量
RTOS的信号量共有3中,分别是二值信号量,计数信号量和互斥信号量。信号量的创建,发送和获取其用的就是队列的函数。
2025-01-18 13:22:42
238
原创 使用Keil创建FreeRTOS工程
之前记录了使用Keil创建Keil自带的RTX5的RTOS和使用CubeMX创建FreeRTOS。这次来记录下使用Keil创建FreeRTOS。使用CMSIS-RTOS2将FreeRTOS封装好。
2025-01-10 22:33:18
837
原创 STMCubeMX 创建SD卡的DMA
使用CubeMX创建SD卡的DMA相对比较简单3.使用测试函数,改写发送和接收4.将栈改大,由0x400改成0x800
2025-01-04 11:16:18
322
原创 FreeRTOS的任务调度
1.启动任务调度器 vTaskStartSchedulervoid vTaskStartScheduler( void ){BaseType_t xReturn; /* Add the idle task at the lowest priority. */ #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) { /* Create the idle task, storing its handle in xIdleTaskHandle so it c
2024-12-20 22:39:53
408
原创 FreeRTOS的任务创建和删除
1.任务控制块typedef struct tskTaskControlBlock{ volatile StackType_t *pxTopOfStack; /*任务堆栈栈顶*/ #if ( portUSING_MPU_WRAPPERS == 1 ) /*MPU相关设置*/ xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE
2024-12-14 13:29:43
436
原创 SD卡的 FATFS移植使用
1.参考之前的SPI_FLASH的FATFS文件系统移植使用。记录下SD卡的FATFS文件系统移植。在diskio.c文件中做相应修改。
2024-12-08 16:19:54
431
原创 SD卡的使用
加入 stm32_eval_sdio_sd.c 这是官方写的。由于SD卡的管脚是固定的,标准库参考官方例程就行。2.加入在其他文件中定义的缺少的东西。1.首先需要正确移植SD卡的程序。3.加入SDIO.c的函数。
2024-12-08 16:15:50
316
原创 SPI_FLASH FATFS文件系统的移植使用
读和写注意都是4096个字节,因为FATFS的最小单位是4K。需要在diskio.c ffconf.h做一定修改。我用的是SPI_FLAH,则在原来基础上新增加。直接是读ID是否正确,正确的就返回OK。使用SPI_FLASH的写功能就行。按照官网说明,需要提供相应的接口。这里使用SPI_的FLASH功能。记录下FATFS文件系统的使用。2.在Keil里面正确安装路径。ffconf.h需要修改的地方。这里是获取了设备的状态。1.将源文件都下载,在main中进行测试。
2024-12-08 16:00:38
780
1
原创 互斥量的使用
优先级继承属性,使用优先级继承属性的互斥锁将 ”等待线程“ 的优先级转移给当前互斥锁的所有者(如果所有者的线程优先级较低)。如果没有优先级继承,等待互斥锁的高优先级线程将被中优先级线程阻塞,称为优先级反转。每当拥有互斥锁的线程获得互斥锁时,锁计数就会增加。当互斥量达到0时,互斥量实际上会被释放,其他线程可以获取互斥量。互斥锁健壮属性,如果拥有的线程被终止(通过osThreadExit或osThreadTerminate),健壮的互斥锁将被自动释放。非健壮互斥锁不会被释放,用户必须手动确保释放互斥锁。
2024-11-01 21:43:14
445
原创 内存池的使用
函数osMemoryPoolNew创建并初始化内存池对象,并在发生错误时返回指向内存池对象标识符或NULL的指针。内存池可以看作是固定大小和相等大小的可用(未使用)内存块的链表。将内存释放到池中(使用osMemoryPoolFree)只需将块重新锁定到列表中即可。内存池是线程安全的固定大小的内存块。由于是线程安全的,它们可以从线程和ISR访问。池中的内存只能在block_size的固定部分分配/释放。[in]block_count内存池中内存块的最大数量。[in]block_size内存块大小(字节)。
2024-10-25 23:38:21
372
原创 单片机死机后仿真不破坏现场的办法
这时候直接运行的话,是不会复位程序而是停留在之前的运行状态。如果程序死机,则会直接进入HardFault。进而可以分析死机原因。记录下当单片机死机后,进行仿真而不重新恢复的办法。此时在仿真界面可以看到是灰色的。官网的链接写的非常明白了。在command窗口输入。可以看到可以仿真运行了。
2024-10-23 20:47:10
484
原创 面相对象的思想编写驱动
在.h文件中,需要着重思考。按照AT24Cxx的特性,划分为硬件接口,IIC属性,AT24Cxx属性。将对象的所有属性都封装起来。以EEPROM存储芯片AT24Cxx为例。在写驱动的时候,一般写法。
2024-10-11 21:40:55
243
原创 创建FreeRTOS工程
在中间件选择为FreeRTOS2,Interface选择为CMSIS_V2。在适应RTE创建工程后,仿真的时候可以看到FreeRTOS的各种情况。这次来简单记录下使用STM32CubeMX创建FreeRTOS。上述做法是使用CubeMX创建的FreeRTOS工程。创建多个线程,包括名次,优先级,栈大小等属性。使用Keil创建后,可以看到各种属性已经添加。以后的用法就和CMSIS_RTOS2一样。也可以用Keil创建FreeRTOS工程。使用CubeMX时,选择时基为TIM6。对FreeTROS的各种配置。
2024-10-09 20:48:21
274
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅