自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 芯片手册阅读指导

5.应用信息(典型应用,外围器件选型,性能曲线,一些应用建议) 后看。3.规格(电气参数,ESD等级,特性曲线) 再看。4.详细描述(原理框图,芯片功能详细描述)1.首页芯片特性介绍 先看。6.封装信息(阻焊开窗的大小)

2025-07-30 17:13:03 61

原创 通用定时器Timer的基本模式

特点:多通道,一般有四个16位或者32位的计数器(CNT)多种时钟源(内部APB,外部时钟其他定时器)多种功能模式:基本定时,中断输入捕获,PWM等基本结构APB总线 PSC预分配器 CNT CCR。

2025-07-30 11:45:44 221

原创 用sprintf格式化输出

指向字符数组的指针,用于存储格式化后的字符串。:格式化字符串,包含普通字符和格式说明符。

2025-07-30 10:13:03 42

原创 ubuntu 24.02 配置yolov12(胎教级)

本文介绍了YOLOv12模型的完整安装与训练流程:1)安装显卡驱动和Miniconda;2)配置清华/阿里镜像源创建虚拟环境;3)根据CUDA版本安装匹配的PyTorch和Torchvision;4)下载YOLOv12源码并处理依赖项;5)准备数据集和配置文件;6)在PyCharm中配置解释器后进行模型训练。关键步骤包括:注释requirements.txt前三行、正确设置data.yaml路径、使用多线程训练模板,最终通过predict.py验证模型效果。注意需保持软件版本兼容性,遇到问题可查找对应步骤的

2025-07-29 09:21:58 671

原创 程序4:按钮中断并改变闪烁频率,输出从复位到目前的时间

第一个完全由自己做出来的程序,这种感觉太好了。

2025-07-28 17:23:39 200

原创 中断,定时器,如何找对应电路原理图

中断是看把谁设置成了中断,比如设置了一个外部中断,gpio的外部中断,上升沿触发,那么在这个pin变成上升沿的时候就会触发中断,执行相应的gpio的回调函数,定时器输出的pwm波都是在定时器都是在定时器端口上输出的,所以接的外设就可以接收到定时器端口输出的pwm波。需要在cubemx里配置触发方式:比如此用户唤醒按钮是上升沿触发(按下触发)寻找原理图:lckfb——找到对应板子——教程资料。这样就能知道自己要输出高还是低。

2025-07-28 16:52:09 95

原创 程序3:外部中断实例(利用按钮完成中断)

例如,若系统时钟为 72MHz,PSC 设置为 71,则定时器的时钟频率为 1MHz。当 CNT(计数器)的值达到 ARR 时,计数器会重置为 0,并触发更新事件。ARR 的值直接影响定时器的周期。例如,若 ARR 设置为 999,且定时器时钟为 1MHz,则计数周期为 1ms。当 CNT 的值与 CCR 的值相等时,定时器会触发输出比较事件。例如,若 ARR 设置为 1000,CCR 设置为 500,则 PWM 输出的占空比为 50%。计数器的值会随着时钟脉冲递增或递减,直到达到 ARR 的值后重置。

2025-07-26 16:37:57 224

原创 定时器入门

内涵PSC,CNT,ARR(最大计算cnt),CCR寄存器(阈值)捕获计数(测量频率),捕获计时,输出比较(PWM输出)定时器是竞赛中最重要的外设。

2025-07-25 19:49:50 76

原创 常见外设和中断

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。组成:中断源,中断向量表,ISR(中断服务函数)为什么用中断。

2025-07-25 19:38:08 261

原创 HAL库相关

外设句柄类型被定义在 HAL库的库文件 stm32f4xx_hal_外设名.h中 这是uart的160行中的对句柄的设置。main中先包含了三个头文件,先看main.h,main.h中定义了引脚名字,进行了宏替换,外脚参数初始化()HAL_UART_Receive_IT() //UART中断方式接收数据。_HAL_GPIO_EXTI_CLEAR_FLAG_ 清楚外部中断标志物。如_HAL_UART_ENABLE_IT() 串口使能中断。

2025-07-25 13:12:16 834

原创 keil中无法转到指定函数怎么办

2.可能是因为文件夹中的keil文件太多了,可以将本工程移到其他地方。

2025-07-23 15:27:45 91

原创 程序2:串口输入控制灯闪烁的频率

结构体中的一个成员,它指向 UART 外设的硬件寄存器基地址。这个成员用于标识具体使用的是哪个 UART 外设(如 USART1、USART2 等)。是一个由 STMicroelectronics 定义的结构体,用于封装与 UART 通信相关的所有信息。2.UART_HandleTypeDef *huart这是什么意思。在 STM32 HAL 库的上下文中,1.这个instance是什么。

2025-07-23 15:24:59 97

原创 程序1:第一个点灯程序

