- 博客(68)
- 收藏
- 关注
原创 铺铜规则的设置 (通孔焊盘/过孔)
这是因为较小的孔径(12mil)限制了焊锡的通道大小,而合适的焊盘尺寸(30mil)又能够保证过孔有足够的电气连接可靠性。12/30mil 的孔径设置意味着过孔的孔径为 12mil,过孔的焊盘尺寸为 30mil。* 例如,在一些高密度的电子电路板焊接过程中,如果底部接地焊盘的 via 孔径设置不当,焊锡从底部焊盘漏下去后,会使焊接点看起来光亮但实际并没有形成良好的电气连接,这就是虚焊。U4 底部接地焊盘上的via 孔径建议设置为 12/30mil,避免底部焊盘上的焊锡全部漏下去导致虚焊;
2025-05-24 09:49:47
207
原创 GD32F303-IAP的过程和实验
使用的芯片为GD32F303VC什么是IAP呢?有个博主写的很清楚;就是远程升级;我们需要写一个boot 和APP通过 boot对APP的程序进行更新;操作;而不是像单个调试板子那样使用ISP 和 ICP进行烧录;升级过程:上位机和板子进行can通讯;上位机将APP的BIN文件给板子;Boot 进行 0x0801 0000处 的擦除和写入;进而完成APP的更新过程;也可以看我上篇文章 如何进行在 0x0801 0000处进行擦除和写入的;
2025-04-12 11:07:34
338
原创 GD32F303----内部Flash读写
页和扇区是存储介质(如 Flash、硬盘)中管理和操作数据的基本单位,但它们的定义和应用场景有所不同。0x0801 0000页;那么他擦的就是0x0801 0000 - 0x0801 07FF;对齐数据允许CPU通过单次内存操作完成读写,而非对齐数据可能需要多次访问并拼接,显著降低效率。是0x0801 0000 - 0x0801 07FF;”意味着该数据的起始内存地址必须是4的倍数(在STM32中,访问未对齐的32位数据可能导致异常。能看到 页Page的大小为2KB (0x800)
2025-04-12 11:01:12
1042
1
原创 ISP的过程
在ISP过程中,BootLoader的作用是提供通信接口、初始化硬件、擦除和写入Flash存储器,并最终跳转到用户程序。- BootLoader程序会根据接收到的指令,擦除芯片内部Flash存储器中旧的程序代码,然后将新的程序代码写入到指定的地址。在ISP过程中,BootLoader会将新的程序代码写入到主Flash存储器中,而BootLoader本身不会被改动。- BootLoader擦除主Flash存储器中的旧程序代码,并将新的程序代码写入到主Flash存储器。
2025-04-09 18:23:45
336
原创 STM32F103VET6 芯片的主Flash 内存空间大小计算
STM32F103VET6 芯片的主Flash 的内存空间范围是 0x0800 0000 ~ 0x0807 FFFF,共 512KB。
2025-04-09 16:33:27
385
原创 Boot loader嵌入式系统的典型启动流程
上电 → 芯片硬件初始化 → 从系统存储器(0x1FFF0000)执行内置Bootloader → 等待主机通过UART/USB发送烧录指令。某些项目会在用户Flash中实现自己的Bootloader(如IAP升级程序),但这是可选的,且需主动跳转到APP。如果你的项目没有特殊需求(如IAP),烧录后设为BOOT0=0即可,芯片会直接从Flash运行你的代码。了Bootloader(如通过软件跳转),才会进入Bootloader逻辑。是可选功能,需自行实现,与芯片内置Bootloader无关。
2025-04-02 14:02:25
463
1
原创 BOOT启动/SWD接口烧录
SWD烧录不依赖BOOT模式,是更可靠、高效的开发调试方式。优先使用SWD接口,仅在SWD被禁用或硬件不支持时,再通过BOOT0=1进入Bootloader模式补救。若SWD无法连接,重点检查硬件连接、供电和芯片是否被保护。
2025-04-02 13:55:51
1714
原创 swd接口烧录程序
**SWD(Serial Wire Debug)**是ARM Cortex-M内核芯片的调试协议(属于JTAG的简化版),直接通过调试接口(SWCLK、SWDIO)与芯片内核交互,**完全绕过芯片的启动模式(BOOT引脚配置)**。| **特性** | **SWD接口** | **串口/UART(需Bootloader)** |- **SWD烧录不依赖BOOT模式**,是更可靠、高效的开发调试方式。
2025-03-30 10:57:09
457
原创 GD32F303 时钟树 AHB APB1和APB2
systic.c//如果SystemCoreClock为120MHz,那么SysTick时钟频率为120MHz,每1微秒需要120个SysTick时钟周期,1ms需要120 000(SystemCoreClock / 1000U))个SysTick时钟周期:
2025-03-01 17:23:21
392
原创 复用时钟 重映射(Remap)
在GD32微控制器中,**Remap(重映射)**是指通过重新配置某些引脚的功能,将它们从默认功能切换到其他备用功能。1. **解决引脚冲突**:当默认的外设引脚被其他功能占用时,可以通过Remap将外设映射到其他可用的GPIO引脚上。2. **灵活配置**:根据实际需求,将引脚配置为不同的功能,例如将JTAG引脚重新映射为普通IO。
2025-02-24 11:19:37
796
原创 SPI(菊花链和四线制)
菊花链SPI通过串联方式连接从设备,减少了片选线的数量,而四线制SPI为每个从设备提供单独的片选信号,这在多从设备应用中会增加所需的GPIO数量和布线的复杂性。菊花链SPI适合于需要简化布线和减少GPIO数量的场景,而四线制SPI则提供了更灵活的控制方式,适用于需要独立控制每个从设备的场景。在这种配置中,数据从一个从设备传播到下一个从设备,所有从设备同时接收同一SPI时钟。这意味着如果连接多个从设备,需要为每个从设备提供单独的片选线,这会增加所需的GPIO数量和布线的复杂性。
2025-02-21 14:04:59
965
原创 c语言函数(值传递和指针)
值传递传递的是变量的副本。函数内部对形参的修改不会影响原始数据。适用于不需要修改原始数据的场景。引用传递(通过指针)传递的是变量的地址。函数内部可以通过指针修改原始数据。适用于需要修改原始数据的场景。在实际编程中,选择哪种方式取决于你的需求。如果不需要修改原始数据,使用值传递更安全;如果需要修改原始数据,使用指针实现引用传递是更好的选择。
2025-02-19 16:34:22
352
原创 联合体(union)
/CAN通信标识符结构u32 All;struct{//数据段//目标地址//源地址//帧类型,应答,查询//命令//优先权//对齐}Bits;该联合体通过位域将 32 位数据按功能划分,既支持整体操作,也支持按字段访问,适用于需要精确控制位的场景(如嵌入式系统或协议解析)。
2025-02-03 09:40:54
572
原创 焊孔的放置
大面积铺铜,当电流很大的时候,焊盘采用的全链接的方案;但是为了增加牢固性和虚焊风险,加入透锡焊孔,大面积铺铜,当我们采用手焊的时候,焊盘采用的十字链接,焊盘采用的全链接会出现虚焊的风险;今天画板的时候,出现一个放置过锡焊孔的方法;我在这个板子上加入了规则项;什么时候放置过锡焊孔呢;
2025-01-23 10:44:37
203
原创 AHB、 APB1、APB2的联系与区别
AHB和2个APB总线间提供同步连接。APB1操作速度限于36MHz, APB2操作于全速(最高72MHz)。有关连接到每个桥的不同外设的地址映射请参考表1。在每一次复位以后,所有除SRAM和FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟。注意: 当对APB寄存器进行8位或者16位访问时,该访问会被自动转换成32位的访问:桥会自动将8位或者32位的数据扩展以配合32位的向量。
2024-12-10 15:51:30
663
原创 自动控制原理——BliBli站_DR_CAN
极点在左半平面输入为单位冲击,而拉普拉斯变换为1;因此,开环和闭环系统,研究其传递函数的稳定性就可以了。
2024-11-28 17:15:46
308
原创 使用嘉立创和AD进行PCB库的封装
但在这里看到,只有二维的效果,这时候需要去网上去找3D模型。接下来要把再嘉立创上当下来的原理库 和PCB封装复制在。选中两个,按回车 再AD中打开。
2024-10-12 14:30:36
599
原创 STM32和TMSF28335定时器的系统时钟问题
用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。AHB和APB2域的最大频率是72MHz。APB1域的最大允许频率是36MHz。可以看到定时器2在APB1上,二分频,频率为72MHz,则实现72000000/7200/10000 = 1s的计时。
2024-08-29 09:23:08
481
原创 C语言-内存管
在C语言中,内存被划分为以下几个区间:栈(stack):用于存储局部变量和函数的参数。栈是由编译器自动分配和释放的,栈的大小通常是固定的。堆(heap):用于存储动态分配的内存,即使用malloc、calloc或realloc函数分配的内存。堆的大小通常是可变的。全局区(global)或静态区(static):用于存储全局变量和静态变量。这些变量在程序启动时就已经分配好内存,并且在整个程序运行期间都存在。常量区(constant):用于存储字符串常量等不可修改的数据。
2024-08-23 10:50:05
601
原创 const关键字
关键字在 C++ 中是一个非常重要的特性,它用于提供编译时类型检查,增强程序的健壮性、可读性和可维护性。:表明函数不会修改传入参数的内容,这有助于防止意外修改,同时也使得函数可以处理常量对象。可以用来修饰参数或返回值,表示这些参数或返回值在函数内部或外部都不会被修改。还可以用于指针,以区分指针本身是否为常量,以及指针指向的内容是否为常量。可以用来修饰变量,表明这个变量的值在初始化之后就不能被修改。最基本也是最常见的用法。:在函数声明和定义中,
2024-08-22 09:39:12
152
原创 内联函数的基本知识
使用inline关键字:在函数定义前加上inline关键字,表明这是一个内联函数的建议。定义在头文件中:由于内联函数需要在每个调用点展开,因此其定义通常放在头文件中,以便在多个源文件中共享。简单性:内联函数的函数体应该较简单,避免包含复杂的控制流程(如循环、递归调用)或大量的代码,以提高内联成功的可能性和程序的执行效率。inline 返回类型 函数名(参数列表) {// 函数体// 执行的操作和逻辑return 表达式;// 可选的返回语句。
2024-08-21 10:03:55
473
原创 C语言执行过程
需要注意的是,上述阶段中的“加载”和“初始化”通常对最终用户来说是透明的,因为它们在程序开始执行之前就已经完成了。对于C语言程序来说,这通常意味着释放分配的资源(尽管在C中,显式的资源管理是程序员的责任)、关闭文件、调用析构函数(对于C++程序)等。函数调用是程序执行时的一个动态行为,它涉及到栈的使用(用于保存调用者的上下文信息,如局部变量、返回地址等),以便在被调用函数执行完毕后能够恢复调用者的执行。因此,尽管函数调用本身不是编译或链接阶段的一个明确步骤,但它是在这些阶段之后,在程序的执行阶段发生的。
2024-08-20 17:26:42
638
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人