自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(193)
  • 资源 (1)
  • 收藏
  • 关注

原创 代码实现,定时器实现输出PWM脉冲【感谢关注】

我们在使用单品机时,常常用到定时器比较功能,来生成PWM脉冲。今天我们就讲一下定时器生成PWM脉冲的相关实现和涉及的相关概念。我们在用户手册(以GD32F4xx为例)中,可以看到只有高级和通用定时器具备捕获/比较功能。基本定时器是不具备捕获/比较功能的。比较:当定时器计数器的值达到预设的阈值时,触发特定操作。这是定时器实现PWM输出、事件触发等功能的底层机制。捕获:定时器检测外部信号的边沿(如上升沿或下降沿),并记录此时计数器的值。用于计算信号的特征参数(如频率、脉宽、相位差等)

2025-06-03 18:09:44 519

原创 DMA配置详解,含代码实现【建议收藏】

DMA技术概述与GD32F4xx实现 DMA(直接存储区访问)是一种允许外设与内存直接传输数据的技术,避免了CPU频繁干预。GD32F4xx系列微控制器配备两个DMA控制器,每个控制器具有8个独立通道,支持多种传输模式: 工作模式:包括存储器到外设、外设到存储器以及存储器到存储器三种传输方向 地址管理:支持固定或递增的地址生成方式 循环模式:实现数据传输的自动循环 中断机制:提供完整的传输完成、错误检测等中断功能 GD32固件库提供了详细的数据结构和配置函数,通过结构体参数可灵活设置外设地址、内存地址、数据

2025-05-27 17:21:59 161

原创 ADC 单次转换、连续转换、扫描转换和间接转换模式 详解。

上节我们 讲解了什么是ADC, 如何用ADC,讲解了ADC,以及ADC的规则组和注入组。这一篇,我们讲一下ADC的转换模式。什么是ADC的转换模式呢?ADC转换完成后,数据是放入数据寄存器的。但何时何种方式转换?这与ADC的转换模式相关。

2025-05-22 14:56:07 395

原创 GD32高级定时器正交编码器模式详解(含代码)

本文记录笔者在使用高级定时器正交解码器模式时,遇到的一些问题。本文程序实现的是高级定时器TIMER7捕获 电机编码器反馈的AB相正交脉冲信号,来获得电机脉冲值。所谓正交脉冲信号,是指 相位相差90°的脉冲信号。在步进和伺服电机中应用广泛。笔者认为读者还是有必要了解一下正交脉冲信号是什么?如果用来计量电机所走的位置、方向和速度的。请参考正交脉冲信号在电机中的作用主要用到的库函数声明都在gd324xx_timer.h文件中。/* enable a TIMER 使能TIMER*/

2025-05-20 17:50:18 609

原创 计算机专业从业者的心得体会【建议收藏】

计算机专业作为一门广泛且高薪的领域,吸引了大量学生和跨专业从业者,导致就业竞争加剧,尤其是低端技术岗位。计算机行业重视技术能力,择业者应注重技术深度,掌握底层原理如计算机体系架构、操作系统等。就业机会主要集中在北上广深及省会城市,但竞争激烈,弱势城市则通过政策吸引人才。工作中,从业者需完成身份转变,独立解决问题,善于规划与总结,保持学习,多角度思考,并认识到自己是职业发展的第一责任人。

2025-05-14 11:34:55 852

原创 伺服电机AB相输出,接入定时器通道,对定时器IO口的速率有何要求【详细分析】