所有HAL的函数都在前置芯片文件中定义了,可以通过右击来查看。同时可用vofa来查看输出的Hello world。

2025-07-21 22:32:26 67

原创 如何在keil中新建一个文件夹(分模块编程)

再次新建,并命名app.h,并保存。先新建文件,并新建文件夹。在keil中添加文件夹。

2025-07-19 17:08:33 104

原创 创建STM32cubemx工程(图文+重点指示)

配置串口PA9配置tx,PA10配置rx,进入connectivity usart1 模式选择As。配置时钟,注意HSE输入频率要等于实际板载晶振的频率,否则会通讯失败,注意红框内的数字匹配。在main.c中只建议使用两句话(代码模块份文件)app_entry();配置文件名,选择文件位置,IDE版本。外设GPIO配置,根据实际需要。进入keil文件,修改设置。选择RCC配置,无源晶振。选择SYS配置串行调试。设置编码位utf——8。

2025-07-19 16:38:49 161

原创 微嵌原理简单

时钟来源内部rc振荡电路(精度很差)外部可以用石英晶体提供更准确的时钟信号。开漏电阻能够得到更大的电压(驱动步进电机)(线与电路I2C)32bit体现在:数据总线宽度,寄存器宽度,地址空间,指令。开漏输出电路 无高电平输出能力(需要上拉电阻才能输出高低)时钟用来同步各个内部模块运行的执行速度,保证稳定运行。100个pin,83个i/o口。

2025-07-18 22:47:24 67

原创 如何查询单片机手册获取引脚地址

进意法半导体官网www.st.com,搜索手册编号,如stm32f1xx系列是rm0008.找到英文版手册。然后取引脚,引脚从0开始,PE6,构建掩码1<<6,就可以精准操控第6位。通过地址+偏移量就可以精确定位各个寄存器的地址,对寄存器的值进行直接操作。3.3memory map中的table3中有相应的地址。在第九章(GPIOs and AFIOs)9.2.4有端口输出寄存器的偏移地址。例如,GPIOE 端口的基地址是。

2025-07-13 15:18:50 150

原创 c语言嵌入式中的应用2

那么sizeof(str)=7,strlen(str)=6。比如说int a=0x12345678。那么78会在低地址,而12会在高地址。但32位机器指针都是=4字节(因为32/8=4)strlen不能用在数组上,可能会爆炸。小端:低位在低地址,高位在高地址。c语言中的字符串是const类型。32位机器的int类型是4字节。

2025-07-13 14:35:24 74

原创 c语言的嵌入式应用2

int main()

2025-07-12 23:15:45 88

原创 c语言嵌入式的应用1

嵌入式中常用int8_t表示有符号char,uint8_t表示无符号的char。一般会把一种硬件的驱动代码放在一对.c/.h文件中,比如led.c/led.h。int32_t uint32_t表示整形。如,之保留低四位 & 0x0F(掩码)在<stdint.h>中进行了定义。用处:改变寄存器中指定位数。把bit5置1,用或操作。判断bit3是否为0,嵌入式工程一般包含大量的驱动库文件。

2025-07-12 20:56:38 147

原创 c语法基础

endif #if, #ifdef, #ifndef这些条件命令的结束标志.#ifndef 与#ifdef相反, 判断某个宏是否未被定义。区分定义和声明,声明只是声明了变量,并不一定会有实际意义。applying 防止头文件多次包含。函数返回值不能返回一个局部变量的指针。不要使用动态内存申请malloc。使用宏替换一定要用括号。

2025-07-12 20:52:16 124

原创 19. 删除链表的倒数第 N 个结点

利用双指针,一个是快指针,一个是慢指针。快指针在开始先走n+1步,然后快慢指针同时开始后移,知道快指针走到None的时候,这个时候慢指针恰好走到倒数第n个元素的前面,可以进行删除了。这道题肯定是有最朴素的思路,那就是先遍历一遍,知道有几个元素,再遍历到要删除元素的前面元素进行删除,非常朴素,,但是也能过而且时间效率很高。但是这道题肯定是有更加巧妙的做法的(有的,当然有的)

2025-02-02 17:27:42 205

原创 lc24. 两两交换链表中的节点

交换链表中的两个节点,其实和倒转链表非常像,都用两个指针加一个临时变量。重点是在交换的过程要理清,不能改变步骤,最后的赋值迭代也非常重要,还有就是循环条件的选择,必须推演好在什么时候退出。

2025-02-02 16:56:34 165

原创 lc206 反转链表

反转链表是一个很基础的数据结构的问题。通常是用双指针或者递归来解决问题。首先使用单指针肯定是不够的 ,单指针无法访问前面的元素。双指针使用时也需要借助临时变量temp来完成构建新链表之后指针的移动。还要注意不能再类里面平行定义函数这样子会访问不到,要么在类的外面定义函数,要么在主函数下面再定义函数。递归的解答更加简洁,要注意返回递归函数的返回值最终是否给出。注意在草稿纸上演算循环退出的条件。此题使用递归也可以解答,

