自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何判断光耦合器的好坏?

注意光耦的输入端与输出端之间仅有光的联系,输入端与输出端他们是不共地的,否则就达不到隔离效果。输出端:在输入端接上低压电源,并串联限流电阻进行保护,使用万用表的电阻档对输出端进行测量。如果输入端接上电源时,万用表有值,而断开电源时,万用表数值无穷大,说明光耦是好的。二极管正向电压为1.25V,当输入电压高于二极管正向电压,红外发射二极管导通并发光,光电晶体管接收到红外发射二极管发出的光时也导通。输入端:使用万用表的二极管档进行测量。如果正向有压降,而反向断开,说明红外发射二极管正常。

2024-05-27 20:25:20 226

原创 STM32CubeMonitor使用

可以用于实时监测变量,还不需要使用串口输出,还能显示波形啥的。最近被了解到STM32CubeMonitor好像很好用。可能会慢慢学习使用这个软件。

2024-05-05 22:41:16 241

原创 STM32CubeMX相关内容

要对MCU进行进一步的编程,增加代码来实现用户需要的功能,还有,程序的下载以及调试,是需要在IDE软件里进行操作的。搞清楚图形化操作界面中,时钟源和时钟信号的作用后,进行MCU上的各种时钟信号的配置就很简单了,因为这些都是图形化界面的操作,不用像传统编程那样搞清楚相关寄存器并计算寄存器的值了,这些底层的寄存器设置将由CubeMX自动完成,并生成代码。////////////////////////////////////////////////////////////////////////////新的。

2024-05-03 10:14:01 226

原创 使用VScode+Keil Assistant进行开发时遇到的问题

我的应对方式是同时使用VScode和Keil来进行全局搜索,如果结果一样,说明VScode的全局搜索没有遗漏内容。但是有可能会出现下面这种情况:你在VScode里面对代码进行了修改,没有及时保存同步到Keil中,同时你也在Keil中对代码进行了修改。现在,你并没有办法使这两部分的修改合并在一起了,无论你是保存VScode上的修改还是保存Keil上的修改,都会丢失在另一个软件上做出的的修改。VScode的全局搜索搜索内容不全,只能搜索到已经打开的文件里面的内容,没有打开的文件里面的内容搜索不到。

2024-05-03 10:04:55 581 3

原创 添加头文件路径遇到的坑-笔记

那么添加头文件路径是这样的:第一层文件夹/第二层文件夹/第三层文件夹/第四层文件夹。这种情况下,如果仍然使用情况一的添加头文件路径的方式,会报错,提示找不到头文件。添加头文件路径是,需要添加的路径是include的位置的上一层。那么添加头文件路径是这样的:第一层文件夹/第二层文件夹/第三层文件夹。第一层文件夹\第二层文件夹\第三层文件夹\第四层文件夹\头文件。现在我有一个头文件(.h文件),他的绝对路径如下。#include "第四层文件夹/头文件"#include "头文件"

2023-11-25 15:55:14 465

原创 LVGL导入自定义字库与图标

下载字库,下载好的字库会保存到一个ttf文件里面,如果不知道ttf文件是什么,请自行谷歌。windows系统自带的字体保存在这个目录下面c:\windows\fonts,如果需要其他的,自行上网下载,网上资源丰富。(除了使用ttf文件外,还可以使用woff文件,这里不做介绍)将ttf文件里面的文字转换成.c文件。为了方便管理,创建一个同名的.h文件(MyFonts32.h)在.c文件对应的.h文件内,声明字体。#endif//声明字体#endif对于LVGL官方字体给输出字体命名。

2023-11-23 17:52:10 1514

原创 STM32CubeIDE字符全局替换

按照下面步骤进行操作。

2023-11-07 09:54:22 381

原创 STM32CubeIDE高亮显示选中元素

2023-11-04 15:40:36 243

原创 笔记-LVGL的动态创建与静态创建

