自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 GD32芯片PA14PA15PB3PB4口线用作普通IO,需要做特殊配置

摘要:本文分析了GD32F407芯片PB3引脚无法作为普通GPIO输入的问题。PB3默认为JTDO功能,需通过配置SYSCFG_CFG1寄存器释放为普通IO。针对不同芯片版本提供了解决方案:低版本使用标准库函数gpio_pin_remap_config,高版本需直接操作SYSCFG寄存器。文中给出了详细的配置代码,并对比了SWD与JTAG调试接口的差异,指出通过禁用JTAG保留SWD可释放PB3等引脚。最后总结了两种调试方式的优缺点,建议在ARM Cortex-M开发中优先使用SWD模式以节省GPIO资源。

2026-02-28 09:41:03 598

原创 GD32芯片标准库实现:定时器捕获一定数目脉冲,触发某个事件

摘要:本文介绍了GD32F407芯片使用标准库实现定时器捕获脉冲的两种方法。第一种通过定时器捕获中断,在每个脉冲触发中断并计数,达到10个脉冲时置位逻辑标志。第二种利用定时器溢出中断,配置时基单元周期为10个脉冲,直接触发更新中断。两种方法均详细展示了GPIO初始化、定时器配置及中断处理代码,为脉冲计数应用提供了灵活的实现方案。

2026-02-11 17:02:01 414

原创 代码实现触发ADC特定通道进行采数

本文介绍了如何在GD32F407芯片上实现ADC通道的软件触发采样。主要内容包括:1)ADC初始化配置,提前设置所有可能用到的通道;2)中断处理中读取采样数据并设置标志位;3)通过trigger_adc_channel()函数实现特定通道的软件触发采样;4)主程序中调用示例。该方法可在代码执行到特定位置时灵活触发ADC采样,适用于需要按需采集多通道数据的应用场景。

2026-02-02 11:46:22 598

原创 RS485通信,无法进入中断处理程序,问题分析过程

摘要:开发板通过RS485与设备通信时无法接收反馈数据。排查发现两个关键问题:1)硬件方面,RS485使能引脚RE被错误配置为PA7而非PD7,导致始终为高电平;2)软件方面,中断处理程序名称与中断向量表中的定义不一致,导致无法进入中断。解决方法包括修正引脚配置和确保中断处理程序名称一致。该问题凸显了硬件配置准确性和中断处理程序命名一致性的重要性,同时指出编译器不会对未引用的中断处理程序报错这一特殊情况。

2026-01-24 16:08:44 987

原创 一文搞清cmake,cmakelist,makefile,make,gcc等的关系

本文梳理了Linux项目中构建工具的关系链:GCC/G++负责编译,但项目庞大时手动执行不便;Make工具通过Makefile文件批量执行编译命令;而CMake则进一步简化,通过CMakeLists.txt自动生成跨平台的Makefile。整个过程形成工具链:CMake→Makefile→Make→GCC。文章还提供了相关工具的语法教程链接,并指出团队协作中通常由专人配置CMakeLists,开发者只需安装CMake即可完成构建。最后邀请读者留言交流。

2025-09-12 10:53:21 814

原创 【精品文档】步进电机原理讲解和程序控制步进电机加减速运动

摘要:本文介绍了步进电机的控制原理及加减速实现方法。步进电机通过驱动器接收使能信号、方向信号和PWM脉冲,转化为A/B相脉冲信号来控制转子转动。文章详细分析了通过相位差实现正反转的原理,并解释了电机失步现象的原因。针对高速启动时扭矩不足的问题,提出了加减速控制方案,并给出了基于GD32的PWM脉冲控制代码实现,包括定时器配置和电机启停控制函数。

2025-09-06 13:33:50 942

原创 以一个具体问题详解I2C通信过程波形分析【I2C通信,写数据有ack回应,读数据没有ack回应】

摘要:文章分析了I2C通信中温湿度传感器数据读取失败的问题。作者发现读操作时无ACK响应导致数据始终为0,通过示波器波形分析发现从机ACK信号异常。进一步检测发现传感器地线未正确连接,导致主从设备参考电平不一致。文章详细解释了地线缺失如何导致写操作有ACK而读操作无ACK的现象:写操作时信号通过容性耦合勉强工作,但读操作时主机的ACK无法被从机识别。最终解决方案是确保主从设备共地连接。该案例揭示了I2C通信中地线连接的关键作用。

2025-08-26 10:18:40 1041

原创 I2C协议详解【内含好文推荐】

本文简要介绍了I2C总线协议的基本特性。I2C是一种用于芯片间通信的双线协议(SCL时钟线和SDA数据线),其核心包含四个必备特性:开始条件、结束条件、应答机制和7位目标地址。这些特性定义了通信的启停时序、数据传输验证方式以及多从机环境下的地址识别机制。文章通过图示说明了开始条件和应答机制的工作原理,并指出7位地址用于从机设备的选择。全文为学习笔记性质,建议读者参考更权威的协议规范文档获取完整信息。

