- 博客(53)
- 收藏
- 关注
原创 STM32:定时器——舵机
本文介绍了如何通过STM32控制SG90舵机,并实现旋钮控制功能。舵机通过PWM占空比(2.5%-12.5%)控制0°-180°的旋转角度,对应500-2500微秒高电平。代码中配置TIM4生成PWM信号(72MHz主频,720分频,2000周期值),TIM1作为编码器读取旋钮值,通过公式计算占空比并设置比较寄存器值,最终实现旋钮对舵机角度的控制。程序包含初始化配置、编码器读取、占空比计算和PWM输出等关键步骤。
2026-06-15 21:58:41
383
8
原创 STM32:定时器--旋钮->旋转编码器!
本文介绍了增量型旋转编码器的工作原理及其在STM32上的应用实现。旋转编码器通过A、B两相输出方波信号,相位差90度来判断旋转方向和角度。文章详细说明了两种处理编码器信号的方法:GPIO中断方式和定时器编码器接口方式,并比较了它们的优缺点。接着,通过CubeMX配置实现了旋转编码器控制三色LED亮度和颜色切换的功能,包括定时器编码器模式设置、PWM输出配置和OLED显示进度条。最后提供了完整的代码实现,展示了如何读取编码器计数值、限制范围、更新PWM占空比以及通过按键切换LED颜色,并将亮度信息实时显示在O
2026-06-14 22:24:22
514
3
原创 STM32:定时器--PWM基础&呼吸灯
本文介绍了使用STM32的PWM(脉冲宽度调制)技术实现呼吸灯效果的方法。PWM通过调节占空比来模拟模拟信号,控制LED亮度变化。文章详细讲解了PWM的工作原理、输出比较模式、PWM模式及配置方法,并提供了基于STM32CubeMX的硬件配置步骤和完整代码实现。通过定时器TIM3的三个通道输出PWM信号,实现了单色和三色LED的渐明渐暗呼吸效果,其中关键代码包括PWM启动函数和动态调节比较寄存器值来改变占空比。该方案可扩展应用于电机转速控制等场景。
2026-06-14 14:46:15
607
7
原创 STM32:输入捕获&超声波模块
本文介绍了基于STM32的超声波测距模块实现方法。通过GPIO触发超声波发射,利用定时器的输入捕获功能精确测量回波高电平持续时间,实现距离计算。硬件连接上,PA11作为Trig控制端,PA10(TIM1通道3)用于Echo信号捕获。软件实现中,配置TIM1通道3为上升沿直接捕获,通道4为下降沿间接捕获,通过差值计算声波往返时间并转换为距离值(距离=时间×声速/2)。最终数据通过I2C驱动的OLED屏幕显示,配合自定义中文字库实现中文输出。关键点包括:输入捕获的硬件计时优势、双通道协同触发机制以及防止计数器溢
2026-06-13 14:11:45
266
7
原创 STM32:定时器从模式
本文介绍了STM32定时器的三种从模式工作方式:复位模式、门模式和触发模式。复位模式通过外部信号复位计数器并触发更新中断;门模式通过电平信号控制计数启停;触发模式通过边沿信号启动计数,常配合单脉冲模式使用。文章详细说明了各模式的配置方法,包括CubeMX设置和代码实现要点,并解释了如何通过中断标志位区分不同触发源。特别指出触发模式初始化时需手动清除更新中断标志位,避免误触发。这三种模式为定时器提供了灵活的外部控制方式,适用于不同应用场景。
2026-06-12 16:50:51
566
6
原创 STM32:定时器外部时钟与循迹模块
摘要:本文介绍了STM32F103定时器的外部时钟模式及其在传送带测速系统中的应用。定时器可通过输入通道(TI1/TI2)或外部触发器(ETR)接收信号,支持边沿检测和滤波功能。系统利用循迹模块检测黑白条纹产生方波信号,通过定时器计数计算传送带速度和距离。使用CubeMX配置TIM2的ETR时钟源,结合OLED显示数据,并通过输入滤波器消除抖动。代码实现了定时器中断处理、脉冲计数和速度计算功能,其中速度公式为:speed = (脉冲数差×条纹宽度)/时间间隔。
2026-06-10 22:42:12
481
9
原创 STM32:OLED原理
本文介绍了基于STM32通过I2C协议驱动CH1116芯片控制OLED屏幕显示的方法。主要内容包括:1. OLED显示原理:通过控制128×64分辨率屏幕上8页×128列的像素点实现显示;2. CubeMX配置:设置I2C1通信模块,调整时钟频率至72MHz;3. 关键代码实现:包含初始化、指令发送、显存管理(GRAM[8][128]数组)、像素设置和屏幕刷新等功能;4. 应用示例:在main函数中实现移动光点的动态显示效果。文章详细说明了OLED驱动的工作机制和STM32的编程实现方法,为嵌入式系统开发O
2026-06-10 13:49:42
381
6
原创 STM32:初始定时器TIM
本文介绍了STM32定时器的基本原理与应用,重点讲解了基本定时器实现计时功能的方法。通过恒定频率方波信号配合预分频器、自动重装载寄存器完成定时功能,其中预分频器和自动重装载寄存器的设置规则为n-1分频或m-1个脉冲。文章详细说明了CubeMX配置TIM4定时器的步骤,包括开启USART2、设置72MHz时钟等关键操作。最后总结了定时器相关函数的使用方法,并介绍了定时器更新中断的配置要点,强调影子寄存器的工作机制以及中断回调函数的注意事项。
2026-06-07 21:30:12
333
9
原创 STM32:时钟树与时钟源
摘要:单片机时钟系统如同人体的心脏和血管,时钟源产生信号,通过时钟树分发给各部件。在STM32中,常用CubeMX配置高速晶振时钟源,并将HCLK设为72MHz。时钟信号对串口、IIC/SPI、定时器和ADC等外设至关重要。STM32采用AHB总线架构,HCLK直接为处理器内核、内存和DMA提供时钟信号。时钟输出配置是确保系统时序精度的关键环节。
2026-06-07 17:06:54
402
2
原创 STM32:IIC的中断,DMA&状态机编程
本文将介绍STM32中IIC通信的中断与DMA模式实现方法。相比轮询模式,中断模式通过状态机编程实现非阻塞传输,发送/接收单字节数据后CPU可执行其他任务,待中断触发再处理下一字节。DMA模式则完全由DMA控制器搬运数据,进一步解放CPU资源。文章详细展示了CubeMX配置步骤、中断/DMA函数的使用方法,以及通过状态机拆分AHT20温湿度传感器的测量流程(指令发送、数据读取、解析三阶段),并提供了完整的代码实现方案,包括回调函数处理和数据解析逻辑。两种模式均能有效提升系统效率,开发者可根据实际需求选择。
2026-06-07 14:45:57
417
6
原创 STM32:IIC与温湿度传感器(轮询模式)
本文介绍了基于STM32的IIC通信实现AHT20温湿度传感器数据读取的方法。主要内容包括: IIC通信原理:采用主从模式的两线制同步通信(SDA数据线和SCL时钟线),支持多设备连接,通过设备地址识别从机。 开发环境配置: 使用STM32CubeMX配置I2C和USART外设 创建专用的aht20.c/h驱动文件 核心代码实现: 初始化函数AHT20_Init():发送校准命令 数据读取函数AHT20_Read():发送测量指令,接收并解析6字节数据 温湿度计算:按照手册进行数据位操作和公式转换 主程序流
2026-06-06 13:58:08
272
4
原创 STM32:蓝牙模块
本文介绍了如何利用STM32单片机通过蓝牙控制三色LED灯的实现方法。主要内容包括:1)蓝牙通信原理,区分经典蓝牙和低功耗蓝牙(BLE)的应用场景;2)使用CubeMX配置USART3串口和DMA,设置9600波特率;3)实现蓝牙数据接收与处理,定义数据包格式(包含包头0xAA、长度、指令和校验和);4)通过校验和验证数据完整性后,解析指令控制红、绿、蓝LED的亮灭状态(0x01-0x03对应灯号,0xFF/0x00控制开关)。文章提供了完整的代码实现,并建议在复杂场景中增加数据缓冲区以提高稳定性。
2026-06-05 12:02:55
383
6
原创 STM32:串口--DMA
本文介绍了STM32中DMA(直接内存访问)技术在串口通信中的应用。主要内容包括:1. DMA基本概念,可通过硬件在寄存器和内存间搬运数据,减轻CPU负担;2. 使用CubeMX配置USART2的发送/接收DMA通道;3. 普通DMA定长收发函数(HAL_UART_Transmit_DMA/Receive_DMA)及对应回调函数;4. 重点讲解DMA+空闲中断实现不定长数据接收,通过HAL_UARTEx_ReceiveToIdle_DMA函数和RxEventCallback回调函数,配合关闭DMA传输过半中
2026-06-04 21:26:46
7057
7
原创 STM32:串口--中断模式
本文介绍了STM32串口通信的中断模式实现方法。主要内容包括:1. 串口工作原理,分析HAL_UART_Transmit/Receive函数的数据寄存器操作过程;2. 中断模式优势,相比轮询模式可避免CPU堵塞;3. 具体实现步骤:通过CubeMX配置USART2中断,使用HAL_UART_Transmit_IT/Receive_IT函数,在回调函数HAL_UART_RxCpltCallback中处理接收数据;4. 完整代码示例,展示如何通过串口中断控制RGB LED。中断模式能提高系统效率,适合实时性要求
2026-06-03 16:34:50
766
7
原创 STM32:串口--轮询模式
在生活中,串口无处不在,常见的有网线接口,USB等等,今天来介绍单片机中常用的串口--TTL串口。因此,我们可以用串口将stm32与电脑进行通信,即用电脑给stm32发送指令,用电脑接收stm32发送的数据从而调试stm32程序。
2026-06-02 22:58:07
542
9
原创 STM32:外部中断
本文介绍了STM32中GPIO外部中断(EXTI)的实现方法,以按键触发LED灯状态切换为例。主要内容包括:(1)通过CubeMX配置PB12为下降沿触发的外部中断模式,并开启NVIC中断控制器;(2)在中断处理函数EXTI15_10_IRQHandler中添加按键消抖和LED状态切换逻辑;(3)强调中断优先级设置的重要性,指出HAL_Delay在中断中的使用限制。文章指出实际项目中应避免在中断内执行耗时操作,确保快速响应。通过外部中断实现了在延时函数执行期间仍能响应按键事件的功能。
2026-05-31 16:54:07
333
10
原创 类和对象(上)
本文介绍了C++中类的核心概念,主要包括:1. 类的基本格式与访问限定符(public/private/protected);2. 类域的作用及成员函数的定义方式;3. 类的实例化过程与对象创建;4. 对象大小的计算规则(内存对齐原则);5. this指针的工作原理及其在成员函数中的隐式使用。通过对比C语言结构体,重点阐述了C++类在封装性上的优势,包括将数据与操作结合、访问控制等特性,并详细说明了类成员函数和变量的定义规范、命名约定以及内存分配机制。
2026-05-12 17:05:39
518
7
原创 C++入门(二)
本文介绍了C++中的四个重要特性:1.函数重载:允许同名函数通过参数类型、个数或顺序不同进行区分,但返回类型不同不构成重载;2.引用:变量的别名,与指针相比更安全高效,必须初始化且不能改变引用对象,常用于函数参数传递;3.inline内联函数:编译时展开以避免函数调用开销,适合短小频繁调用的函数;4.nullptr:C++11引入的空指针常量,比NULL更安全明确。这些特性共同提升了C++的编程效率和安全性。
2026-05-10 19:20:44
565
6
原创 C++入门(一)
本文主要介绍了C++中的命名空间、基本输入输出和缺省参数三个核心概念。命名空间用于解决命名冲突问题,可通过namespace定义和使用,支持嵌套定义和多文件合并。基本输入输出介绍了iostream库中的cin/cout对象和流操作符的使用方法。缺省参数部分讲解了全缺省和半缺省参数的语法规则,以及函数声明与定义分离时的注意事项。这些特性共同构成了C++基础编程的重要部分,为开发者提供了更灵活和安全的编程方式。
2026-05-05 15:16:56
878
8
原创 C语言--队列
本文介绍了队列的基本概念和链表实现方法。队列是一种先进先出(FIFO)的数据结构,包含队头和队尾两端操作。文章详细讲解了用链表实现队列的8个核心操作:初始化、销毁、队尾插入、队头删除、获取队头/队尾数据、获取队列大小以及判空操作。每个操作都给出了具体实现代码,并考虑了特殊情况的处理。实现中使用了头尾指针和size变量来高效管理队列状态。这种链表实现相比数组实现更灵活,能避免数组实现的容量限制问题。
2026-04-05 12:09:35
294
7
原创 C语言--栈的实现
本文介绍了C语言中栈数据结构的实现方法。重点讲解了基于数组的栈实现方案,包括初始化、销毁、入栈、出栈等核心操作。文章对比了数组和链表两种实现方式的优缺点,数组实现具有固定/动态容量、内存连续等特性,适用于已知最大容量的场景。详细展示了栈操作的代码实现,包括动态扩容机制、边界检查等关键细节。最后提供了完整的栈实现代码,包含头文件和源文件,涵盖了栈的基本功能如获取栈顶元素、检测栈空状态等。该实现注重内存管理和错误处理,为C语言开发者提供了可靠的栈数据结构参考方案。
2026-04-03 11:13:11
343
3
原创 C语言:预处理详解
本文总结了C语言预处理指令的使用方法,包括预定义符号(如__FILE__、__LINE__等)、宏定义(常量定义、带参数宏定义)、#与##运算符、条件编译以及头文件包含等内容。重点讲解了宏定义的注意事项(如括号使用、副作用参数)和宏与函数的区别,并介绍了条件编译的多种形式(如#if、#ifdef等)以及头文件的两种包含方式。这些预处理技巧能提高代码的灵活性和可维护性,是C语言编程中的重要知识点。
2026-03-03 17:08:26
798
2
原创 python基础语法 7
本文介绍了Python文件操作的基本知识,包括文件路径表示、常见文件操作方法以及中文编码处理。主要内容涵盖:1)使用open()函数打开文件的不同模式(读/写/追加);2)文件读写操作(write/read/readlines等方法);3)文件编码问题(GBK与UTF-8)及解决方案;4)推荐使用with语句自动管理文件关闭。文章还特别说明了路径分隔符的使用注意事项,以及处理文件时换行符和编码问题的常见解决方案。
2026-02-07 17:51:22
552
4
原创 python基础语法 6
本文介绍了Python字典的基本概念和操作。字典是一种存储键值对的数据结构,通过键可以快速访问对应的值。文章详细讲解了字典的创建和初始化方法,包括使用{}或dict()创建空字典,以及初始化键值对的语法格式。常见操作包括:使用[]新增/修改元素,pop()删除元素,in和[]查找元素,for循环遍历字典,以及keys()、values()、items()获取键值信息。最后说明了字典key必须是可哈希的类型(如整数、字符串等),而列表和字典等不可哈希类型不能作为key。全文系统地介绍了字典的基本使用方法。
2026-02-06 17:38:53
521
1
原创 python基础语法 5
本文介绍了Python中列表和元组的基本操作。列表使用[]定义,支持增删改查等操作,可通过下标访问、切片、遍历等方式操作元素。元组使用()定义,元素不可修改,仅支持读取操作。文章详细讲解了列表的初始化、访问、切片、遍历、增删元素、查找修改等常见操作,并比较了列表与元组的异同。同时介绍了连接列表的多种方法,包括+运算符、extend方法和+=运算符。
2026-02-03 18:39:12
1509
5
原创 python基础语法 4
本文介绍了Python函数的基本概念和使用方法。主要内容包括:1.函数定义语法与调用方式;2.函数参数的类型(形参/实参)及传递规则;3.函数返回值的多种形式;4.变量作用域规则及global关键字用法;5.函数调用的链式调用和嵌套调用;6.递归函数的基本原理;7.参数默认值和关键字参数的使用。文章通过具体示例详细说明了每个概念,并对比了Python与其他语言在函数特性上的差异。最后简要介绍了函数栈帧的概念和递归与循环的实现区别。
2026-02-02 10:18:45
1017
1
原创 python基础语法 3
本文介绍了Python中的基本控制结构:顺序执行、条件语句和循环语句。顺序执行是默认从上到下的执行方式;条件语句包括if、if-else和if-elif-else三种形式,强调缩进对代码块的影响;循环语句包含while和for两种循环,并展示了range函数的用法。此外还介绍了pass空语句和break/continue控制语句的作用。通过多个实例演示了如何运用这些结构解决实际问题,如奇偶判断、阶乘计算等。文章结构清晰,示例丰富,适合Python初学者掌握基础控制流程。
2026-01-25 11:23:23
765
3
原创 python基础语法 2
本文介绍了Python编程中的基础知识点:1. 注释的两种写法(#和三引号)及批量注释方法;2. 输入输出函数(print和input)的使用,特别强调input返回值为字符串类型,进行运算时需要类型转换;3. 运算符的分类和使用:包括算术运算符(/、%、**、//等)、关系运算符(比较规则和浮点数比较注意事项)、逻辑运算符(and/or/not)以及赋值运算符(普通赋值、链式赋值、多元赋值和复合赋值)。文章还通过具体代码示例演示了各知识点的实际应用,如字符串格式化、变量交换等常用操作。
2026-01-22 16:50:27
1009
1
原创 python基础语法 1
本文介绍了Python编程中的基础概念,包括常量、表达式、变量和数据类型。常量是固定不变的值,表达式是数学算式,运算符用于运算。变量是可变化的数据容器,命名需遵循特定规则。Python支持多种数据类型,如整数、浮点数、字符串和布尔值,且具有动态类型特性,变量类型可在运行时改变。文章还对比了Python与C/C++/Java在变量定义和类型处理上的差异,并简要提及了类型标注的改进方法。
2026-01-20 13:09:22
1144
原创 单链表基础全解析
本文介绍了单链表的基本概念和实现方法。单链表由多个节点组成,每个节点包含数据和指向下一节点的指针。文章详细讲解了单链表的各项操作实现,包括创建节点、打印链表、头插尾插、头删尾删、查找节点、指定位置插入/删除节点以及销毁链表等。通过结构体指针实现节点间的逻辑连接,并提供了完整的C语言代码实现,包括头文件定义、功能函数实现和测试用例。所有操作都考虑了空链表、单节点链表等特殊情况,确保代码的健壮性。
2026-01-18 13:56:56
596
3
原创 2道经典数组题
本文介绍了两种数组操作的实现方法:1) 移除数组中指定值的元素,使用双指针法原地修改数组;2) 合并两个有序数组,采用从后往前比较的方法。第一种方法通过快慢指针将不等于目标值的元素前移,返回新长度。第二种方法比较两个数组末尾元素,较大者放入合并数组末尾,处理剩余元素。两种方法都满足O(1)空间复杂度要求,提供了高效的原地操作解决方案。文章包含完整代码实现和详细思路解析。
2026-01-16 11:22:34
312
1
原创 顺序表的应用1:通讯录
本文实现了一个基于顺序表的通讯录管理系统。系统采用模块化设计,包含顺序表操作(SeqList)、通讯录功能(Contact)和主程序(test)三个模块。顺序表模块实现了初始化、增删改查等基本操作;通讯录模块在此基础上封装了联系人管理功能,包括添加、删除、修改、查找和展示联系人信息;主程序提供用户交互界面。系统通过结构体存储联系人信息,支持数据持久化保存到文件,具有完整的增删改查功能。该实现展示了顺序表在联系人管理系统中的实际应用,体现了数据结构与程序设计的结合。
2026-01-14 17:09:05
250
2
原创 动态顺序表
本文介绍了顺序表的基本概念和实现方法。顺序表是线性表的一种,底层基于数组实现,支持增删查改操作。文章详细讲解了动态顺序表的实现过程,包括初始化、销毁、插入(头插/尾插/指定位置插入)、删除(头删/尾删/指定位置删除)以及查找等核心操作。通过结构体定义顺序表的数据结构,使用动态内存管理实现容量扩展,并提供了完整的C语言实现代码。文中还对比了静态顺序表和动态顺序表的区别,强调了动态顺序表的实用性。最后给出了测试用例,展示了顺序表各项功能的使用方法。
2026-01-11 12:16:27
823
2
原创 C语言:文件操作
本文系统介绍了C语言文件操作相关知识,主要包括:1. 文件分类:程序文件和数据文件;2. 文件操作基本流程:打开、使用、关闭;3. 顺序读写函数:fputc/fgetc、fputs/fgets、fprintf/fscanf等;4. 随机读写函数:fseek、ftell、rewind;5. 文件结束判定:feof和ferror的使用;6. 文件缓冲区概念及验证。文章详细讲解了各种文件操作函数的使用方法和注意事项,并提供了丰富的代码示例,适合C语言学习者系统掌握文件操作相关知识。
2026-01-08 13:27:32
1012
2
原创 C语言:动态内存管理
本文介绍了C语言中动态内存分配的关键概念和函数使用。主要内容包括:malloc函数申请内存空间并检查空指针;free函数释放内存及避免野指针的注意事项;calloc函数与malloc的区别在于自动初始化内存;realloc函数调整内存大小的三种情况及使用方法。文章还详细列举了6种常见错误:NULL指针解引用、越界访问、释放非动态内存、部分释放、重复释放和内存泄漏,并给出了相应解决方案。通过合理使用动态内存分配函数和避免常见错误,可以实现灵活高效的内存管理。
2025-12-24 16:04:18
1032
1
原创 C语言内存函数
本文介绍了四种常用内存函数:memcpy(内存拷贝)、memmove(内存移动)、memset(内存设置)和memcmp(内存比较)。这些函数与字符串函数类似,但针对内存块操作,可处理各种数据类型。memcpy用于非重叠内存拷贝,memmove可处理重叠内存情况。memset以字节为单位设置内存值,memcmp比较内存内容。文中通过代码示例详细说明了各函数的使用方法及注意事项,特别强调了字节单位操作的特点。掌握这些内存函数能有效简化代码编写,提升程序效率。
2025-12-22 18:03:40
980
1
原创 C语言:联合体/共用体
本文介绍了C语言中联合体(union)的相关知识。主要内容包括:联合体的定义与结构体类似但成员共享内存;联合体类型的声明和变量定义方法;联合体变量的初始化规则(默认初始化第一个成员或C99后指定初始化);与结构体的对比(内存布局和初始化差异);联合体大小的计算方法(考虑最大成员和内存对齐);以及联合体的实际应用场景,如节省内存空间、存储传感器数据、判断机器字节序等。联合体通过共享内存的特性,在特定场景下能有效节省内存空间。
2025-12-17 16:06:41
770
原创 C语言:枚举体
枚举类型是一种将离散值定义为命名常量的数据类型。其特点包括:1)通过enum关键字声明,默认从0开始自动编号,也可手动赋值;2)枚举常量具有类型检查,比#define更安全;3)能提高代码可读性,便于维护。主要应用场景包括:状态表示(如设备状态)、错误码管理、互斥选项配置以及位掩码实现多选功能。枚举类型解决了数字含义模糊的问题,使代码更清晰规范。在C/C++中,枚举变量只能被枚举常量赋值,不能直接使用整数值。
2025-12-16 17:16:59
602
原创 C语言:结构体(下)
本文介绍了C语言中结构体数组、自引用、内存对齐和位段的相关知识。主要内容包括:1.结构体数组的定义、初始化和排序应用;2.结构体自引用在链表中的应用;3.结构体内存对齐规则及计算示例,分析了内存对齐的原因和优化方法;4.位段的定义、内存分配规则及注意事项,指出位段的跨平台问题。文章通过具体代码示例详细说明了结构体在实际编程中的应用技巧和内存管理方法。
2025-12-14 20:04:36
2206
1
原创 字符串函数
本文详细介绍了C语言中常用的字符串处理函数,包括strlen、strcpy、strcat、strcmp等基础函数及其变体strncpy、strncat、strncmp,以及strtok、strstr、strerror等特殊用途函数。每个函数都从定义、原型、使用方法和注意事项等方面进行说明,并配有示例代码。特别强调了字符串必须以'\0'结尾的重要性,以及目标空间大小、可修改性等关键点。文章还解释了strerror和perror的区别,帮助开发者更好地处理错误信息。
2025-12-10 20:27:16
1353
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