- 博客(54)
- 收藏
- 关注
原创 STM32——定时器
本文介绍了STM32定时器的学习框架和基础知识。主要内容包括:1.定时器概述,对比了软件定时和硬件定时的优劣;2.STM32定时器的分类和特性,重点介绍了F1系列基本/通用/高级定时器的区别;3.详细讲解了基本定时器的工作原理、框图、计数模式、中断实验寄存器配置和溢出时间计算方法;4.提供了定时器中断实验的具体配置步骤和编程实践指导。文章通过理论讲解与实验结合的方式,帮助读者系统掌握STM32定时器的工作原理和应用方法。
2025-11-05 20:47:32
481
1
原创 STM32——WWDG
本文概述了STM32学习资源及WWDG(窗口看门狗)相关内容。介绍了WWDG的基本原理、寄存器配置和超时时间计算方法,并详细说明了配置步骤及编程验证方法。通过对比IWDG(独立看门狗)和WWDG的主要区别,帮助读者理解两者的应用场景。文章还提供了STM32芯片选型手册、参考手册等免费学习资源,为开发者快速掌握STM32的WWDG功能提供了系统性的学习路径。
2025-10-30 21:50:14
348
原创 STM32——IWDG
本文介绍了STM32的独立看门狗(IWDG)功能,包括其递减计数器特性、RC振荡器时钟源以及在系统复位中的作用。详细解析了IWDG的寄存器结构(键寄存器、预分频器寄存器、重装载寄存器、状态寄存器)和工作原理,提供了溢出时间计算公式,并说明HAL库简化了配置过程。最后提到实际编程中的喂狗操作和配置步骤,帮助开发者掌握IWDG的使用方法,确保系统稳定运行。
2025-10-27 22:43:45
422
原创 LeetCode刷题总结
为什么 n & 1可判断是奇数?二进制: 0b 8 4 2 1,bit0 为 2 的0次方,后续皆为 2的n次方,bit0为奇数,则都为奇数。
2025-10-21 23:42:37
192
原创 STM32——串口
本文系统介绍了STM32串口通信的学习要点。首先阐述了数据通信的基础概念,包括串行/并行通信、单工/半双工/全双工通信方式,以及同步/异步通信的区别。重点讲解了STM32的USART模块、HAL库初始化机制和中断回调机制,详细说明了异步通信配置步骤和IO引脚复用功能。最后通过串口收发字符的编程实例和源码解读,帮助读者掌握STM32串口通信的实践应用。文章为STM32串口通信学习提供了完整的知识框架和实践指导。
2025-09-02 20:57:36
448
原创 STM32——中断
本文介绍了STM32中断系统的基本概念和应用,重点讲解了NVIC(嵌套向量中断控制器)和EXTI(外部中断/事件控制器)的工作原理及使用方法。主要内容包括:1.中断向量表的结构与作用;2.NVIC优先级分组机制(共5组)及寄存器配置方法;3.HAL库中断配置三步骤(设置分组、优先级、使能中断);4.EXTI控制器特性及与GPIO的映射关系;5.通过实际案例演示如何利用外部中断控制LED灯状态。
2025-08-27 21:03:03
1260
原创 STM32——GPIO
本文系统总结了STM32F1系列GPIO模块的学习要点,主要包括:1. GPIO基本特性与引脚分布;2. 8种工作模式(输入/输出/复用/模拟)及其特点;3. 关键寄存器配置(CRL/CRH、ODR、IDR等);4. HAL库驱动开发流程(时钟使能、初始化、读写操作);5. 实践案例:LED控制与按键扫描实现,包含硬件电路分析、软件消抖处理及状态检测方法。
2025-08-12 21:54:46
530
原创 STM32——system文件夹
本文介绍了STM32学习总纲,重点讲解SYSTEM文件夹中的sys、delay和usart模块。详细剖析了delay文件夹中SysTick定时器的工作原理,包括时钟源选择和寄存器配置(LOAD/VAL寄存器关系)。文章具体说明了delay_init()、delay_us()和delay_ms()三个关键延时函数的实现原理。最后提到可通过MDK工程进行裸机测试,使用断点验证延时精度。该内容为正点原子整理的STM32常用驱动函数,可直接应用于实际项目开发。
2025-08-11 21:36:42
537
原创 STM32——时钟系统
本文介绍了STM32时钟系统的学习框架,重点解析了STM32F1系列的时钟树配置。内容涵盖:1)时钟源分类(外部/内部高低速晶振);2)总线架构(AHB/APB);3)HAL库时钟配置函数(HAL_RCC_OscConfig等);4)系统时钟初始化流程;5)外设时钟管理方法;6)使用STM32CubeMX配置时钟的实践要点。特别强调了FLASH时钟与系统时钟的关系,以及在72MHz主频下FLASH需要设置等待周期的注意事项,为STM32时钟系统开发提供了完整的技术指引。
2025-08-09 20:31:39
1208
原创 STM32——STM32CubeMX
本文介绍了STM32CubeMX工具的使用指南,主要内容包括:一、工具简介,说明其专用于STM32芯片配置;二、安装步骤;三、以F1系列为例详解新建工程流程,涵盖芯片选型、时钟配置、GPIO设置、内核调试等关键步骤;四、特别提醒避免中文路径问题,否则会导致启动文件缺失,需手动添加.s文件解决。文章强调用户代码应写在预留区,并提供了完整的工程配置到代码生成的操作流程。
2025-08-07 21:17:57
567
原创 STM32——启动过程浅析
本文介绍了STM32开发中的Map文件解析和启动过程分析。主要内容包括:1)Map文件组成与作用,详细解析了函数调用关系、内存分布等关键信息;2)STM32不同系列(F1/F4/F7/H7)的启动模式设置,重点说明MSP和PC指针的定位原理;3)启动文件分析,涵盖Reset_Handler函数、中断向量表和堆栈分配等内容。通过Map文件可查看实际启动地址,帮助开发者优化代码和内存使用。文章为STM32开发者提供了系统的学习框架和调试方法参考。
2025-08-02 13:20:43
849
原创 STM32——HAL 库MDK工程创建
本文介绍了基于HAL库的STM32工程新建方法。主要内容包括:1)工程目录结构(Drivers、Middlewares等文件夹);2)工程框架搭建步骤(删除原有工程文件);3)文件添加方法(手动选择.c文件并修改属性);4)MDK配置要点(Target、Output等6个选项卡设置);5)main.c文件创建(保存到User文件夹并导入)。文章提供了从零开始建立STM32 HAL库工程的具体操作指南,适合初学者快速上手STM32开发。
2025-07-31 22:08:47
599
原创 STM32——HAL库
本文系统介绍了STM32开发中的关键知识点:1. 概述了CMIS架构和HAL库特点;2. 详细说明STM32Cube固件包的获取方式及目录结构,重点分析正点原子整理的固件包中CMSIS关键文件;3. 解析HAL库框架结构,包括文件夹组织、API命名规则、寄存器操作宏定义和回调函数机制;4. 阐述HAL库实际应用,包括开发文件结构、用户配置方法(外设驱动裁剪和晶振频率设置)及设备驱动层调用。内容涵盖从理论到实践的完整STM32开发流程。
2025-07-29 22:29:22
1541
原创 STM32——寄存器映射
本文总结了STM32 HAL库的寄存器基础知识和映射原理。主要内容包括:1)寄存器概念,类比电路开关控制功能;2)寄存器类型与映射方法,通过指针转换实现地址访问;3)存储器映像分析,包括总线基地址和GPIO外设地址计算;4)结构体映射技术,利用连续内存分配特性实现寄存器访问。重点阐述了寄存器地址计算方法和结构体指针映射原理,为深入理解STM32底层驱动开发提供了基础指导。
2025-07-28 22:18:21
726
1
原创 STM32——存储器映射(Memory mapping)
《STM32F103ZET6存储器架构解析》摘要:本文介绍了STM32F103ZET6芯片的存储器系统,重点阐述其寻址机制(1地址对应1字节)和存储器映射原理。对比了存储芯片与单片机的差异(单片机采用8位数据线)。详细解析了存储器功能划分的三个主要区块(BLOCK0、BLOCK1、BLOCK2),其中BLOCK0-BLOCK2构成片上外设的核心存储区域,为开发者理解STM32存储架构提供了基础认知框架。
2025-07-01 21:58:01
465
原创 STM32——DAP下载程序和程序调试
从原理图可知,此接口不仅支持JTAG接口,还支持SWD,(SWIO、SWCLK) .正点原子DAP仿真器:链接:这里默认SWD,因为就使用了两个IO口。时钟配置10MHz,实际只有4MHz,由MDK自动配置。 F1系列Device Size为512K,只能给芯片容量小于此值的下载,向下兼容。右上角为下载算法要使用的RAM。(默认就行) 推荐SWD接口调试的缘由:F1通过配置AFIO_MAPR寄存器,可释放下面三个IO口。参考手册:STM32 F10xx参考手册 中文版 :全局变量查看仿真窗口→断点快速设置
2025-06-30 23:02:50
950
原创 ELSE、基础算法
for(i=min;i<=max;i++){flag=1;if(i<=2)flag = 0;for(j=2;j<sqrt(i);j++){flag = 0;count++;
2025-03-11 09:15:00
170
原创 十三、静态库 && 动态库
因为如果调用多个他.c 麻烦(例如不同公司间的软件开发合作,不能提供代码,只能提供软件.a) ——> 引进库(库也是文件,也是代码) ——> 做成一个静态库。
2025-03-11 09:00:00
624
原创 十二、文件读写
关键问题是同时读写,只要你使用标准库的I/O操作,同时读写的结果都是没有定义的,不管是像楼主的代码那样使用两个文件指针,或者使用fseek。如果是分别用fopen打开的两个指针,也存在这个问题,因为你没有办法掌握I/O系统刷新的确切时间,可能你的写操作生效以后,读操作可以得到更新后的数据,或者也可能由于缓冲的原因,前一次读操作已经把剩余内容全部读到缓冲区中,这样读操作得到的数据是前一次的快照,不能反映最新的变化。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。
2025-03-10 09:00:00
737
原创 十一、宏定义
一般形式:#define 宏名 宏体一般定义在函数外部,可在任意处定义#undef 宏名 // 可终止宏名的作用域引号中的内容与宏名相同也不置换功能(宏展开):预编译时,用宏体替换宏名 ---- 不作语法检查生命周期:从声明处开始,若无#undef,则到程序终止为止,反之,则在#undef处结束宏定义可以嵌套,不能递归宏定义时,需要使用必要的括号 ---- 宏展开为不作语法检查的展开,若无括号,程序读取语句优先级可能会不符合逻辑一般形式:#define S(a,b) (a)*(b)
2025-03-09 09:00:00
380
原创 十、链表操作
1、当需要存储一个比较大的数据时,如果使用数组,就意味着需要计算机分配一个连续的一整块内存空间系统会分配空间失败。2、链表中数据元素的逻辑顺序是通过链表中的指针链接次序实现的。1、链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。双向链表的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev指针。1、头结点的数据类型和首节点的类型是一摸一样。尾节点:存放最后一个有效数据的节点。一个是存储数据元素的数据域。首节点:存放第一个有效数据的节点。
2025-03-09 02:30:00
471
原创 九、结构体
为了模拟一些复杂的事物,把一些基本的数据类型组合在一起,形成了一种新的复合数据类型。//第一种:经常使用,也是推荐的一种。int age;char sex;//第二种int age;char sex;}st2;//第三种structint age;char sex;}st3;。
2025-03-08 16:55:40
941
原创 七、数组指针 && 指针数组
(p+1)单独使用时表示的是第1行数据,放在表达式中会被转换为第1行数据的首地址,也就是第1行第0个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第0个元素的指针;指针数组和二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的p1为例,在32位环境下它占用4×5=20个字节的内存。p指向的数据类型是int[4],那么p+1就前进4×4=16个字节,p-1就后退16个字节,这正好是数组a所包含的每个一维数组的长度。
2025-03-08 15:31:49
446
原创 六、指针操作
间接寻址 → 用指针把变量的地址保存上,后通过指针指向的地址找到变量的存储空间,修改其值、一级指针 存的是变量的地址、二级指针 存的是一级指针的地址、如果通过指针改变变量的值的时候是用*来取内容进行改变。arr[10] 数组的名便可代表此数组的首地址,且arr为地址常量,不可在声明后,直接 arr = "ad" 赋值,所以赋值时,不可 p = &arr,而是 int *p = arr;寻址能力是由系统的硬件决定的,也。简单的总结下,16位的2字节,32位的4字节,64位的8字节,由系统的寻址能力决定。
2025-03-08 15:25:32
1019
原创 四、输入输出函数
C 语言中 printf 输出 double 和 float 都可以用占位符 可以混用,而 double 可以额外用。而 scanf 输入情况下 double 必须用,float 必须用不能混用。
2025-03-05 11:45:00
730
原创 三、程序结构语句
Switch -case 若 case 1:case 2:执行的语句一致,可写成 case 1: case 2:语句;x) 是为了避免 if(x = 0) 的恒定情况。未加 { } 的 if-else 语句,会以最近的 if-else 语句配对,切忌不加 {}结构内可以存在死循环 ——> while(1) 、for(;单分支 :if( 表达式 - 可为实数 ) 语句;if(xxxx) 语句1。if(xxxx) 语句3。
2025-03-05 11:00:00
694
原创 二、标识符
= 是关系运算符 比较两个字符是不是相等 = 赋值运算符 ,赋值 1、a = 3 if(b = a)// if(3) 条件为真 2、a = 3 ,b = 4 if(b == a)// if(0) 条件为假 !(sizeof(long int ) = 12) strlen(){头文件为 <string.h>} 求字符串的大小,但是他和sizeof不同,他求的是实际的字符的大小,不包括 \0 的大小。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。
2025-03-04 20:33:05
958
原创 一、数据类型
合法的:’3’ ’a’ ‘b’ ‘\n’ ‘\’ ‘\b’ ‘\t’ ‘\r’ ‘\f’ ‘\’’ ‘\”’ ‘\ddd’ ‘\xhh’ 其中的ddd是1~3个 八进制数所代表的字符,hh是1到2个十六进制数所代表的字符。具有变量的特征是存在一个以变量名命名的存储单元,在一般情况下,存储单元中的内容是可以变化的。二进制序列用以表示计算机、电子信息数据容量的量纲,基本单位为字节B,字节向上分别为KB、MB、GB、TB,每级为前一级的1024倍,比如1KB=1024B,1M=1024KB。char n[5];
2025-03-04 20:13:00
1070
原创 十、暂时放置知识点
例如,在土耳其语的区域设置中,大写的’i’是’İ’,而不是’I’。在C++中,当你对一个较小的数据类型(如uint8_t或uint16_t)进行位移操作时,位移的数量是在这个较小的数据类型的范围内进行的。当你将一个较小的数据类型转换为一个较大的数据类型(如uint64_t)后再进行位移操作,位移的数量就是在这个较大的数据类型的范围内进行的。此外,标准模板库(STL)提供了各种通用的数据结构和算法,例如向量、列表、映射、排序算法等,可以在不同的环境下使用,而不用担心特定平台的差异性。
2025-02-27 10:00:00
690
原创 八、多线程
以上函数在使用时需要配合线程属性对象(pthread_attr_t类型)使用。例如,你可以使用pthread_attr_init函数初始化一个线程属性对象,然后使用pthread_attr_setdetachstate函数设置其分离状态属性,最后在创建线程时使用这个属性对象。当不再需要使用线程属性对象时,应使用pthread_attr_destroy函数销毁它,以释放其占用的资源。pthread_attr_*类函数是用于操作线程属性对象的函数。设置线程的调度策略为。使用属性对象创建线程。
2025-02-26 10:00:00
710
原创 九、C/C++ time 处理集合
是的,C和C中的tm结构体中的tm_year字段是从1900年开始计数的。例如,如果tv_sec是1234567890,tv_usec是123456,那么当前的时间就是1234567890.123456秒(从1970年1月1日00:00:00 UTC开始计算)。在gettimeofday函数返回的timeval结构体中,tv_sec字段表示的是自1970年1月1日00:00:00 UTC(UNIX纪元)以来的秒数,而tv_usec字段表示的是微秒数(百万分之一秒)。输出年、月、日、小时、分钟和秒。
2025-02-26 10:00:00
987
XCOM正点原子(ALIENTEK)官方推出的串口调试助手XCOM
2025-10-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