自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 W11系统如何清理C盘的临时文件

按 `Ctrl + A` 全选文件,然后按 `Delete` 键删除。- 按 `Win + S`,搜索“cmd”,右键选择“以管理员身份运行”。- 勾选需要清理的项目(如“临时文件”、“Windows更新缓存”等)。- **不要删除系统关键文件**:清理时避免误删系统文件。- **定期清理**:建议定期清理临时文件,保持系统流畅。- **备份重要数据**:清理前确保重要文件已备份。*方法 1:使用系统自带的“存储设置”清理**- 在“存储”页面中,点击“临时文件”。- 点击“删除文件”按钮,确认删除。

2025-02-27 10:28:52 697

原创 基于GD32F4软件看门狗程序

define WDG_TIMER_PERIOD 5000 // 看门狗定时器周期,单位为毫秒。- **定时器初始化**:TIMER6配置为10kHz,定时周期为5000ms,超时后触发中断。- **喂狗频率**:主程序需定期调用`WDG_Feed()`,避免系统复位。- **中断服务函数**:若计数器达到2(即10秒未喂狗),系统复位。- **喂狗函数**:`WDG_Feed()`用于重置看门狗计数器。- **调试**:调试时可能需禁用看门狗,防止频繁复位。// 初始化看门狗定时器。

2025-02-19 14:11:43 271

原创 MYSQL8.30版本 服务开不了问题

2.为什么Win10记事本打开要用UTF8保存才能解析,而WinServer要用ANSI保存才能解析。通过将my.ini保存到其他电脑(Win10),记事本以utf8格式保存,再次复制回MySQL目录。3.用管理员身份打开cmd,进入到mysql的bin目录下,输入命令初始化data文件夹。1. 找到mysql的data文件夹,将data进行备份,一定要备份!等待一定时间,就可以重新初始化数据库,mysql服务也可以启动了。最后利用备份的data文件进行数据的恢复。还可以在服务器以ANSI格式保存。

2024-06-05 14:12:22 413

原创 循环队列中学习

大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。=front(0),对空间长度求余,作用就在此6%6=0=front(0)。}//队列无元素为空。②另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度(所用。

2024-04-23 16:32:37 448

原创 单片机程序跑飞,怎么查找问题

其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断,否则出现造成数据乱套。3、地址溢出,常见错误为指针操作错误 着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。6、堆栈溢出 最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。

2024-04-23 16:31:05 507

原创 STM32单片机内存不够用处理办法

2、程序优化:对代码进行优化,可以通过减少乘除法的运算、提高数组的利用率、变量的范围尽量地缩小、将一些固定的代码数组存到ROM里等手段。1、物理手段:就是在外部添加RAM。

2024-04-23 16:28:04 2236

原创 STM32和GD32启动文件工作学习

从STM32 官方提供的文件中找到启动文件 Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 下有许多启动文件。PRESERVE8;PRESERVE8;调用C库函数_main初始化用户堆栈,从而最终调用main函数去C的世界。配置栈大小, 变量(局部、全局),函数调用。

2024-04-23 16:23:34 624

原创 嵌入式通信数据经常说的大端和小端模式(学习)

但是在C 语言中除了 8 bit 的char之外,还有 16 bit 的 short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如果将多个字节安排的问题。小端模式,刚好相反。大端模式(Big-endian):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端,即正序排列,高尾端;低地址 ------------------> 高地址。低地址 -----------------> 高地址。

2024-03-06 11:24:36 650

原创 五中常见的过压保护

针对输出端电压反灌时间较长的问题,我们可以考虑实施输出端串联二极管的策略,如此一来,反灌电压将被隔离在电源外部,仅能由电源输出,而非外界电压的引入。此外,由于导通压降的影响,输出电压的精确度也可能受到影响。对比1、2两个方案都存在一个光耦,这是因为电源需要做隔离,但其实光耦的价格本身就不算便宜,因此我们思考能否在去掉光耦的同时可以检测输出电压,而需要隔离且不需要用到光耦,自然而然的就会想到常用的变压器等一系列磁芯器件,但增加器件又违背了想要价格更便宜的原则,因此需要在不增加其他器件的基础上实现过压保护。