2025-02-02 16:34:22 113

原创 lc707设计链表 lc中链表的基本操作

3.不要眼高手低,这些操作都是高中就会的东西,但是真正落实到代码上,确实会出现很多问题,比如对类不熟悉,就会在类这个地方卡住,但通过这道题的学习对py实现链表操作以及类的定义等方面有了初步了解。在增加完一个元素过后,那么他就需要加一,就完成了self.size这个变量的维护,他也就确实有了实际的意义。其实有这种误解完全就是对类的特性不了解,在def init 的时候是在进行初始化,也就是链表最开始的样子,所以虚拟头节点的下面实际上是不可能有任何元素的。2.那既然给他叫head,他不应该是链表的头节点吗?

2025-02-02 11:44:04 252

原创 删除链表中的元素 lc203

理论上的删除操作其实是非常简单的,但是落实到代码上,却会出现很多的问题。首先是不能越界的问题,这里要明确元素存在的判断就是x==None这里的None是py内置字,接着是对头结点的的特殊处理,处理完之后明确pre和cur两个变量,逐一进行操作,注意while循环的推出条件。第二种做法是使用虚拟头节点,好处是可以统一操作,让我们不再需要对头节点进行特殊的操作,代码逻辑更加完善,缺点是牺牲一点空间复杂。在这个编辑的过程中,尤其要注意边界条件的选定与迭代操作该怎么做。

2025-01-26 20:25:53 160

原创 螺旋矩阵二 lc59

本题需要生成正方形的螺旋矩阵。这件事情本身并不难,但是有很多细节容易掉进去,比如给定一个n,一共要转几圈,每遍历完一个行,该不该把最后一个遍历进去。这第二个问题和之前的二分查找中遇到的问题比较类似,都强调的循环不变量原则。就是左闭右开就一直左闭右开。在写这个题目的时候,有很多要自定义的辅助变量,确实是巩固基础的好题。所有元素,且元素按顺时针顺序螺旋排列的。

2025-01-26 17:52:49 152

原创 长度最小的子数组 lc209

但是对滑动窗口需要完全理解,首先,循环变量j,它表示的是这个滑动窗口的终止位置,在滑动窗口目前满足大于目标值的条件下,去移动i(因为移动j只会增加,而移动i可以减小,因为我们要求的子数组是连续的),有点类似于贪心的做法。两层while,循环使最小完成。第一种解法,,毫无疑问,暴力。直接两层循环,没有做不出来的事,缺点是被时间单防了。第二种利用滑动窗口来寻找,直接一层循环搞定。如果不存在符合条件的子数组,返回。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。

2025-01-24 13:05:04 213

原创 有序数组的平方

双指针比较处理,这里同时注意边界问题,就是while循环在什么时候退出,进行边界分析,如果在l r 两者相等时候不执行的话,那么最中间的那个元素就不会被执行会造成错误。对于这道题目,我们很容易想到第一种做法,就是先将每个数平方之后再排序,平方使用一层循环,排序再使用py内置排序方法sort()。这道题目的简单做法就是这样子。但这道题有它自己的特性,我们从两边分别遍历用空间复杂度换取时间复杂度。组成的新数组,要求也按。

2025-01-24 12:01:37 169

原创 数组中删除元素

一层快指针,一层慢指针。快指针每一轮循环都加1,而慢指针在碰到要删除的元素是,原地不动,每一次都让快指针的值赋值给慢指针,在遍历完一轮后,可以想到。快指针在每一个要删除的元素,让慢指针停下,自己往前走一次,绕过这个要删除元素的赋值过程,就可以一个个剔出不要删除的元素。法一:因为数组是连续存储,所以要删除数组中的某个元素,,必须要将后面的元素向前覆盖,所以定义两层循环,第一次i遍历这个数组,一旦遇到要删除的元素,就开启第二层循环j,第二层循环将后面的元素向前覆盖。在数组中删除元素,可以有两种做法。

2025-01-24 09:08:18 125

原创 二分查找学习领悟

左闭右闭设置为right = m -1 ,因为这里已经确定了m位置不是我们要找的target,不用将其包括 进下一次搜索中。左闭右开区间设置为right=m,因为我们一直认定右区间是开,,即右区间取不到,m是取不到 的。左闭右闭设置为left <= rigth,因为两个相等的情况是存在的,所以搜索要包含这个情况。左闭右开设置为len(nums),因为这里是取不到右边界的;两种写法最重要的点是要坚持自己的原则,即左闭右闭就是左闭右闭。左闭右闭设置为-1,因为这里是要取到右边界的。

2025-01-23 22:30:47 173

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除