- 博客(36)
- 收藏
- 关注
原创 Git push后撤销提交
当某次更改完工程后,push了本地仓库到云端,但是发现有地方改错了,想撤销这次推送,或者某次提交就更改了很小一部分,想和本地这次修改的合并为一次推送,省的在云端显示特别多次提交,显得非常乱。
2025-03-19 18:37:52
915
原创 STM32的HAL库开发---内存保护(MPU)
Cache(高级缓存是提升STM32性能的关键一步。Cache只在F7、H7系列有。M7内核芯片做了一级Cache支持,Cache分为数据缓存D-Cache和指令缓存I-Cache。由于SRAM只有CPU主频的一半,所以使用Cache加速访问。数据缓存D-Cache是解决CPU加速访问SRAMCache支持4种基本操作:1,使能;2,禁止;3,清空;4,无效化。
2025-02-15 07:21:16
1471
原创 STM32的HAL库开发---OLED
常见显示屏:LCD显示屏、点阵显示屏、OLED显示屏。LCD显示屏最常见,技术成熟。OLED,即有机发光二极管(),又称为有机激光显示(OrganicDisplayOLED显示屏就是利用有机发光二极管制成的显示屏,只要在正负极上加上正确的电压就会发光。LCD有背光层,显示黑色不那么明显,而OLED就是把所有的发光二极管都关闭,就是很明显的黑色。ATK_OLED模块是一块小尺寸(0.96寸)、高亮、自带升压电路的高性能OLED显示模块,分辨率为128 * 64,采用。
2025-02-14 11:02:30
1694
原创 STM32的HAL库开发---高级定时器---互补输出带死区实验
互补输出:OCx输出高电平,则互补通道OCxN输出低电平。OCx输出低电平,则互补通道OCxN输出高电平。带死区控制的互补输出:OCx输出高电平时,则互补通道OCxN过一会再输出输出低电平。这个时间里输出的电平为无效电平。
2025-02-09 11:13:54
1235
原创 STM32的HAL库开发---高级定时器---输出比较模式实验
定时器的输出比较模式总共有8种,本文使用其中的翻转模式,当TIMXCCR1=TIMXCNT时,翻转OC1REF的电平,OC1REF为输出参考信号,高电平有效,OC1REF信号连接到0C1上面,然后控制CH1输出,CH1通过IO口复用功能,连接到IO口上面,最后输出到外部。计时器工作在递增模式:当CNT的值不断递增,递增到于输出比较寄存器CCR1的值相同时,IO电平翻转,然后CNT值继续递增,递增到ARR时,产生计数器溢出事件,计数器值从0开始重新递增,通过这种方式产生方波或者称为PWM波。
2025-02-06 23:23:03
553
原创 STM32的HAL库开发---高级定时器
1、STM32F103有两个高级定时器,分别是TIM1和TIM8。2、主要特性3、高级定时器框图高级定时器的时钟源部分跟通用定时器是一样的,主要区别在重复计数器、互补输出部分、刹车输入。通用定时器在计数器溢出的时候,就会产生更新事件和更新中断。而高级定时器多了重复计数器,计数器溢出后,需要经过重复计数器才会产生更新事件或者更新中断。首先往RCR寄存器里边写入值REP,每当计数器值溢出的时候,重复计数器的值就减一,当重复计数器的值递减到0的时候,再次溢出就会产生更新事件或者更新中断。
2025-02-06 11:21:48
761
原创 STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数
1、 外部时钟模式1:核心为蓝色部分的时基单元,时基单元的时钟源可以来自四种,分别是内部时钟PCLK、外部时钟模式1,外部时钟模式2、内部定时器触发(级联)。而脉冲计数就是使用外部时钟模式1和外部时钟模式2。当使用外部时钟模式1的时候,输入信号主要来自定时器的通道1和通道2,然后通过信号TI1FP1和TI2FP2来到TRGI,然后经过从模式控制器来到时基单元。
2025-02-05 12:52:37
1266
原创 STM32的HAL库开发-通用定时器输入捕获实验
1、捕获/比较通道的输入部分(通道1)首先设置 TIM_CCMR1的CC1S[1:0]位,设置成01,那么IC1来自于TI1,也就是说连接到TI1FP1上边。设置成10,那个IC1来自于TI2,连接到TI2FP1上。设置成11,将IC1连接到TRC上边。假设IC1连接到TI1FP1上,那么TIMx_CH1作为输入,首先来到一个滤波器,滤波器需要设置TIMx_CCMR1的ICF[3:0]位设置滤波方式,配合着通过设置TIMx_CR寄存器的CKD[1:0]位,设置采样频率fCKD。这个在前面通用定时器讲过。
2025-02-04 19:40:33
1071
原创 STM32的HAL库开发---TIMER(定时器) ---通用定时器-PWM功能
输出比较部分主框图如下:1、 捕获/比较通道1的主电路---输出部分图中,灰色部分为输入的,右边为输出的。捕获/比较预装载寄存器就是主框图里边的捕获/比较1寄存器,捕获/比较1寄存器的影子寄存器就是图中的捕获比较影子寄存器,影子寄存器是没有读写权限的。一般首先由程序员写入捕获/比较寄存器的值,也就是CCR1。然后捕获/比较寄存器的值会转移到捕获/比较影子寄存器里边。捕获/比较影子寄存器的值与计数器的值进行比较。比较的结果来到输出控制部分。
2025-02-02 23:06:48
1135
1
原创 STM32的keil debug调试(JTAG/SW)
Cortex-M内核含有硬件调试模块,该模块可在取指(指令断点)或访问数据(数据断点)时停止。内核停止时,可以查询内核的内部状态和系统的外部状态。完成查询后,可恢复程序执行。意思就是STM32里边包括外设和内核,内核里边有一个调试模块,有这个模块就可以仿真调试STM32,这个模块可以在指令断点或数据断电处停止,这里的停止指的是内核停止,内核停止就可以查看内核的内部状态和系统的外部状态。内核的内部状态就是内核那些R0、R1、PC这些,外部状态就是外设了,例如寄存器。
2025-02-01 09:42:39
1787
原创 STM32的HAL库开发---TIMER(定时器) --- 基本定时器
基本定时器时TIM6和TIM7,有一个16位的递增计数器,不能递减,计数值为0~65535。有一个16位预分频器,分频系数为1~65536。可触发DAC,当计数器溢出的时候,可进行一次数模转化。在更新事件(计数器溢出)时,可产生中断/DMA请求,这个月由用户自己设置。
2025-01-29 18:30:58
1852
原创 STM32的HAL库开发----IWDG与WWDG区别
IWDG来自LSI(40KHz),是一个RC振荡器,时钟没有那么精确。WWDG来自PCLK1,是0系统总线上面的时钟,时钟比较精准。
2025-01-28 12:42:50
262
原创 STM32的HAL库开发---WWDG(窗口看门狗)
1、WWDG全程为Window watchdog,即窗口看门狗。2、WWDG的本质是能产生系统复位信号和提前唤醒中断的计数器。与IWDG不同的是不仅能产生复位信号,同时还能产生提前唤醒中断。3、WWDG的特性4、喂狗:在窗口期内重装载计数器的值,防止复位。
2025-01-28 12:00:37
890
原创 STM32 HAL库开发-IWDG(独立看门狗)
1、IWDG全程为Independent watchdog,即独立看门狗。2、IWDG的本质为能产生系统复位信号的计数器。3、IWDG的特性4、喂狗在计数器计数到0之前,重装载计数器的值,防止复位。有一个重装在寄存器。
2025-01-27 12:00:06
976
原创 C++中使用swap函数和reserve函数
C++中vector类似于数组,但是与数组不同,vector可以动态改变存储量,向vector添加数据的时候,vector会自动替我们预留一些内存,预留多少内存可以使用capacity()函数查看。而reserve函数用于预留确定的内存量,例如:reserve(100),就是预留100个空位置。
2025-01-24 20:18:23
288
原创 C++中函数形参为指针引用
下面这段程序使用的是传址,程序执行完input的指向没有改变,还是指向了最开始new char返回的地址。这句程序后,test指向了new char[10]返回的地址,而input地址没有改变。再来看下面这段程序, 唯一的区别就是函数参数变成了引用,这样test就变成了char*的引用类型,改变test的时候,也就是执行完test = arr时,input同时也指向了new char[10]返回的地址。而函数参数为指针类型,只可以改变实参指向的地址中存储的值,不能改变实参的指向。
2025-01-20 16:21:26
153
原创 C++中vector的库函数push_back和emplace_back的区别
同时如果vector要存储的内容较多时,可以在创建的时候就先预留出vector的大小,或者后面使用reverse函数预留出内存。不然vector的内存不够时,他会另开辟一块空间,然后将原来vector里的内容复制过去,再vector的变量指向新开辟的空间地址。emplace_back函数直流就在vector的后面创建对象,效率相较于push_back会高一些,当对象数量较多的时候,建议使用emplace_back函数。
2025-01-13 21:15:58
146
原创 C++与python继承构造函数调用
在C++里边当一个子类继承另一个父类时,在创建子类对象时,会自动调用父类的构造函数,如果父类构造函数有参数,需要给父类构造函数传递参数,不然会报错。调用完父类的构造函数再返回执行调用子类的构造函数。python里边必须使用super().__init__()函数才会调用父类得构造函数,同时多继承调用顺序由MRO决定。如果父类的类成员中有类对象,会先调用这类对象的构造函数,再执行父类的构造函数。
2024-11-14 11:27:28
228
原创 vscode 写ROS程序突然没有代码提示了
网上说取消prevent那个发现根本没用,后来发现是C/C++扩展版本装的不对,应该是之前不知道啥时候刚开vscode的时候误触了右下角那个升级,找到扩展选择安装另一个版本即可。我是在ubuntu上写ros程序,之前一直vscode一直有代码提示的,突然有一天打开虚拟机写程序的时候发现代码提示没有了。
2024-07-28 15:05:32
1536
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人