通过在初始化阶段创建所有的界面并隐藏起来,可以避免在运行时动态创建界面的开销。这样在需要显示某个界面时,只需将其从隐藏状态切换到可见状态,无需再进行创建操作,因此响应速度较快。然而,如果项目对内存占用有严格的要求,或者有大量的复杂界面需要管理,那么可以考虑在需要时动态创建界面。总之,静态创建界面是LVGL中常用的做法,它可以提高响应速度和性能。然而,具体使用哪种方式取决于项目的需求和资源限制。另外,通过预创建界面,还可以在初始化阶段设置各个界面的初始状态、位置、样式等属性,方便后续的界面切换和交互操作。

2023-11-04 10:56:02 506

原创 STM32CubeIDE中文

【Windows】——【Preferences】——【General】——【Appearance】——【Colors and Fonts】——【Edit】——【把“西欧字符”改成“中欧字符”】如果你在CubeMX生成的文件里面写了中文注释,然后又使用CubeMX再次生成,那么你原来写的中文注释就会有部分乱码。解决方案:尽量不要在CubeMX生成的文件里面写中文注释,应该在自己创建的文件里面写中文注释。

2023-10-24 10:07:16 1111

原创 笔记——__attribute__、inline、section

总而言之,使用。

2023-10-21 14:19:12 202 1

原创 构建STM32CubeIDE工程时出现的问题

我查到的一些信息说【caddr_t】是一种非常古老的类型,可能在【void*】被创建出来之前就存在了,似乎【caddr_t】与【void*】的作用是相同的。因为在【types.h】里定义了【caddr_t】,【typedef char * caddr_t;【stat.h】里【#include <sys/types.h>】,所以【#include <sys/stat.h>】也可以解决问题。但是我在【types.h】却里面看到【caddr_t】是用来代替【char*】的,这就有矛盾了。

2023-10-11 08:29:56 1415 1

原创 结构体的初始化(笔记)

除了第一点,其他的可以看这篇文章,不过他没有讲到第一点。其中结构体类型名和结构体变量名列表都是不是必须的。先复习一下结构体类型的声明,与结构体变量的创建。结构体的指定初始化器。

2023-10-10 21:02:36 61 1

原创 最高分与最低分之差——三种写法

一共循环了三次,一次循环输入,一次循环找最大值,一次循环找最小值。一共循环了两次,一次循环输入,一次循环同时找最大值、最小值。一共循环了一次,一次循环同时输入、找最大值、最小值。

2023-10-06 16:57:44 123 1

原创 位操作符,原码、反码、补码(笔记)

转化为原码(补码-1得到1111 1110,再将数值为按位取反1000 0001),结果为1000 0001,转化为十进制,(-1)补码转化为十进制可以用位权来进行转化,例如,补码1011(负数),十进制(-8)+2+1=(-5)对补码进行按位取反,得到1111 1000,这是一个负数,赋值给了a1,是a1的补码。按位取反是对补码进行操作的,取反后的值,也是以补码的形式存储的。减去一个数,等于加上这个数的补码,,,这句话其实是不严谨的,,,按位取反】,原码为1000 1000,转化为十进制,为-8。

2023-10-04 22:30:58 212 1

原创 比特扫雷,实现了利用递归来展开(有详细注释)

在game.c的144行,可以调整递归的次数,一般来说,我程序中设置的次数就可以把能展开的地方全部展开了,但是也试过没能把能展开的地方全部展开。再创建一个数组Mark,用来标记哪个坐标被检查过了。这样可以极大加快程序的速度。标记功能也可以在这个数组上实现。在程序中,无论一个坐标之前是否被检查过,都会再次检查,这导致了程序效率较低。仍有许多需要改进的地方,但是如果不在乎效率,这个代码已经可以正确运行了。这份递归的次数不是程序控制的,而是我们自己来控制的。由于时间关系,就不继续改了。

2023-10-04 14:09:20 61 1

原创 笔记-三子棋

我在game.h只放了外部可能会用到的东西。判断游戏结果处还没有进行扩展。

2023-10-02 21:38:30 41 1

原创 const的用法 ,const与指针

文章内容参考了《C Primer Plus》第六版的P300。

2023-09-30 14:05:47 46

原创 C语言,对于数组、数组名、数组元素、字符串、指针的一些总结

