先楫半导体HPMicro
直播中

城市世界

3年用户 41经验值
擅长:电源/新能源 测量仪表 嵌入式技术 控制/MCU
私信 关注
[问答]

ADC16 DMA缓冲区最大只能1024位,设置大于1024时,DMA缓冲里的数据打印出来全是0,不知道怎么回事?

根据例程更改序列采样,利用一个定时器定时进行序列采样,自动放入DMA缓冲区,由于需要的通道和数据较多,设置缓冲区大于1024位,现发现当我设置大于1024,例如2048位的时候,Printf()输出就全变成了零,多次尝试更改大于,只要大于1024就会出现这种问题,哪位大侠能协助解决。
#define APP_TICK_MS (1000)

#define APP_ADC16_SEQ_START_POS (0U)
#define APP_ADC16_SEQ_DMA_BUFF_LEN_IN_4BYTES (1024U)
#define APP_ADC16_SEQ_IRQ_EVENT adc16_event_seq_single_complete

#ifndef APP_ADC16_CORE
#define APP_ADC16_CORE BOARD_RUNNING_CORE
#endif

ATTR_RAMFUNC_WITH_ALIGNMENT(ADC_SOC_DMA_ADDR_ALIGNMENT) uint32_t seq_buff[APP_ADC16_SEQ_DMA_BUFF_LEN_IN_4BYTES];

上面是数据的定义。

hpm_stat_t process_seq_data(uint32_t *buff, int32_t start_pos, uint32_t len)
{
adc16_seq_dma_data_t *dma_data = (adc16_seq_dma_data_t *)buff;

if (ADC16_IS_SEQ_DMA_BUFF_LEN_INVLAID(len)) {
return status_invalid_argument;
}

for (int i = start_pos; i < start_pos + len; i+=8) {
//printf("Sequence Number:%02d ", dma_data[i].seq_num);
//printf("Cycle Bit: %02d ", dma_data[i].cycle_bit);
//printf("ADC Channel: %02d ", dma_data[i].adc_ch);
printf("%05d\n", dma_data[i].result);
}

return status_success;

}

这是数据打印输出的程序部分,与例程没多大区别。

回帖(2)

城市世界

2023-11-14 14:36:36
打扰各位了,我自己找到问题所在了,SDK在hpm_soc_feature.h里定义了序列采样模式下DMA缓冲区最大内存数为4096U,按4byte计算在APP里最大只能定义1024了,如果加大此数,相应也会允许APP里增加到最大内存数。
hpm_soc_feature.h里的定义:#define ADC_SOC_SEQ_MAX_DMA_BUFF_LEN_IN_4BYTES     (4096U)
我的采样APP里的定义:#define APP_ADC16_SEQ_DMA_BUFF_LEN_IN_4BYTES (1024U)
举报

城市世界

2023-11-14 14:40:17
感谢各位,找到问题了,例程里有个判据if (ADC16_IS_SEQ_DMA_BUFF_LEN_INVLAID(len)) {
return status_invalid_argument;
它判断DMA缓存是否越限的,而在hpm_soc_feature.h里定义了越限值是4096,为4byte1024的上限,如果需要更多缓存,更改hpm_soc_feature.h里的越限值就可以了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分