完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位好: 我拿"PDMA_ScatterGather_PingPongBuffer"这个範例修改,成功可以相互将ADC值存到目的地。 下一步的应用是希望可以实现存进目的地的资料不只一笔,希望一次是100笔,故我在ctl做了TXCNT的设定,但结果仍然array 的第一个 element有值,其余99个元素都没有填值。 |
|
相关推荐
1个回答
|
|
首先需要确认以下几点:
1. ADC的数据输出格式与PingPongBuffer範例中的数据格式是否一致(例如数据类型、数据长度等); 2. PDMA传输中间件的配置是否正确(包括目的地地址、数据长度等); 3. 确认ADC数据是否成功获取并传输到了PingPongBuffer範例中。 如果以上都确认无误,那么可以尝试调整PDMA中间件的配置,确保每次传输的长度为100笔数据。同时,在PDMA中间件传输完成的callback函数中,需要对每个传输笔数(TXCNT)进行计数,并在传输完成时进行相应的指针偏移操作,以避免数据被覆盖。详见以下代码: ``` #define BUFFER_LENGTH 100 uint32_t ADC_Buffer[BUFFER_LENGTH]; uint32_t Dest_Buffer[BUFFER_LENGTH]; void PDMA_Config(void){ /* PDMA Init */ /* Configure PDMA peripheral mode */ PDMA_InitTypeDef PDMA_InitStruct; PDMA_InitStruct.PDMA_Priority = PDMA_PRIORITY_HIGH; PDMA_InitStruct.PDMA_Mode = PDMA_MODE_SNAPSHOT; PDMA_InitStruct.PDMA_Request = PDMA_REQUEST_ADC; PDMA_InitStruct.PDMA_SrcBaseAddr = (uint32_t)&(ADC->DR); PDMA_InitStruct.PDMA_SrcInc = PDMA_SRC_INC_NONE; PDMA_InitStruct.PDMA_DestBaseAddr = (uint32_t)(Dest_Buffer); PDMA_InitStruct.PDMA_DestInc = PDMA_DEST_INC_WORD; PDMA_InitStruct.PDMA_CycleSize = BUFFER_LENGTH; PDMA_InitStruct.PDMA_IrqStatus = PDMA_IRQ_STATUS_BLOCK | PDMA_IRQ_STATUS_SNAPSHOT | PDMA_IRQ_STATUS_TC | PDMA_IRQ_STATUS_ERR; PDMA_InitStruct.PDMA_BlockSize = 1; PDMA_InitStruct.PDMA_BufferSize = 100; PDMA_Init(PDMA, PDMA_CHANNEL_ADC, &PDMA_InitStruct); /* Register PDMA Callback Handler */ PDMA_RegisterCallback(PDMA, PDMA_CHANNEL_ADC, PDMA_EVENT_TRANSFER_DONE, (void*)PDMA_Callback); /* Enable PDMA Interrupt */ PDMA_EnableInterrupt(PDMA, PDMA_CHANNEL_ADC, PDMA_IRQ_MASK); } void PDMA_Callback(void){ static uint32_t cnt = 0; cnt++; if(cnt == BUFFER_LENGTH){ cnt = 0; PDMA_SetTransferAddr(PDMA, PDMA_CHANNEL_ADC, (uint32_t)&(ADC->DR), (uint32_t)(Dest_Buffer), PDMA_SAR_INC_NONE, PDMA_DAR_INC_WORD); }else{ PDMA_SetTransferAddr(PDMA, PDMA_CHANNEL_ADC, (uint32_t)&(ADC->DR), (uint32_t)(Dest_Buffer + cnt), PDMA_SAR_INC_NONE, PDMA_DAR_INC_WORD); } } int main(void){ ADC_Config(); PDMA_Config(); while(1){ /* Wait for PDMA transfer complete */ while(PDMA_GetTransferStatus(PDMA, PDMA_CHANNEL_ADC) != PDMA_TRANSFER_DONE); /* Process the buffer data */ for(uint32_t i = 0; i < BUFFER_LENGTH; i++){ // do something with Dest_Buffer[i] } } } ``` 这里的PDMA_Config函数中,PDMA_InitStruct.PDMA_BufferSize参数设置为100,表示每次传输的数据长度为100。PDMA_Callback函数中,使用静态变量cnt计数,每当传输100笔数据后,对目的地址指针进行偏移,避免数据被覆盖。 |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2332浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 19:09 , Processed in 1.080110 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号