仅仅有地址,我们通常是无法计算数组的长度的,所以在将数组作为参数传递给函数时,通常还会吧数组的大小给传进去。在开头就说了, 数组名不是指针,但是除了作为sizeof()和&的操作数,编译器会将数组名。数组名不是指针,但是除了作为sizeof()和&的操作数,编译器会将数组名。将数组作为参数传递给函数,有两种方法(两种方法的本质是一样的,只是书写形式不一样)sizeof(a)——》得到数组a占用内存的大小,单位为字节。a与&a是一样的——》得到数组的地址(数组首元素的地址)调用方式是一样的,都是。

2023-09-29 13:29:48 283 1

原创 使用CubeIDE的一些经验(代码补全、声明/定义跳转、搜索)

如果是在函数内(大括号内)使用快捷键【Alt + /】,那它可以很好地发挥作用。但是如果是在函数外(大括号外)使用快捷键【Alt + /】,那么它提示的内容中,只有使用typedef重新命名的内容以及宏定义的内容,其他的,函数、枚举量什么的,不会出现在提示框内。声明/定义跳转快捷键是【F3】或者【ctrl + 鼠标左键】,个人测试,感觉【F3】和【ctrl + 鼠标左键】的效果是一样的。快捷键【Alt + /】的使用是有限制的。下图中选中的是【content assist】,即【代码补全】。

2023-09-26 18:28:44 3786

原创 CubeIDE使用国产版ST-Link/V2升级固件失败(已解决)

总结:不能升级固件的ST-Link的芯片是CKSF103C8T6,而芯片是STM32F103C8T6的ST-Link可以正常升级固件。搞了一个ST-Link,想用来下载和调试程序,但是CubeIDE说我的ST-Link的固件版本太老,要强制升级,不升级不让用。最后发现,更新不了固件的ST-Link的芯片是CKSF103C8T6,它的提示是这样的:先说更新失败,请再次尝试。注意看,我现在的版本时V2J37S7,需要更新到的版本是V2J42S7。查了一些资料,说前者是后者的国产替代品,正常来说是一样的。

2023-09-25 11:46:18 3922 1

原创 I2C与CAN的地址与标识符的区别

CAN总线上的设备没有地址。但是CAN总线上传输的每个帧都有一个标识符(identifier,ID)。CAN总线上有设备在发送数据时,其他所有的设备都可以接收到,但是设备对对帧的ID进行分析。如果是该设备需要的数据,才会接收并进一步进行处理,如果不是,会自动忽略。I2C总线上的每个设备都有一个7位或者10位的从机地址,主设备发起通信时,首先发送目标设备的地址,只有地址对应的从设备才会做出反应。CAN上的设备(节点)没有主从之分。I2C上的设备一般来说是一主多从。

2023-09-13 22:30:32 242 1

原创 关于HAL库中的结构体指针的疑问

如果发生了RTC周期唤醒中断,会调用相应的ISR, 在ISR里面,调用了相应的通用处理函数,这个通用处理函数需要一个参数——指向结构体hrtc类型的结构体指针,所以这里的操作是&hrtc,取出结构体hrtc的地址,传进这个函数。在调用函数HAL_RTC_GetTime时,hrtc前面没有&,而sTime前面有&,这有点奇怪,根据我的经验,应该前面都有&才对的,为什么会这样呢?不需要对参数hrtc取地址,否则得到的,是存放结构体hrtc的地址的参数hrtc的地址,不是结构体hrtc的地址。

2023-08-27 17:04:58 47

原创 JTAG、SWD、DAP、STLink、JLink、ULink这些东西的关系

第一点,仿真器往往只适用于那些内核中不含有硬件调试模块的MCU,比如51单片机,这种MCU不能进行调试,如果想要进行调试,只能使用仿真器。第二点,仿真器的价格贵,而且不通用。因为在STM32单片机中,Cortex-M内核含有硬件调试模块,可以进行调试,不需要另外的、单独的仿真器。我们只需要使用仿真器将电脑和MCU连接起来,再配置一下相关的设置,就可以进行调试了。比如51单片机的仿真器,它相对于51单片机,主要就是多了一个调试的功能(参考普中的51仿真器)。仿真器分为两种,软件仿真器和硬件仿真器。