2025-08-19 18:19:21 614

原创 STM32/GD32芯片 单片机复位功能详解【极力推荐!】

摘要:本文详细讲解了单片机的三种复位类型(系统复位、电源复位和备份域复位),重点分析了系统复位的五种触发条件及实现原理。其中详细介绍了NRST引脚外部复位的电路设计要点,包括上电复位和手动复位实现方式,并阐述了复位后的硬件行为流程,包括寄存器初始化、启动介质选择和复位向量执行等关键步骤。文章还简要提及了通过软件触发复位的操作方法,并指出所有复位类型均可通过RCC_CSR寄存器进行状态查询。

2025-08-14 11:40:13 3113

原创 ADC详解之ADC数字值转化为电压值【参考电压Vref是关键】

摘要:ADC(模数转换器)将模拟电压转换为数字值,其核心转换公式为:电压值 = (数字值 / (2ⁿ-1)) × Vref,其中n为ADC分辨率(如10位、12位),Vref为参考电压。例如,10位ADC(最大1023)在Vref=3.3V时,数字值512对应电压约1.65V。实际应用中需注意参考电压稳定性、输入范围匹配及分辨率选择(高分辨率精度更高但转换时间更长)。另可通过内部参考电压校准公式Vchx=VREFINT×(ADchx/ADrefint)提高精度。

2025-07-24 14:12:54 2725 2

原创 国产GD32芯片,系统时钟配置详解

本文以GD32芯片为例,详细分析了嵌入式系统时钟的配置过程。首先通过时钟树结构图展示了系统时钟SYSCLK的三种来源(内部、外部和PLL时钟),以及AHB/APB分频关系。重点解析了system_clock_168m_8m_hxtal函数中通过RCU寄存器配置PLL参数的过程:包括8MHz外部晶振作为时钟源,PLL预分频系数8,VCO倍频系数336,最终输出168MHz系统时钟。文章还结合代码和芯片手册,详细说明了各分频系数的计算方法和寄存器配置细节,为理解嵌入式系统时钟架构提供了清晰的参考。

2025-07-23 13:27:42 1755

原创 电机选型的核心公式【精品】

本文介绍了电机选型的关键参数和计算方法。核心内容包括:1)电机功率与扭矩、转速的关系(P=T×n);2)加速度计算公式(a=T/J),需考虑电机输出转矩与负载转矩的差值;3)加速度的两种计算方式(基于弧度或转数);4)加速时间计算方法。文章强调选型时要兼顾发热限制和机械系统限制,并通过实例展示了如何根据额定扭矩(0.45N.m)、系统惯量(312g.cm²)和额定功率(145W)计算3000rpm目标转速下的合适加速度设置。最后指出实际应用中需根据控制系统API灵活设置加速度参数。

2025-07-02 11:06:04 5039

原创 定时器捕获PWM脉冲的条件约束分析【同一个定时器的两个通道不能既做输出又作输入】

本文分析了定时器捕获PWM脉冲的条件与频率关系,探讨了奈奎斯特采样定理在PWM测量中的应用。通过实例计算说明定时器时钟频率、预分频值与输入信号频率的约束关系,并提出参数配置算法、临界频率处理技术和超高频处理方案。针对低频PWM和高噪声环境等特殊场景,给出了具体的软件处理方法,包括利用溢出中断计算低频信号周期、自适应滤波器调整等技术,为嵌入式系统中的精确PWM测量提供了系统性的解决方案。

2025-06-07 11:14:52 1053

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

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

2025-06-03 18:09:44 995

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

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

2025-05-27 17:21:59 3935

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

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

2025-05-22 14:56:07 1878

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

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

2025-05-20 17:50:18 1621

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

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

2025-05-14 11:34:55 1016

原创 伺服电机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 1504

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

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

2025-04-21 17:40:08 2131

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

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

2025-04-16 16:58:19 1041

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

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

2025-04-11 12:54:41 896

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

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

2025-04-11 10:00:23 1528

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

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

2025-04-09 16:26:25 4683

原创 GD32F407开发环境搭建

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

2025-04-07 17:01:28 1373 2

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

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

2025-03-20 11:32:53 893

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

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

2025-03-11 11:44:49 1496

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

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

2025-03-04 13:41:36 1235

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

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

2025-02-21 10:55:36 401

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

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

2025-02-18 11:24:45 665

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

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

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

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

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

2024-12-18 09:41:23 386

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

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

2024-12-16 16:29:39 547

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

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

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

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

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

2024-12-02 16:41:24 396

原创 DB9接口定义和接线

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

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

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

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

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

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

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

2024-11-27 14:08:29 643

原创 一文理解脉冲信号

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

2024-11-19 13:48:18 2239

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

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

2024-11-12 12:54:49 1960

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

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

2021-12-25

空空如也

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

TA关注的人

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