2024-03-04 11:50:02 1552

原创 简单说一下TTL、RS232、485数据传输,他们的传输距离问题

可能干净的环境(比如实验室、办公室)都还看不出差异,你在复杂的点环境(比如工厂,特别是大型机械设备比价多的环境下)就能感受出差异了。串口的波特率可以做到很高,比如:115200bps,但以这种波特率通过RS232传输,可能传输10米就存在问题。随着电子技术的快速发展,逻辑高电平的电压也是越来越低,比如DDR5内存的供电电压才1.1V。所以,RS458使用差分信号,双绞线,好点的带有屏蔽的线,在工业环境就显优势了。TTL通常在板卡内部(同一块板卡),比如:芯片A的串口,和芯片B的串口通信。

2024-03-04 11:47:42 2055

原创 嵌入式工程师函数变量,常用的命名规则(参考学习)

帕斯卡命名法与驼峰命名法类似,只不过驼峰命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。很多工程师不注重平时编码习惯,比如命名规则,一会大写、一会小写,一会中文拼音,一会下划线等,导致自己写的代码自己都看不懂了。事实上,很多程序设计者在实际命名时会将驼峰命名法和帕斯卡结合使用,例如变量名采用驼峰命名法,而函数采用帕斯卡命名法。单字符的名字也是常用的,如i, j, k等,它们通常可用作函数内的局部变量。据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。

2024-03-04 11:32:26 1183

原创 基于 STM32U5 片内温度传感器正确测算温度

TS_CAL2_TEMP 为校准值 2 的温度值,TS_CAL2 为对应的采样值,对于 STM32U5来说,TS_CAL2_TEMP 为 130℃,对应的采样值存储在 0x0BFA0742 和 0x0BFA0743;TS_CAL1_TEMP 为校准值 1 的温度值,TS_CAL1 为对应的采样值,对于 STM32U5来说,TS_CAL1_TEMP 为 30℃,对应的采样值存储在 0x0BFA0710 和 0x0BFA0711;前面的 ADC 的配置和采样就不说了,我们主要来看一下公式的使用。

2024-02-29 17:35:32 1215

原创 关于连接参数更新进程后导致断连的问题分析

2. 从抓包的 log 信息中发现,主设备实际的发包时间点在 11.477909s,也就是主设备的发包时间先于蓝牙协议中规定的 TransmitWindow 的起始点,导致从设备无法接收到来自主设备的空包,从而无法在同一连接事件(连接事件 35 及后续的 3 个连接事件)中反馈一个空包,进而导致 4 秒监控超时,最终导致断连。上述问题的根本原因是作为主设备的智能手机虽然完成了连接参数更新流程中主从设备之间的交互,但由于其在后续规划的连接事件,规划的射频任务的时间点的偏差而导致了断连。

2024-02-29 17:30:39 405

原创 MCU输出日志和调试信息的几种方法

命令行相信大家不模式,做嵌入式开发的都知道,像Linux的终端就是一个命令行,只是我们这里说的命令行,相对Linux的终端来说要简单的多。比如:我要设置一个 “DBUGE 开关”,在开发测试阶段,我需要打开开关,产品量产后,我不需要开启调试信息输出。其实,很多RTOS都集成了CLI组件,想用其实也不是想象中的那么复杂,和移植RTOS差不多,甚至更简单。所以说,项目需求和复杂不同,其输出调试或日志信息可能有不同的方式,具体要不要实现,还需要综合评估。你要输出信息,肯定要有路径才行啊,是UART,还是CAN。

2024-02-26 13:37:24 1618

原创 嵌入式学习知识点 常用的

