- 博客(11)
- 收藏
- 关注
原创 GD32 MCU踩坑记录
现象:串口突然不通了,用keil仿真发现是发不出来,就是说虽然使能了发送但是没发出去。总结:CTS和RTS是硬件流控机制,除非特别设计了,否则不要稀里糊涂地用。总的来说就是一根线,接收方收到数据还在处理呢,不想让发送方接着发,可以把CTS线拉高,发送方检测到CTS线是高电平就不发了。问题很清晰了,我把CTS功能打开了,故障信号是高电平,检测到CTS线是高电平就不发数据了,所以串口不通。排查路径:第一时间看数据手册,DI14的IO口是PB13,猛然发现它和串口有关,竟然是USART的CTS脚。
2025-08-07 09:54:45
172
原创 嵌入式系统中拷贝数据最优解-DMA
1字节的时候就没有优势了,可以看出来dma模式的耗时似乎在一个恒定的范围内上下浮动,字节数很少的时候耗时不会非常少,很大的时候耗时也不会很大,也就是说拷贝的字节数越多,收益越高。探究MCU开发环境中的三种片内ram数据拷贝方式:(1)For循环拷贝 (2)C标准库的memcpy (3)DMA。主函数利用定时器1来计算三种形式的耗时,调用之前把CNT清零,调用结束后读取,来判定时间,这里拷贝100个字节。可以看到在100个字节的情况下,dma模式的速度是memcpy的3倍多,是for循环的16倍多。
2025-07-06 00:41:02
281
原创 GD32踩坑记录:一直跳进串口中断函数
这个标志位没有独立的使能位,而是和RBNE共用使能位,只要RBNEIE使能了并且这个位置1就会跳进中断,我这个是freemodbus从机协议栈,RBNEIE是使能的,自动跳中断,又因为这个标志位要手动清,导致一直跳中断。原因:pxMBFrameCBByteReceived函数里读了rdata寄存器,出来后又调用usart_data_receive函数读了一遍,导致。这边做两个操作:(1)接收中断里只读一次RDATA,防止进入过载状态 ,已经能解决这个问题了 (2)如果检测到过载状态,清一次标志位。
2025-05-28 09:44:50
232
原创 GD32时钟树配置踩坑记录
一开始以为是TIMER时钟这里就和APB1时钟周期一样了,静下心来读发现取决于APB1分频系数,如果不分频那确实和APB1一样,如果分了频统一乘2,我APB1做了个2分频,导致这里要乘以2,也就是说进到定时器的CK_TIMER频率是APB1的32MHZ乘以2也即64Mhz,所以快了一倍。将定时器外设的分频系数从32改为64,闪烁频率符合预期。在定时器里加led翻转发现与预期不符,仿真看标准库提供的SystemCoreClock变量发现系统时钟是120M而不是预期的64M,说明时钟配置没生效。
2025-05-24 19:43:41
345
原创 GD32集成Freemodbus避雷记录
昨天往项目里集成Freemodbus协议栈,原以为很简单,没想到连加了两天班才调通。感悟:这些经验其实早就该有了,但是之前车规平台化项目做多了,底层不碰,这些经验没能积累起来,一路踩坑。
2025-05-13 22:55:32
196
原创 Freertos源码阅读(一)列表
xItemValue成员是列表项的数据,不同列表下值的意义不同,比如说在ready列表里xItemValue存的是该列表项所“代表”的任务的优先级,在delay列表里xItemValue存的是该列表项所“代表”的任务的何时解除阻塞状态的时间点。pvOwner指向该列表项所“代表”的任务的任务TCB。xStateListItem和xEventListItem两个列表项作为“锚点”把任务“锚”在相应的列表上,其中状态列表“锚”在了任务状态的列表上,事件列表“锚”在了和队列,时间组相关的事件列表上。
2025-04-22 21:50:54
425
原创 Autosar学习感悟:PDU和SDU
在传输过程中,发送端的PDU就是接收端的SDU,接收端在拿到上层发来的一帧数据后加上当前层级的PCI后,作为这一层的PDU发到下一层。增加PCI时也是有逻辑判断的,比如说CANTP层会解析PDUR传来的SDU,PDUR让自己发的SDU是否可以一帧发完,如果发的完就加单帧的PCI(四位0+四位payload长度),如果发不完就会加首帧的PCI(0001+12位的数据长度),后续再根据接收节点传来的流控帧发连续帧,发的时候加连续帧的包头(0002+4位循环计数器)
2024-09-06 00:06:39
461
原创 C语言传参的理解
这三个初始化操作,接下来就正常使用这三个变量,这些变量可进行的操作也要根据形参类型列表中各形参变量的<限定词>来定(比如说加了CONST就不能改变变量的值)。一句话:当函数被调用后,C语言根据形参列表的格式,创建变量,紧接着用实参对这些变量进行初始化。比如说下面的简单例子,可以理解成:当testfun函数被调用时,隐式地进行了。int * c =(内存中某个具体地址)
2024-04-20 20:45:08
370
1
原创 C语言Malloc函数的使用
运行效果:报错,报错内容是“引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突”,多次检查代码逻辑,绝无问题,百思不得其解。编程目标:C primer plus 第十七章编程题第五题简单版本,实现一个项是整型的栈抽象数据类型。中找到了答案,即"使用malloc函数之前要调用一个库malloc.h"开发环境:Windows平台Visual Studio2022。改进方案:在头文件中调用malloc.h库。效果:完美运行,不再报错。
2022-11-09 22:38:34
640
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人