硬件:GD32F427,
外设:FreeRtos,ADC,DMA
现象:注释掉一些线程,发现ADC采样的线程采样不到数据了。
开始猜测是线程重入,破坏了地址,后来思考一下发现不对,因为注释掉线程,ADC+DMA采样无效。开启线程,发现ADC+DMA采样有效。
通过查阅手册《GD32F4XX_应用手册》,如下图1,图2,图3,发现IRAM2使用的TCMSRAM,这一块SRAM是不支持使用DMA,如果DMA取的地址在0x1000 0000 -0x1000 FFFF,是取样不出来的。
图1 发现TCMSRAM是不支持
图2
图3
烧写程序,发现adc_value的地址在0x1000 0000之后。这样就导致了ADC采样得不到数据
解决方法:
方法1:
uint16_t adc_value[3]__attribute__((at(0x20000000)));
注意这种方法使用的编译器是AC5,AC编译器查看
如果是AC6编译器
uint8_t ucHeap[64*1024] __attribute__((section(".ARM.__at_0x24000000")));
方法2,使用stc文件(推荐这种)
Keil MDK的sct分散加载文件详解_keil sct-CSDN博客
参考教程
GD32F4的TCMSRAM(紧耦合SRAM)该如何使用? - 飞书云文档
AC6使用 __attribute__((at(x)))需要改用__attribute__((section("name")))实现(2022-05-03) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!
STM32F407使用CCM(64K)区域_f407ccm-CSDN博客
STM32裸机开发(6) — Keil-MDK下散列文件的分析_stm32散列文件分析-CSDN博客GD32F4的TCMSRAM(紧耦合SRAM)该如何使用? - - 21ic电子技术开发论坛
STM32裸机开发(6) — Keil-MDK下散列文件的分析_stm32散列文件分析-CSDN博客