- 博客(46)
- 收藏
- 关注
原创 STM32(二十九)——读写、擦除FLASH
Store_Save= 保存数据到 FLASH必须先擦除,再写入数据来源是 RAM,写入目标是 FLASH掉电不丢失靠 FLASH,不是 RAM这是 STM32 最标准、最稳定的掉电保存方案只清数据,不清0xA5A5。清完后:FLASH 依然是已初始化状态。下次开机:直接读取清零后的数据,不会重复执行格式化流程。
2026-03-22 00:18:29
430
原创 STM32(二十八)——FLASH闪存
•STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程•读写FLASH的用途:利用程序存储器的剩余空间来保存掉电不丢失的用户数据通过在程序中编程(IAP),实现程序的自我更新•在线编程()用于更新程序存储器的全部内容,它通过JTAGSWD协议或系统加载程序(Bootloader)下载程序•在程序中编程()可以使用微控制器支持的任一种通信接口下载程序。
2026-03-21 15:18:47
624
原创 STM32(二十七)——独立看门狗&窗口看门狗
设置为1000ms的喂狗时间,采用16分频,1000 = (1/400000 )* (PL +1)* 16 *1000,算出PL为2499.判断看门狗的复位标志位是否置1,如果置1了要手动清除标志位RCC_ClearFlag()。解锁 → 分频 → 重装值 → 喂狗 → 启动。计数器从这个值往下减,减到 0 就复位。WWDG挂载在APB1 总线上,使用前。,因为 WWDG 一旦开启就关不掉。把窗口看门狗寄存器恢复到默认值。把重装载值重新装进计数器,判断是否快要触发复位了。,否则寄存器无法写入。
2026-03-20 00:08:11
512
原创 STM32(二十六)——WDG看门狗
•WDGWatchdog)看门狗•看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性•看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号•STM32内置两个看门狗独立看门狗(IWDG):独立工作,对时间精度要求较低窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用。
2026-03-19 00:11:46
506
原创 STM32(二十五)——修改主频、睡眠模式、停机模式、待机模式
可右击文件,点击第五个Open Containing Folder,这个是已经修改过的了,原本是72MHZ,现在修改为36MHZ。如果文件上有个小钥匙的话,可以到文件存储地址中更改文件属性。__WFE():让 CPU 进入休眠,直到有事件发生才唤醒。__WFI():让 CPU 进入休眠,直到有中断来才唤醒。
2026-03-18 12:05:55
921
1
原创 STM32(二十四)——PWR电源控制
•PWR)电源控制•PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能•可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务•低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间PVD = 电源电压检测器,是芯片的电源预警机制。
2026-03-16 13:02:42
743
原创 STM32(二十三)——读写备份寄存器&实时时钟
之后三句是BKP的初始化,然后主循环里循环执行的是,先获取键码,如果按键按下,就变换一下测试数据,把数据分别写入到BKP的DR1和DR2中,再在OLED显示写入的数据。在按键没有按下时,也不断读取BKP的DR1和DR2,刷新显示到OLED上。把自定义的时间数组转换成标准时间戳,写入 RTC 硬件计数器,完成 RTC 时间配置。:RTC 寄存器写入需要时间,必须等待操作完成,否则会出现时间设置失败。(从 1970 年 1 月 1 日 0 点开始的总秒数),写入时间戳后,RTC 会每秒自动加 1,实现计时。
2026-03-15 23:26:26
895
原创 STM32(二十二)——时间戳、BKP备份寄存器、RTC实时时钟
本文介绍了Unix时间戳、BKP备份寄存器和RTC实时时钟三个关键概念。Unix时间戳是从1970年1月1日开始的秒计数,C语言的time.h模块提供了相关转换函数。BKP备份寄存器可在主电源断开时由备用电池供电保持数据,具有防篡改检测功能。RTC实时时钟提供独立计时功能,通过32位计数器和预分频器实现精确计时,支持多种时钟源和低功耗唤醒机制。三者共同构成了计算机和嵌入式系统中的时间管理和数据保护机制。
2026-03-10 23:54:33
621
原创 STM32(二十)——SPI、W25Q64
•W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景•存储介质:Nor Flash(闪存)•时钟频率:(Quad SPI)•存储容量(24位地址):W25Q40:W25Q80:W25Q16:W25Q32:W25Q64:W25Q128:W25Q256:•STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担•可配置8位/16。
2026-03-09 13:22:46
776
原创 STM32(二十一)——SPI软/硬件读写W25Q64
SS、CLK、DOSI配置为推挽输出,DISO配置为上拉输入,初始之后SS置为高电平默认不选中从机,使用SPI模式0将SCK置为低电平。这里采用的是事后等待,读取数据时其他操作都已完成,芯片不处于忙碌状态,所以无须进行等待。发送读寄存器1的指令,用0xFF交换数据,按位与将最后一位取出,防止程序卡死加入超时退出。写使能,发送指令02,再发送3个字节的地址,发送数据,事后等待。发送读取指令,发送地址,将交换出来的数据放在数组里。写使能,发送4KB擦除指令,再发送地址。*DataArray:数组指针。
2026-03-08 16:46:07
366
原创 STM32(十九)——软件/硬件IIC读写MPU6050
起始信号 → 等待EV5 → 发设备地址(写) → 等待EV6 → 发寄存器地址 → 等待EV8_2 → 重复起始信号 → 等待EV5 → 发设备地址(读) → 等待EV6_1 → 禁用应答 → 发送停止信号 → 等待EV7 → 读取数据 → 重新使能应答 → 返回数据。起始信号 → 等待EV5 → 发设备地址(写) → 等待EV6 → 发寄存器地址 → 等待EV8 → 发数据 → 等待EV8_2 → 停止信号。定义Ackbit用来接收应答位,主机释放SDA,主机读取SDA,返回Ackbit。
2026-02-16 11:50:32
1536
原创 STM32(十八)——IIC通信、MPU6050、IIC外设
•MPU6050是一个6轴姿态传感器,可以测量芯片自身XYZ轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景•3轴加速度计():测量XYZ轴的加速度•3轴陀螺仪传感器(Gyroscope):测量XYZ轴的角速度加速度计:具有静态稳定性,动态不稳定陀螺仪:具有动态稳定性,不具有静态稳定性。•STM32内部集成了硬件I2C。
2026-02-12 23:31:18
1082
1
原创 STM32(十七)——串口通信
串口触发中断 --> 检查标志位 --> 将串口接收的数据放在RxData --> 将串口接收标志位置1 --> 手动清除中断标志位。是 printf 的 “输出管道”,我们把管道的出口从 “控制台” 换成 “串口”,就实现了 printf 的串口重定向。这两个函数只在 USART 同步模式下有用(比如模拟 SPI 通信),异步模式(普通串口)无需调用,调用了也无效;检查 “某中断是否触发”(需同时满足:标志位置 1 + 中断使能)中断服务函数中判断中断来源。选用串口1,串口1TX对应的是PA9。
2026-02-09 23:57:45
1064
原创 STM32(十六)——USART串口通信
•USART)通用同步异步收发器•USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里•自带波特率发生器,最高达4.5Mbits/s•可配置数据位长度(8/9)、停止位长度(•可选校验位(无校验奇校验偶校验)•支持同步模式、硬件流控制、DMA、智能卡、IrDALIN•USART资源:USART1USART2。
2026-02-06 17:08:26
1419
原创 STM32——DMA数据转换、DMA+AD多通道(十五)
外部站点:地址是ADC1的DR寄存器(ADC转化结果存放在这个寄存器)、数据带宽16位、地址不递增。让数组A的元素++,显示两个数组的元素值,延时一段时间,然后在显示更新后的值。是否置 1(即某个事件是否发生,如传输完成、半传输、错误),返回标志位状态。是否置 1(即某个中断事件是否发生,且该中断已开启),返回中断状态。(DMA 的核心计数器,传输 1 个数据,计数器自动减 1)。配置存储器站点地址,数据宽度:以字节传输,地址是否自增:是。配置外设站点地址,数据宽度:以字节传输,地址是否自增:是。
2026-02-03 22:16:50
1037
原创 STM32——DMA(十四)
•DMA)直接存储器存取•DMA可以提供外设寄存器和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源•12个独立可配置的通道:DMA17个通道),DMA25个通道)•每个通道都支持软件触发和特定的硬件触发,从存储器转运到存储器用软件触发,外设寄存器和存储器之间转运用硬件触发。•DMA资源:DMA17个通道)
2026-02-02 22:40:30
894
原创 STM32——ADC、多通道转换(十三)
•ADC)模拟数字转换器•ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁•12位逐次逼近型ADC1us转换时间•输入电压范围:0~3.3V,转换结果范围:0~4095•18个输入通道,可测量16个外部和2个内部信号源•规则组和注入组两个转换单元•模拟看门狗自动监测输入电压范围•ADC资源:ADC1ADC210个外部输入通道。
2026-02-01 23:59:03
1258
原创 STM32——PWM驱动舵机和直流电机、测量PWM频率和占空比、旋转编码器测速(十二)
基本和上面一样,改用TIM2的通道3,对应的GPIO口是PA2,然后是为了方便配置占空比,直接将ARR配置为100。将读取CNT的函数放在定时中断函数里,定时去更新CNT的数值,就是在1内旋转编码器旋转了多少,这个数值和速度相同。是最大滤波,适合工业环境 / 杂波多的场景,若外部 PWM 信号干净,可减小滤波值(如 0x4)提升响应速度。通过按键控制舵机的旋转角度,现象是按一下按键舵机旋转30°,就是通过按键去变化PWM的占空比。这个使用的是测周法,计数频率是1MHZ,除以CNT1就是PWM的频率。
2026-02-01 17:11:40
1165
原创 STM32——输入捕获、编码器接口(十一)
•IC)输入捕获•输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数•每个高级定时器和通用定时器都拥有4个输入捕获通道•可配置为PWMI模式,同时测量频率和占空比可配合主从触发模式,实现硬件全自动测量。
2026-01-31 16:51:25
1094
原创 数据结构——用数组实现栈(十七)
bool IsEmpty(struct Node* pStack)//判断栈是否为空。判断传入的栈指针是否为空。如果为空,直接返回,避免空指针解引用。如果栈已满,直接返回,避免数组越界。),直接返回,避免非法操作。不是空就返回获取当前尾节点。:可用于记录数组当前有效元素的索引位置或其他用途。将栈顶指针后移一位,指向下一个空闲位置。为头节点分配内存,需检查分配是否成功(:固定长度的整型数组,数组大小由宏。该函数接受一个指向栈顶节点的指针。函数检查栈是否为空。,通常表示空栈或基础索引。类型指针,失败时返回。
2026-01-30 23:56:48
1059
原创 STM32——TIM输出比较、PWM(十)
•OC)输出比较•输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形•每个高级定时器和通用定时器都拥有4个输出比较通道•高级定时器的前3个通道额外拥有死区生成和互补输出的功能。
2026-01-29 21:40:04
788
原创 STM32标准库——定时器中断、外部时钟(九)
TIM2的的中断函数是TIM2_IRQHandler(void),因为我们要在显示屏中显示Num,所以可以直接将这个中断函数放在main文件中,如果放在定时器的文件中,那么就extern uint16_t Num;封装 TIM_GetCounter (TIM2) 为独立函数,方便工程中任意位置直接调用获取 TIM2 当前计数值,无需重复写原函数,简化代码调用,提升可读性和复用性。开启 TIM2 时钟,APB1 外设默认关时钟,不开则后续配置无效。向上计数,从 0 到预设值溢出触发中断,定时中断默认模式。
2026-01-29 16:21:17
796
原创 STM32——TIM定时器、定时中断、RCC时序(八)
TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型注:总定时 = 所有 (PSC+1) 乘一起 × 所有 (ARR+1) 乘一起 ÷ 输入时钟频率(单级 / 级联都适用)的核心简化算法。
2026-01-29 00:42:06
1071
原创 STM32——旋转编码器计次(七)
一、简介旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向类型:机械触点式/霍尔传感器式/光栅式本篇采用的是机械触点式的旋转编码器。
2026-01-28 17:12:42
1062
原创 STM32——EXTI外部中断(六)
EXTI(Extern Interrupt)外部中断EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序支持的触发方式:上升沿/下降沿/双边沿/软件触发支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断,如A0、B0不能同时触发中断,A0、B1能同时触发中断。通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒。
2026-01-27 16:31:32
1764
原创 STM32——OLED显示屏(五)
•OLED):有机发光二极管•OLED显示屏:性能优异的新型显示屏,具有功耗低、相应速度快、宽视角、轻薄柔韧等特点•0.96寸OLED模块:小巧玲珑、占用接口少、简单易用,是电子设计中非常常见的显示屏模块供电:3~5.5V,通信协议:I2C/SPI,分辨率:128*64。
2026-01-26 23:30:14
965
原创 STM32标准库——控制驱动LED灯、蜂鸣器(四)
将前面建立的工程模板复制重命名,在新的工程文件夹中建立System文件夹,将STM32入门教程资料\程序源码\STM32Project-有注释版\1-3 Delay函数模块中的延时函数复制到System文件夹中,并在工程中添加分组、文件、文件地址。在main文件中调用相关.h文件,定义一个全局变量uint8_t KeyNum = 0用来装按键的状态,在main中调用按键和LED的启动函数。STM32 的外设默认是关闭时钟的,必须通过该函数手动开启对应外设的时钟,否则外设无法工作。
2026-01-26 22:23:58
1178
原创 STM32——GPIO(三)
•GPIO)通用输入输出口•可配置为8种输入输出模式•引脚电平:0V~3.3V,部分引脚可容忍5V•输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等•输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。
2026-01-25 15:45:40
1206
原创 数据结构——快慢指针(十五)
void AddToEnd(struct Node* head, int iData)//尾添加。检测单向链表是否存在环。快指针每次移动两步,慢指针每次移动一步,若存在环,两者最终会相遇。bool QuiKSlow(struct Node* head)//检测链表是否有环。让链表变成环,让尾节点的后续指针指向第二个节点,形成一个环。形成了一个环,检测函数返回了true表示有环状。如果是,函数直接返回,避免后续操作引发错误。指向头节点的前驱节点(即链表的尾节点)。(假),避免后续操作引发错误。
2026-01-23 23:38:17
1218
原创 数据结构——双向链表的查询、插入、删除、释放(十四)
void InsertByData(struct Node* stHead, int* iCount, int iValue, int iData)//在指定的数据前面增加一个节点。void InsertByIndex(struct Node* stHead, int* iCount, int iIndex, int iData)//指定下标位置插入节点。void DaleteByIndex(struct Node* stHead, int* iCount, int iIndex)//删除指定下标节点。
2026-01-23 10:52:55
1542
原创 数据结构——双向循环链表的建立、添加、遍历(十三)
双向循环链表是链表的一种特殊形式,每个节点包含两个指针域:pPre指向直接前驱节点,pNext指向直接后继节点。链表的头节点的pPre指向尾节点,尾节点的pNext指向头节点,形成一个闭环。
2026-01-22 16:55:55
873
原创 STM32F103C8T6——简介(一)
本篇开始DLGXY将记录学习STM32F103C8T6库开发的笔记,学习方式是主要观看B站的江协科技、铁头山羊的视频。学习过程中可以利用AI软件进行铺助学习,比如用自己的语言讲述某个知识点,让AI判断我们自己的理解是否有误,以此来加深印象。STM32F103C8T6是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M3内核的32位微控制器,属于STM32F1系列中的“中等容量”产品线。
2026-01-21 23:37:59
1811
原创 数据结构——双向链表的合并(十二)
void HeBing(struct Node** pHA, struct Node** pEA, int* pCA, struct Node** pHB, struct Node** pEB, int* pCB)//接入。void HeBing(struct Node** pHA, struct Node** pEA, int* pCA, struct Node** pHB, struct Node** pEB, int* pCB)//接入。if (*pHead == *pEnd)//只有一个节点。
2026-01-19 23:09:51
1337
原创 数据结构——双向链表的删除(十一)
void DelteNode(struct Node* pTemp)//删除节点//是不是头//单节点链表//多节点链表else//记录头//头往下走//头前设置为NULL//释放free(pT);//尾删除//记录尾//尾往前走//尾后设置为NULL//释放free(pT);//节点减一//中间删除else//链接前后节点//前节点指向后节点。
2026-01-16 17:25:33
1053
原创 数据结构——双向链表的插入、查询、修改(十)
void InsertNodeByIndex(int iIndex, int iCount, int iData)//指定下标添加N个节点。void InsertNodeByData(int iValue, int iData)//在指定的数据前插入节点。中间位置添加:首先定位到要插入的位置,循环创建并插入新节点,维护前后节点的指针关系,更新全局节点计数器。这个代码实现了一个链表节点的下标查询功能,通过传入的索引值返回链表中对应位置的节点指针。//指定位置前一个节点与新节点相连。
2026-01-15 22:41:42
964
原创 数据结构——双向链表的建立(九)
双向链表是一种链式数据结构,每个节点包含两个指针:一个指向前驱节点(pPre),一个指向后继节点( pNext)。与单向链表相比,双向链表支持双向遍历,但需要额外的空间存储指针。
2026-01-14 22:26:25
776
原创 数据结构——修改单向链表有空头(八)
这里将前节点放在 pWai,后节点放在pNei,设置两个循环,pNei放在内循环,先将第一个节点放在pWai,然后在内循环中判断前节点与后面的节点数据是否重复,有重复的就删除,没有了就进入下一个外循环pWai向后移一位。下标的范围0~stHead.iData,循环定位指定下标前一个节点-->记录,将指定节点扣下来,让前一个节点指向指定节点的下一个节点,然后就可以删除指定节点。void DeleteByData(struct Node* stHead, int iValue)//删除全部指定数据节点。
2026-01-11 23:45:00
1035
原创 数据结构——建立单向链表有空头(七)
NULL在C语言中,单向链表的节点通常通过结构体定义:int iData;//数据域//指针域,指向下一个节点创建空头stHead:空头的数据域用来计节点数据个数,指针域用来指向下一个节点。
2026-01-10 21:45:39
911
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