LPPC
文章平均质量分 60
爱煲汤的夏二
嵌入式MCU小菜鸡
展开
-
啥都没动,xml文件读取失败,原来是文件编码格式问题
CRLF 是 carriage return line feed 的缩写;中文意思是 回车换行。LF 是 line feed 的缩写,中文意思是换行。原创 2024-01-08 17:47:16 · 601 阅读 · 0 评论 -
一个大点的局部数组把freertos任务栈爆了,用ozone+串口分析解决
上述两种方式都可对freertos栈的剩余量进行分析,但ozone显示的栈会比总的栈深略小。但不管是何种方式都能够发现此时的栈已经超过了一开始申请的128*4 = 512字节,需要曾加栈的大小。相比于freertos经典的检测栈溢出的方式,上述方法不仅能够说明栈溢出,还能够判断需要增加的栈的大小。以下为两种freertos经典的检测栈溢出的方式。原创 2024-01-08 14:50:51 · 486 阅读 · 0 评论 -
ozone+SEGGER 调试COTEX-M7+freertos,专为freertos疑难杂症而生
在console窗口下输入我们的命令:Project.SetOSPlugin (“C:\Program Files\SEGGER\Ozone\Plugins\OS\FreeRTOSPlugin_CM7.js”),你是cotex-M7架构就输入CM7,M4架构就输入CM4。首先打开我们C:\Program Files\SEGGER\Ozone\Plugins\OS的目录,不同人安装的目录可能不同我这里是C:\Program Files。然后就可以在我们的view里就可以看到freertos了。原创 2023-12-27 16:09:12 · 843 阅读 · 0 评论 -
O(0)优化进hardfault
总结:原来,在O(0)优化下会对fputc和_ttywrch进行编译,然后又调用到了这两个函数,最终导致程序直接跑死,进入hardfault。现在重新定义直接将其return了,不会跑死了。最近,遇到个奇怪的问题,在O(0)优化下会进hardfault,而在O(1)优化下不会。最终加了一下代码才ok。原创 2023-12-06 17:08:24 · 427 阅读 · 0 评论 -
boot跳app结果直接进hardfault(用ozone分析解决)
然后通过MEMORY的窗口到达0x200057E0,该地址里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。每个寄存器的值存放4个字节。我们需要查找PC和xPSR的值,这个PC值就是进入hardfault前的那段代码的地址。出现hardfault,或者调试看到程序跳到汇编程序的B指令上,是因为boot中开启了一些中断,而中断跳转到app前没有DISABLE掉这些中断而APP中又没有写中断服务函数,导致跳转到中断时找不到服务函数。原创 2023-12-05 20:09:07 · 792 阅读 · 0 评论 -
为啥要malloc,我直接冲一个大数组行不行?
答案是不行,主要原因是malloc能够动态分配堆的空间,而我们直接分配的大数组作为局部变量分的是栈的空间,而栈的空间一般比较小,很容易就爆了。最近遇到了一个问题,看到程序里面的malloc,我时常会想,直接去定义一个大数组行不行?一篇好文章:https://zhuanlan.zhihu.com/p/106910821。除此之外,还能够定义一个大小可变的数组。原创 2023-12-02 14:12:48 · 619 阅读 · 0 评论 -
DMA+USART双缓冲区收发,妈妈再也不用担心丢包(附GD32L233源码)
自己写了个类似printf的串口发送,在Xcom里换行尾部加 \ r\ n。以及printf重定向。原创 2023-11-30 18:44:07 · 1005 阅读 · 0 评论 -
在裸机下使用heap4进行内存管理(附源码解析)
size_t101024当然我们也可以用__attribute__ ((section(“.ccmram”)));将其分配到别的ram区10/*<< 下一个内存块 */ size_t xBlockSize;/*<< 内存块大小 */ } BlockLink_t;//当前空闲字节 static size_t xMinimumEverFreeBytesRemaining = 0U;原创 2023-11-23 14:24:18 · 389 阅读 · 0 评论 -
cmsis_gcc关中断的三种方式
寄存器名字寄存器功能描述primask这是个只有 1 个 bit 的寄存器。 在它被置 1 后,就关掉所有可屏蔽的异常,只剩下NMI 和硬 fault 可以响应。它的缺省值是 0,表示没有关中断。faultmask这是个只有 1 个 bit 的寄存器。当它置 1 时,只有 NMI 才能响应,所有其它的异常,甚至是硬 fault,也通通闭嘴。它的缺省值也是 0,表示没有关异常。basepri这个寄存器最多有 9 位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当原创 2023-11-22 17:06:22 · 160 阅读 · 0 评论 -
中断,事件,异常的区别
当两个中断源的抢占优先级相同时,即这两个中断将没有嵌套关系,当一个中断到来后,若此时cpu正在处理另一个中断,则这个后到来的中断就要等到前一个中断处理函数处理完毕后才能被处理,当这两个中断同时到达,则中断控制器会根据它们的子优先级决定先处理哪个。抢占优先级高的中断源可以中断抢占优先级低的中断处理函数,进而执行高优先级的中断处理函数,执行完毕后再继续执行被中断的低优先级的处理函数。中断是指系统停止当前正在运行的程序转到其他的服务,可能是程序接收了比自身高优先级的请求,或者是人为设置中断,中断是属于正常现象。原创 2023-11-20 15:03:33 · 662 阅读 · 1 评论 -
GD32的Makefile+启动文件+LD链接文件配置
脚本中以MEMORY命令定义了存储空间,其中以ORIGIN定义地址空间的起始地址,LENGTH定义地址空间的长度.NAME :存储区域的名字。(自己可以随意命名)ATTR :定义该存储区域的属性。ATTR属性内可以出现以下7 个字符:R 只读sectionW 读/写sectionX 可执行sectionA 可分配的sectionI 初始化了的sectionL 同 I!不满足该字符之后的任何一个属性的section。原创 2023-11-18 15:33:25 · 1539 阅读 · 1 评论 -
CRC校验基本原理CRC8和CRC16
CRC即循环冗余校验码,是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。原创 2023-11-16 10:51:56 · 2417 阅读 · 1 评论 -
实现自己的串口debuglog
这次想在GD单片机里打印一些东西,因此来深入理解一下printf,当然用printf重定向也可以实现,但这边想把轮询发送和中断发送区分开来,就想着自己写一个中断的发送。涉及到的东西包括printf的底层 valist和malloc之类的。原创 2023-11-10 11:41:12 · 91 阅读 · 1 评论 -
GD32L233X 硬件I2C读取BQ40Z50的配置
最近用GDL233标准库来对BQ40Z50进行I2C通讯,真的是一堆坑,官方的例程有用但不全,好险有逻辑分析仪,要不然一周都搞不定这玩意。原创 2023-11-09 17:39:49 · 1514 阅读 · 1 评论 -
头文件避免重定义
endif之间的代码,当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和。分析:当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和。这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。#endif之间的代码也就不会再次被包含,这样就避免了重定义了。原创 2023-11-06 16:13:58 · 133 阅读 · 0 评论 -
# ## \ @# 在宏定义里的作用
上述将 STR(srt)转换为 “str”原创 2023-11-06 15:39:12 · 86 阅读 · 0 评论 -
GD32L23X ADC+DMA读取多通道电压软触发附代码
在校准期间,ADC计算一个校准系数,这个系数是应用于ADC内部的,它直到ADC下次掉电才无效。在校准期间,应用不能使用ADC,必须等到校准完成。对于12位分辨率,总采样和转换时间为“采样时间+12.5”CK_ADC周期。例如: CK_ADC = 16MHz,采样时间为2.5个周期,总转换时间为“2.5+12.5”CK_ADC周期,(2.5+12.5)/16MHZ即0.9375us。ADC的位数是12位,参考电压为3.3V,那么其数字值变化1对应的模拟信号电压变化为3.3V/(2^12)≈0.8mV。原创 2023-11-04 08:50:35 · 531 阅读 · 5 评论 -
GD32L23X USART+DMA空闲中断收发数据
if(RESET!} }sizeof。原创 2023-11-04 09:00:19 · 427 阅读 · 1 评论 -
GD32L233 RTC休眠唤醒和闹钟唤醒附源码
RTC提供了一定的时间,其中包括小时/分/秒/次秒,还有一个日历,包括年/月/日/周的一天。GD32将RTC分成两部分,把内核部分(预分频器、分频器、计数器、闹钟)放在备份,达到复位重启不丢时间的目的,其它(APB1接口)放在VDD电源域。有2个分频器,一个7位异步分频器,另一个是一个15位同步分频器,异步分频器主要用于减少能耗,增加电池,当VDD断电后,自动切换到电池供电(VBAT),达到MCU断电不丢时间的目的。自动唤醒挂载到EXTI_20,优先级2,闹钟Alarm挂载到EXTI_17,优先级0。原创 2023-11-04 18:54:50 · 1226 阅读 · 1 评论 -
按键长按短按检测
需要放入任务中轮询执行,dT_ms是任务周期。原创 2023-11-04 18:58:42 · 160 阅读 · 1 评论 -
I2C总线协议理解
从I2C的基本原理出发,我们将介绍其变体子集——系统管理总线(SMBus)和电源管理总线(PMBus)——的可用性及二者的区别,三种协议各有专门的功能。这种灵活且高度通用的标准允许基于模拟和数字技术的器件之间进行通信,并提供真正的互操作性,由此将能降低电源系统设计的复杂性并缩短产品上市时间。然而,该字段的最低位另有含义,不属于SMBus地址的范围。SMBus器件每次收到其自己的地址时,无论在做什么,它都必须应答(ACK),这是一个明确要求,目的是确保主器件可以准确地判断总线上哪些器件处于活动状态。原创 2023-11-06 09:28:37 · 207 阅读 · 0 评论 -
GD32 I2C读取标志位超时问题解决
对于I2C,为啥很多人说他不好用呢,主要是它超时根本没有一个超时时间,那么在硬件上出现问题,比如把一根线拔了就永久的进入死循环,整机直接跑死,这对于四轴这种东西的话就是直接掉下来了,非常的恐怖。经过测试就算I2C跑死也不会影响成程序正常运行。就一个while跑死去读标志位。原创 2023-11-06 09:31:54 · 998 阅读 · 0 评论