linux下注册驱动的时候,将设备号和文件名进行了映射,并实现file_operation里的一些函数,例如,write、read、ioctl。比如:UART、SPI、I2C、USB、ETH、MIPI、EDP、CAN、I2S、HDMI等等。需要了解各接口的使用场景、带宽、机制、时序、工作模式、缺点,时序等等。,稍后的一年时间,有时间我就会慢慢的整理,算是对自己做一个交代,当然如果对别人有用的话,那就更好。并行优化主要是SIMT或SIMD技术的应用,包括GPU的使用,NEON优化、SSE优化等。

2024-01-22 11:05:27 451

原创 嵌入式软件工程师 常用的C语言代码 备用,用的时候不用到处找了?

这些代码示例代表了嵌入式开发中常用的一些利剑级别的C语言工具代码。它们在嵌入式系统开发中具有广泛的应用,有助于优化性能、节省资源并提高代码的可维护性。以下是一些利剑级别的C语言工具代码示例,以及它们的简要讲解。循环队列是一种高效的数据结构,适用于缓冲区和数据流应用,例如串口通信接收缓冲。该函数将给定的无符号整数的位进行反转,可以用于某些嵌入式系统中的位级操作需求。用于创建一个只有指定位被置位的位掩码,可用于位操作。实现简单的位集合数据结构,用于管理一组位的状态。用于在已排序的数组中执行二进制查找的函数。

2024-01-22 11:00:13 538

原创 为什么MCU一般跑RTOS,SoC一般跑嵌入式Linux?

在顺序执行后台程序的时候,如果有中断来临,那么中断会打断后台程序的正常执行流,转而去执行中断服务程序,在中断服务程序里面标记事件,如果事件要处理的事情很简短,则可在中断服务程序里面处理,如果事件要处理的事情比较多,则返回到后台程序里面处理。轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情,大概的伪代码看下方代码块轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。

2024-01-19 16:41:21 1408

原创 单片机通过USB(U盘)升级固件的方法

将U盘插入,开发板上电,当前运行的代码是Bootloader,由于此时尚未执行Application升级,因此LED2常亮,按下复位键,使得Bootloader重新运行,执行Application代码升级,可以看到LED灯按照RA4M3_BLINKY程序闪烁。首先,利用J-Flash Lite将RA4M3整片擦除,然后将ra4m3_hmsc_noRTOS.srec烧写到芯片中,由于此时app部分内容为空,红色LED闪烁(按下reset大概10秒后,红色LED闪烁)。如下图所示,案例使用。

2024-01-19 16:39:01 1696

原创 RTOS多线程抢占工作原理

因此,每个线程都会有用于堆栈的RAM空间,如果线程使用的RAM超过堆栈的数量,则会导致内存溢出或细微的错误。中断可能具有不同的优先级,例如,如果触发了一些低优先级的中断,则当前正在执行的线程将暂停,并且ISR会获得控制权。假如在这过程中有其他线程抢占了,其他线程同样抢占了当前线程V0、 V1,如果不对V0、 V1进行保存,那么下次回来执行当前线程,结果就会出错。请注意,在正在执行的线程A的上下文没有保存在堆栈中,堆栈指针指向线程A用户数据的顶部,并且当前处理器的寄存器专用于线程A。这就是线程的堆栈的内容。

2024-01-19 16:37:11 1284 1

原创 对于初学者来说遇到KEIL在仿真时全局运行时,全局变量watch不变化

一招解决办法:你遇到过么?

2024-01-18 11:23:40 943 2

原创 函数指针与指针函数到底是个啥?

如主函数中为这个类型的 op 变量的 compute 赋值了 add,则 op 的行为就是计算加法,如果再定义一个 op2 并且将其 compute 赋值为 sub,则 op2 就能够计算减法。确实,同样是 “函数” 和 “指针” 两个概念的组合,只是位置的改变,往往会引起初学者的混淆。函数指针的常见用法函数指针往往与多态与模块化相关,利用一个指针变量在不同的场景赋予其不同的功能,从而达到更加灵活的编程方式。“函数指针和指针函数到底是个啥,都是同样的四个字,又是函数又是指针的,到底应该怎么区分?