2023-08-26 15:25:11 7181

原创 STM32发生定时器中断后,各种参数、函数的调用过程

通用定时器和高级定时器有多个事件。最近学STM32F407,学到定时器的一些操作,ISR、IRQ、更新事件什么的,有些乱,所以就特地花时间整理了一下,于是有了这一篇笔记。下图是定时器6的ISR,对应的中断号是54,中断名称为TIM6_DAC,这个中断号代表了TIM6全局中断,DAC1和DAC2下溢错误中断。如果判断中断事件类型是捕获/比较通道x事件,在捕获/比较通道x事件里面还会判断这个事件是输入捕获事件还是输出比较事件。上图有2个ISR,因为中断号代表的中断不同,所以它们的ISR的名称也不一样。

2023-08-18 17:12:51 823 1

原创 使用SysTick进行us、ms延时

/使能定时器SysTick,//在不进行重装,HCLK=72Mhz的情况下,SysTick最多延时(1/9M)*(2^24)=1.86s。//失能定时器SysTick,//使用下面这种方法是可以的,但是下面这种方法没有进行重装载,最多只能延时1.86s。CTRL,control and status register,控制及状态寄存器。SysTick包含在M3/M4/M7内核里,核心是一个24位的递减计数器。SysTick,系统滴答定时器,也可以称为。SysTick有三个寄存器,分别是。

2023-08-15 11:14:11 422 1

原创 STM32CubeIDE 创建 / 导入 .c / .h 文件

我们将会按照以下步骤进行操作在CubeMX创建一个最简单的工程将CubeMX创建的工程导入到CubeIDE创建用于演示的ADD.c文件和ADD.h文件将ADD.h添加到头文件搜索路径将ADD.c添加到源文件搜索路径在ADD.c文件内定义一个加法函数,在ADD.h文件声明这个函数,在main.c调用这个函数,构建项目,如果构建没有问题,就说明我们成功了

2023-08-10 15:26:34 10451 1

原创 MATLAB基于霍夫变换进行电流表表盘指针识别

现在把这个小项目搬到网上,虽然我的这个程序简单且不具备普适性,但是作为一个参考还是不错的,希望可以帮助到一些人。这是一幅电器柜上的电表图像,试采用图像处理与分析技术,设计适当的算法和程序,找出电流表所在的区域,提取其指针位置,计算指针与表盘与表盘下沿的夹角,进而判断当前电表的读数(提示:电流表的读数范围为0~400A)。利用这个BoundingBox,创建一个Mask(遮罩)图像,BoundingBox内部的区域为1,外部的区域为0。①Area,面积,连通区域的面积。霍夫变换的学习可以观看这个视频。

2023-08-08 21:46:43 288 1

原创 STM32中MspInit的一些知识

②HAL_PPP_Init()会调用HAL_PPP_MspInit(),如HAL_USART_MspInit(),进行一些与具体硬件有关的初始化设置,比如具体的GPIO引脚(此时初始化的内容会因为具体的MCU型号的不同而不同)①执行HAL_PPP_Init(),如HAL_USART_Init(),进行一些与具体硬件无关的初始化设置,比如波特率、奇偶校验位等(此时初始化的内容与具体的MCU型号无关,在不同的MCU上都是一样的)此时,HAL_Init()调用的HAL_MspInit()就是用户重新实现的那个。

2023-08-07 23:35:19 2121

原创 C语言宏MIN

运算过程:先计算【表达式1】的值,如果为真,那么【表达式2】的值就是【整个条件表达式】的值,否则,【表达式3】的值就是【整个条件表达式】的值。我给出的两个答案的区别,在于【表达式1】整体是否用括号括起来,在我的测试当中,这两种都是可以的。答案②就是能加上括号的地方都加上了括号。答案:保证在替换之后,运算的方式(运算的优先级)仍然按照我们设定好的方式(优先级)来进行。我们的所设想的,是找出a,b中小的那一个,再乘以2,再赋值给result。当然,我们也可以更进一步,就是能加上括号的地方都可以加上括号。

2023-06-24 11:24:17 268 1

空空如也

空空如也

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

TA关注的人

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