首先,要理解标题"伺服电机AB相输出,接入定时器通道,对定时器IO口的速率有何要求"这句话,主体是伺服电机 AB相输出,指的的伺服电机反馈的AB相信号,不是步进电机。因为步进电机一般是脉冲信号驱动,而不带反馈的(也可以给步进电机加上反馈,一种常见的方法是带上编码器,但这实际上就有伺服电机的味道了。具体可参考其次,AB相信号是什么东西?AB相信号是A相和B项的合称,A相B相都是脉冲信号,A相B相相差90度,因此AB相属于正交信号。A相一般是与电机旋转同步的基准脉冲信号。B相是与A相 相位相差90度的脉冲信号。

2025-04-27 14:52:02 924

原创 ADC工作原理,规则通道,注入通道详解!【求关注和收藏!】

在转换时,ADC的这16个通道又分为两种,一个是规则通道,一个是注入通道。也就是说这16个外部通道,哪一个是规则通道,哪一个是注入通道,是可以配置的。注入通道是一个插入通道,当规则通道转换过程中,来了一个注入通道,则先转换注入通道,注入通道转换完成后,再转换规则通道。以STM32的ADC为例,拥有19个通道,其中包括16个外部通道,三个内部通道(只有ADC1,ADC2和ADC3才有)。顾名思义,外部通道是外部输入到ADC的通道,一般是复用的GPIO端口,通过GPIO端口对应到 相应的通道上。

2025-04-21 17:40:08 1061

原创 拿到例程后,端口如何改?手把手教你写RS232和RS485驱动代码【求关注!】

很多搞嵌入式软开的新手,拿到一份例程后,也不知道如何结合硬件所分配的口线来修改代码。本文,就从最基础的知识点讲起。让大家知道如何看芯片datasheet,如何看引脚分配表(口线分配表),如何结合具体的口线分配,来配置底层驱动代码。相关文档:1.芯片Datasheet2.引脚分配表3.原理图4.例程代码解释:1.芯片Datasheet: 芯片制造商提供的技术文档,包含电气特性、引脚定义、功能描述、时序图等核心参数。是电路工程师设计电路、调试硬件的必备参考资料。

2025-04-16 16:58:19 707

原创 光耦的作用、接线和原理【求关注!】

如图,左边是一个发光二极管,是单向导通的,只要给二极管供电,二极管后接的Led小灯就会发光。右边的光电三极管感受到光源后,就会导通。隔离高压与低压:阻断输入侧(如高压控制电路)与输出侧(如低压逻辑电路)的直接电气连接,防止高电压冲击损坏敏感元件。光耦是电路中常见的器件,全称是 光电耦合器。了解光耦的工作原理后,大家就直到 它为什么叫做光电耦合器了。将输入端的电信号转换为光信号,再通过输出端的光敏元件恢复为电信号,实现跨隔离区域的信号传递。阻断共模噪声和瞬态干扰(如电机启停、继电器动作产生的噪声)。

2025-04-11 12:54:41 361

原创 正交脉冲信号在电机中的作用【求关注,求收藏!】

正交脉冲信号是正交信号和脉冲信号两个概念的叠加。脉冲信号是随时间不连续,离散的信号,比较典型的脉冲信号是方波。正交信号是相位相差90度的,幅度,周期等无差别的两个信号。这样的两个信号,它们相乘的积分为0,数学上叫“正交性”。

2025-04-11 10:00:23 1072

原创 Keil5使用技巧大全:代码注释、跳转函数定义等【建议收藏】

工欲善其事,必先利其器。客观说,keil IDE相比于Visual Studio / Visual Stdio Code等IED使用起来并不是很方便。当打开一个项目时,我们希望:1.快速跳转到函数定义2.快速跳转到函数声明3.参看符号所有引用4.快速注释选中的多行代码5.为代码取消注释本文讲一下,通过为Keil配置快捷键的方式来方便地使用上述功能。

2025-04-09 16:26:25 1758

原创 GD32F407开发环境搭建

笔者近期做一个嵌入式项目,要使用国产芯片,根据需求,选用了GD32F407VG芯片。STM32系列开发板,有正点原子,野火等配置了详细的例程。遗憾的是,只有野火仅支持了一款GD32H759芯片(M7内核),并没有GD32F407芯片。继续查找相关厂家,有一些小厂家有做GD系列的开发板,并配备了相应的例程,但大多数都是基于标准库,hal库并不完备(甚至GD32的厂家兆易创新本身也只有F3xx系列以下提供了hal库例程,F4xx都是一些标准库)。

2025-04-07 17:01:28 819

原创 上位机和下位机差异(1):上位机是高配板的下位机,下位机是低配版的上位机,二者本质是一样的

上位机和下位机这个概念其实是一个比较形象的说法,我们一般把运行在电脑上的软件称为上位机软件,把运行在嵌入式芯片的软件称为下位机软件。

2025-03-20 11:32:53 501

原创 51芯片内存分配详解(data,xdata,bit,code)和address space overflow问题

如果读写要了解51单片机的详细内容,建议读51芯片手册。本文结合笔者使用51单片机的情况,谈一下51单片机的存储和内存分配。以及当空间超出时的,代码优化问题。

2025-03-11 11:44:49 860

原创 STM32启动文件解析【建议收藏】

启动文件,即复位后,首先执行的文件。我们可以想象一下,程序如何去执行?首先,得有编译后的二进制文件。其次,得有执行指令的硬件,对嵌入式来说就是处理器MCU 最后,我们知道程序执行需要堆栈,而且是从程序计数器PC中取得将要执行的下一条指令的地址的。因此,在程序执行前,应当初始化栈顶指针,初始化程序计数器。还需要哪些东西呢?时钟是需要的吧,因此需要初始化时钟。中断向量表是不是也要初始化呢?需要的,如果没有初始化中断向量表,就进入了main函数中执行,那一旦产生中断就没有进入相应的中断处理函数中执行。

2025-03-04 13:41:36 991

原创 电脑不用的时候,网络自动掉线。打开后,又重新联网。关闭网卡休眠,解决此问题!

选择电源管理,把“允许计算机关闭此设备以节约电源”的勾选去掉!打开网络适配器,右键属性。

2025-02-21 10:55:36 178

原创 if(0)和#if(0)的区别

了解if(0)和#if(0)的区别,需要对从源程序到可执行程序的过程,即预处理,编译有了解。

2025-02-18 11:24:45 432

原创 C Primer Plus 读书笔记,精简实用,建议收藏!

思考下,为什么要有函数?函数的声明有什么作用?在一个大型项目中,源文件的编译是有顺序的。当在编译一个文件时,遇到函数fun1调用fun2。此时编译器如何对调用fun2做检查呢?比如检查参数个数和类型是否正确。但是当此时编译器可能还未遇到fun2的定义,因此不知道如何检查fun2函数调用的是否正确。此时,就需要提前告诉编译器该函数的原型。这就是声明的作用。函数调用:函数调用过程,需要开辟栈帧空间,把参数和返回地址进行压栈。调用结束后,再返回调用处。

2025-02-07 18:50:11 794 2

原创 C++面经之const用法:常变量,常量指针,指向常量的指针,const 函数

const可以用来修饰普通变量、指针、函数等,const用来修饰的符号,除了赋初值的情况下,其余情况不可修改,也就是说只支持读不支持写。因const修改的不可变,因此const在大型项目开发中广泛用于修改函数参数,来保证外部接口传来的参数不被修改。非const变量不能赋值给const变量(初始化除外),反之可以。非const函数可以调用const函数,反之也可以。const常变量在编译期期间,就会检查错误。const函数中,任何变量不可修改。

2024-12-18 09:41:23 278

原创 深入理解计算机系统之汇编与链接,建议收藏!

程序员需要了解一个程序如何从源文件变成可执行程序的过程。概括请参考深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接。本文主要将分析一下源程序生成的汇编文件和链接器链接过程。

2024-12-16 16:29:39 464

原创 深入理解计算机系统:缓冲区溢出、内存越界访问和栈破坏检测

基于栈存在缓冲区溢出和内存访问越界的特点(其实就是我们常说的“踩内存”),编译器一般都会带有基本的栈破坏检测功能,原理就是在变量或返回的地址周围插入一段特殊的区域redzones,当这段区域被访问时,就可以知道一定是发生了踩内存。举例说明,函数调用时,需要把压栈和出栈。如fun1调用fun2,那么需要把传入fun2的参数和当前fun1执行所在的地址进行压栈,以便函数返回时,能够返回fun1原本的位置,使得fun1得以继续执行。如果这段内存是只读属性的,别处的缓冲区再溢出,也无法覆盖我此处内存的数据。

2024-12-11 10:19:52 458 2

原创 一个函数无法打断点,可能的原因:该函数没有被链接

问题描述:问个技术问题:keil C51在之前的老程序上增加了一个xx.c文件,里面有个方法fun(),然后原来的main.c中会调用xx.c文件的fun()函数。现在有个问题是:如果按照这个写法,fun()调用不到。但那fun()的定义移到main.c是可以的。不知道为什么?同时,按照最初的方法,断点调试时,fun()里面也无法打上断点。给我的感觉是这个函数就没有被链接到可执行文件。但编译也没有报错,不知道问题出在哪了。和群友讨论了一下:怀疑在编译main.c文件时,有一些告警被忽略了。

2024-12-02 16:41:24 312

原创 DB9接口定义和接线

在单片机和DB9的公头连线时,单片机的芯片的TX输出引脚最终要接到DB9公头的TX引脚上。另外,对于同一根,假如有两个DB9口,一个公头和一个母头,其内部连线,DB9公头的TX线是和DB9母头的哪个引脚是相通的,即是同一根线?逻辑电平不同:电脑COM口是RS232电平,UART是TTL电平,电平标准不同,不能直接相连,需要电平转换芯片(MAX3232等)。对单片机来说,往外发出信号的线我们叫发端,TX。对计算机来说,收信号的线,我们叫收端,RX.对单片机来说,收信号的线,我们叫收端,RX.

2024-11-28 16:08:33 4408 2

原创 深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接

从一个高级语言到可执行程序,要经过预处理、编译,汇编和链接四个过程。大家可以思考下,为什么要有这样的过程?我们学习计算机之处,就应该了解到,计算机能够识别的只有二进制语言(这是本身硬件特点决定的)。计算机刚诞生时,程序员写的就是二进制语言(机器语言),也就是0101的代码串。但机器语言的缺点也是非常明显的(和人类自然语言相差过大,难以理解,难以编写,难以维护)。

2024-11-28 11:23:44 1403 3

原创 C51程序优化,减少data空间占用

这两天搞了一下51单片机。开发工具使用的keil,踩了一些坑,记录一下。产品选型,用的C8051F120,片上RAM是256字节,但只有低128字节可用于直接寻址。

2024-11-27 14:08:29 421

原创 一文理解脉冲信号

脉冲信号是时域上不连续,离散的信号。脉冲信号常用于数字信号处理中。常见的脉冲信号如方波。

2024-11-19 13:48:18 1188

原创 strtok_s详解,实现使用strtok_s分割字符串,并返回包含分割符的子串

strtok_s 是一个线程安全的字符串分割函数,它是 strtok 的一个变体,用于将字符串分割成一系列的标记(tokens)。与 strtok 不同,strtok_s 需要一个额外的参数来保存上下文信息,这样它就可以在不同的调用之间保持状态,而不需要使用静态变量。在第一次调用时,strtok_s 会在 str 中查找第一个不属于 delim 中的字符,并将其视为标记的开始。delim 中的字符或字符串的末尾,此时它会将找到的标记的末尾设置为空字符(\0),并返回指向标记的指针。str:要分割的字符串。

2024-11-12 12:54:49 1567

原创 嵌入式调试手段:使用串口工具(二)

这是嵌入式调试手段之使用串口工具的第二篇,第一篇参见嵌入式调试手段(一):使用串口工具嵌入式调试中,我们常常需要通过串口抓取发送或接收的数据和时序,以便对问题进行分析。更进一步,我们可能需要在不破坏原有系统正常工作的前提下,抓取到下位机发送或接收的数据和时序。常见的嵌入式系统(包含上位机和下位机)一是由用于工业控制的计算机、单片机以及感知或动作单元组成。位于计算机上的上位机负责监控和控制整个系统的运行,通过友好的可视化界面与用户进行交互,传递用户操作命令或者把结果呈现给用户。

2024-11-12 10:54:16 429

转载 ASCii码表(十六进制、十进制和字符和字符释义)

ASCii码对照表:https://tool.ip138.com/ascii_code/

2024-11-06 13:23:02 257

原创 嵌入式调试手段(一):使用串口工具

嵌入式开发和纯软件开发一大不同在于调试工具和方法,因嵌入式开发本身特点,其相对传软件开发的调试手段和调试技巧要求得更高一些。比如,如何看这个信号通不通,可能就需要使用示波器等工具。如何看通信发的命令对不对,可能需要串口工具把命令接收打印出来。一般,常规得嵌入式项目,首先要把通信调通,在此基础上再调试业务逻辑代码。本文讲一下,如何借助串口工具来调试嵌入式程序。来看下面这个例子。

2024-11-04 10:17:56 570 1

原创 c语言实现一个日志系统,记录程序运行状态,提供可维可测手段!

在一个正式的项目中,设计一个日志系统是很有必要的。当程序执行不符合预期,一个日志有助于我们分析程序运行的状态,进而定位到异常点。设计一个日志系统,应该从下面几点进行考虑:1.日志函数是对外提供接口供调用?会不会有多处调用,同时写文件?如何解决IO一致问题2.通过一个单独的线程来处理写日志?3.日志中,应该保存哪些信息?4.运行过程中,日志文件会不断增大。日志文件大小如何设置?5.如何兼顾性能?日志文件要有相应的宏开关

2024-10-30 10:28:56 504

原创 一文搞懂指令周期,机器周期和时钟周期

指令周期:一个指令,从取值到执行的全部周期。一个指令执行过程包括取值,译码和执行阶段。时钟周期:时钟频率的倒数,一般为系统最小的时间刻度。机器周期:,取指、间址、执行和中断等。

2024-10-26 14:41:16 489

原创 一文看懂,为何需要时钟?以及时钟树的基本结构

本文主要介绍时钟的作用以及STM32时钟数的结构。嵌入式常见的时钟源:高速外部时钟(HSE)、低速外部时钟(LSE)、高速内部时钟(HSI)和低速内部时钟(LSI)。LSE为低速外部时钟,HSE为高速外部时钟,它们的时钟源可以是晶振。再往PLL时钟看去,可以看到PLL时钟的时钟源是高速内部时钟HSI和高速外部时钟HSE。往系统时钟看去,PLL时钟,高速内部时钟HSI,高速外部时钟HSE都可以作为系统时钟SYSCLK的时钟源。

2024-10-26 14:15:22 1057

原创 STM32之基本定时器TIM6和TIM7

基本定时器有两个,分别是TIM6和TIM7。它们的计数器都是16位的,也就是意味着取值范围对无符号数来说是0到65535。基本定时器工作时,主要涉及三个寄存器,分别是计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。顾名思义,计数器寄存器(TIMx_CNT)是用来计数的,它的值是从0开始递增。而当计数寄存器的值等于自动重载寄存器(TIMx_ARR)中的值时,就会生 成事件,将相关事件标志位置位,生成中断输出。

2024-10-24 18:15:45 1226 1

原创 存储器层次:寄存器,L1 Cache,主存 Main Memory,磁盘 Local Disk

关于存储器领域,有一个非常经典的图。图中,越往顶,访问速度越快,价格也越贵。L0: 寄存器。L1~L3: Cache,是高速缓存器。L4:主存,DRAM。L5: 本地磁盘。L6: 远端存储器。

2024-10-23 14:05:58 544

原创 射频系统:下行通路,开关,低噪放,AGC,DSDS

射频芯片或射频组件在生活中处处可见,如手机中,如卫星信号收发。所谓射频芯片起作用是把无线电磁波信号接收下来转化为数字信号或者把数字信号转化为无线电磁波信号发送出去。因此,只要涉及到无线通信,几乎都有射频组件。对于射频芯片老说,发送要保证,发的远,且尽可能少的对接收造成干扰。对接收来说,就要在嘈杂环境下还要“听得清”。因此,射频系统设计时就要考虑到上述问题。

2024-10-23 11:41:43 1327

原创 注册函数和回调函数使用讲解

分层模型中,常规的逻辑是,上层调用下层的方法。但也会存在下层调用上层方法的情况,这时如果直接调用调用的话,会使得下层的软件特定于一个上层的软件,降低复用性。而使用注册和回调机制的话,调用者不需要关心具体的实现细节,只需要知道存在一个具有特定原型的函数即可。在回调机制中,一个函数(回调函数)的地址被传递给另一个函数(注册函数),以便在某个事件发生时能够调用这个回调函数。

2024-10-18 14:33:26 1480

原创 程序负载优化,持续更新,建议收藏!

对一个程序来说,内存和负载是两个重点指标。特别是对嵌入式程序来说,本身单片机的主频小,内存少,这就要求 开发工作者必须考虑如何在有限的内存和负载下开展工作。本文主要侧重负载优化。首先介绍负载的概念,其次接收负载优化的理论和思想,最后介绍一些可行的方法。

2024-10-16 17:53:01 519 1

原创 STM32 程序卡着不动,可能是发生了硬件错误,进入了HardFault_Handler处理程序中

STM32 程序卡着不动,可能是发生了硬件错误,进入了HardFault_Handler处理程序中。

2024-10-15 14:16:45 793

原创 MODBUS协议介绍,通过MODBUS协议控制伺服电机工作

modbus协议本身的介绍,请大家自行查阅资料。本文简单介绍一下如何通过MODBUS协议组装控制指令。最近搞了一个项目,要驱动伺服电机工作。通过下位机STM32 407 100封脚 给伺服电机发控制指令。电机和下位机之前的通信采用RS485串口通信,发送和接收数据的格式使用是MODBUS协议。分为读寄存器,即从电机的寄存器里面读值,来获得一些电机的运行状态信息等。读寄存器的格式 地址:功能码:寄存器地址:读寄存器个数:CRC校验。

2024-10-12 09:57:37 1363

python CT切片图像三维重建(数据和代码).zip

python实现CT切片图像的三维重建,包含数据集和代码。

2021-12-25

空空如也

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

TA关注的人

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