2024-01-17 14:09:52 809

原创 STM32硬件IIC可以调通的

早就听说STM32的硬件IIC不好用,我个人接触到的很多项目中也都是用模拟IIC来实现对应的操作,但是最近接触到的一个项目中的OLED是IIC接口,当然原本也是用的模拟IIC来实现的刷屏操作,因此效率真的是惨不忍睹。此时STM32的硬件IIC处于busy状态,导致其放弃了后续的IIC操作。,该问题在我调用DMA发送函数发送成功后强制控制IIC的寄存器使其发送一个STOP信号后即可解决。使用硬件STM32硬件IIC经常会遇到IIC驱动死掉的情况。在调试好IIC外设后发现IIC的DMA也不是直接就能使用。

2024-01-17 14:05:25 639

原创 c51 RS485通讯详讲

RS485的接口非常简单,和RS232所使用的MAX232是类似的,只需要一个RS485转换器,就可以直接和我们单片机的UART串行接口连接起来,并且完全使用的是和UART一致的异步串行通信协议。我们把这两个引脚连到一起,平时不发送数据的时候,保持这两个引脚是低电平,让MAX485处于接收状态,当需要发送数据的时候,把这个引脚拉高,发送数据,发送完毕后再拉低这个引脚就可以了。1、我们在讲A/D的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。

2024-01-16 14:58:44 1504 1

原创 大家有没有Keil仿真时,条件明明不满足,还能进入循环的情况?

我遇到在明明赋值条件不满足,但是还是能进入判断成功内?最后退出重新编译一下,再来仿真问题处理完成。

2024-01-12 14:57:51 1148 1

原创 KEIL仿真时,无运行箭头,无法下断点

3,Debug 中load Appliction at Statup 是否打开。

2024-01-05 11:31:44 1295 1

原创 STM32LWIP以太网+DP83848

2024-01-04 10:56:52 548 1

原创 写一段常用的CRC校验函数

main()for(i=0;i<length;i++)getch();;;;;;;;;;;;;;for(i=0;i<size;i++)for(i=0;i<size;i++)for(j=0;j<7;j++)

2024-01-04 10:35:26 860 1

原创 基于LWIPTCP粘包处理

/事务标识符. 默认为0x0000.本例用作RS485串口号:0x0001->UART0、0x0002->UART1、0x0003->UART2、0x0004->UART3。while( ((HTONS(aru->Len)+6) <= tot_len) && (tot_len > 0) ) //adu_rtu帧头为6个字节.

2023-12-19 14:19:28 1521 1

原创 【无标题】STM32 RTC闹钟中断和唤醒待机模式

BKP_ReadBackupRegister(BKP_DR1)代表读取BKP_DR1的值,如果第一次运行这个程序那这个值一定是0X0000,值和0XC0B4不相等就进入配置初始化程序。需要注意RTC的几个要点:1.RTC的值被设定后它就会一直按照设定的基准时间自己递增,如果你的硬件设备上发现一个纽扣电池,那就是给RTC功能供电用的。2.每次STM32复位后这个RTC值它重新计数还是继续计数要考虑清楚3.RTC的值是有上限的,它的最大值就是2的32次方减一,这个数字很大因此不用太关心。

2023-11-01 16:14:09 2159 2

原创 一文弄懂hex文件、bin文件、axf文件的区别

在STM32开发中,经常会碰到hex文件、bin文件、axf文件,这些都是可以烧写到板子里运行的文件。那么,你知道这三个文件有什么区别吗?在回答这个问题之前,我们先来回顾一下C语言编译的过程。

2023-11-01 16:03:19 404 1

原创 STM32F103驱动KT148A语音芯片

*延时6MS --- 这里就是发起通讯的起始信号------注意不同的芯片延时不一样,请自行测试*/- 返回说明:无 -- 这里对应的就是PB9这个GPIO ,不同的MCU,对于IO口的操作不同,这个自己理解了。1、先把数据线DATA,也就是ONELINE,拉低 6ms 后,发送 8 位数据,先发送低位,再发送高位。/*发送的时候,先发送最高位,再发送次高位,以此类推*/==》这样的目的,是为了保证波形的完整性,因为你的,注意是你的mcu运行时候,可能存在。/*延时200us*//*延时600us*/

2023-11-01 15:57:04 151 1

原创 STM32f103单片机TM1616驱动(程序自测可直接使用)

/设置显示控制命令。

2023-09-09 15:46:51 1323 1

原创 GD32 V STM32 兼容性总结学习

位机软件进行烧写应用程序。而V2.1.0版本的 NAK 处理过程如下: else if (hcint.b.nak) { if(hcchar.b.eptype == EP_TYPE_INTR) { UNMASK_HOST_INT_CHH (num);启动时间,GD32 与 STM32 启动时间都是 2ms,实际上 GD 的执行效率快,所 以 ST 的 HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是 2ms,但是这个宏定义值 在 GD 上时间就更加短了,所以要加大这个值的设置。

2023-08-15 10:14:02 1384 1

原创 Keil跳转函数出现No Browse information available

先打开魔术棒-在output 如下图 打钩,再编译一下,解决。

2023-08-15 10:08:47 381 1

原创 5、基于GD32F407 PWM三路输出波形代码总结,测试通过

2、main 函数循环发波,占空比分别为 10 50 100。

2023-07-27 17:42:29 476 1

原创 4、基于GD32F407 iic驱动AT24c32 测试可用

输入参数 : p_buffer 数据 write_address 地址 number_of_byte 数据长度。* 输入参数 : *p_buffer 数据 read_address 地址 number_of_byte 长度。* 输入参数 : p_buffer 数据 write_address 地址 number_of_byte 页。* 函数名  : eeprom_wait_standby_state。

2023-07-27 17:36:42 683 1

原创 3、基于GD32F407 adc DMA配置测试通过

/* enable GPIOC clock */ rcu_periph_clock_enable(RCU_GPIOA); /* enable DMA clock */ rcu_periph_clock_enable(RCU_DMA1); /* enable TIMER1 clock */ rcu_periph_clock_enable(RCU_TIMER1); rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL

2023-07-27 17:27:04 414 1

原创 基于GD32F407 串口配置 收发数据 测试通过

1、串口初始化 /* enable GPIO clock */ rcu_periph_clock_enable(RCU_GPIOD);//使能GPIOA时钟 /* enable USART clock */ rcu_periph_clock_enable(RCU_USART1);//使能USART0时钟 gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_5);//复用功能7 gpio_mode_set(GP

2023-07-27 17:24:10 1709 1

GD32 通过IIC通讯读写外部存储器AT24C32

GD32 通过IIC通讯读写外部存储器AT24C32

2024-01-04

GD32f407 单片机 flash读写

F407擦除读写,包括 32位读写 16位读写 8位读写

2024-01-04

GD32F407ZET6ADC驱动例程 测试可用

/* configure the ADC sync mode */ adc_sync_mode_config(ADC_DAUL_REGULAL_FOLLOW_UP); adc_sync_dma_config(ADC_SYNC_DMA_MODE1); adc_sync_dma_request_after_last_enable(); /* ADC data alignment config */ adc_data_alignment_config(ADC0,ADC_DATAALIGN_RIGHT); adc_data_alignment_config(ADC1,ADC_DATAALIGN_RIGHT); /* ADC scan mode function enable */ adc_special_function_config(ADC0,ADC_SCAN_MODE,ENABLE); adc_special_function_config(ADC1,ADC_SCAN_MODE,ENABLE); /

2023-11-01

STM32F407 LWIP+tftp远程升级程序

STM32F407 LWIP+tftp远程升级程序

2023-06-27

空空如也

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

TA关注的人

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