在线时间15 小时
UID3235640
注册时间2016-8-25
NXP金币0
TA的每日心情 | 郁闷 2021-9-6 10:31 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
注册会员

- 积分
- 128
- 最后登录
- 2021-10-9
|
发于 PDB 同时触发2路DMA通道的设想 可不可行?
我目前用PDB 触发DMA通道,再由DMA去处理其它事务(比如在DMA里面切换ADC通道):
//PDB初始化,并开启DMA功能
SIM_SCGC6 |= SIM_SCGC6_PDB_MASK;
PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_PDBEN_MASK ;
PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_TRGSEL(0xf) | PDB_SC_CONT_MASK;
PDB_MOD_REG(PDB0_BASE_PTR) = BSP_BUS_CLOCK / 50 / ADC_SAMPLE_FREQ;
PDB_IDLY_REG(PDB0_BASE_PTR) = 0;
PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_LDOK_MASK;
PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_DMAEN_MASK;
PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_SWTRIG_MASK;
//////////////////////////////////以下是DMA 2个通道的初始化//////////////////////////////////////////
以下代码采用了 DMA通道0 和DMA通道1 而触发源都同时使用DMAMUX_SRC_CHANNEL_PDB
这样用的设想行不行?PDB触发DMA,DMA是是靠PDBIF标志位的吗?是什么时候清零?
DMA_StructInit(&ux_Dma_Parameter);
ux_Dma_Parameter.xDmaSrcChannel = DMAMUX_SRC_CHANNEL_PDB;
ux_Dma_Parameter.u32SourceAddress = (uint32_t)&(u32_p_adc1_channel_table[0]);
ux_Dma_Parameter.u32DestinationAddress = (uint32_t)&(ADC1_SC1A);
ux_Dma_Parameter.u16SourceNextValueOffset = sizeof(uint32_t);
ux_Dma_Parameter.u16DestinationNextValueOffset = 0;
ux_Dma_Parameter.u8SourceAddressModulo = 0;
ux_Dma_Parameter.u8DestinationAddressModulo = 0;
ux_Dma_Parameter.xSourceDataSize = DMA_TRANSFER_SIZE_32_BIT;
ux_Dma_Parameter.xDestinationDataSize = DMA_TRANSFER_SIZE_32_BIT;
ux_Dma_Parameter.u32ByteTransferCount = sizeof(uint32_t);
ux_Dma_Parameter.u32LastSourceAddressAdjustment = -(ADC1_TABLE_LEN * ux_Dma_Parameter.u16SourceNextValueOffset);
ux_Dma_Parameter.u32LastDestinationAddressAdjustment = 0;
ux_Dma_Parameter.u16BufferSize = ADC1_TABLE_LEN;
DMA_Init(DMA_CHANNEL_0, DMAMUX, &ux_Dma_Parameter);
DMA_Cmd(DMA_CHANNEL_0, DMAMUX, ENABLE);
DMA_StructInit(&ux_Dma_Parameter);
ux_Dma_Parameter.xDmaSrcChannel = DMAMUX_SRC_CHANNEL_PDB;
ux_Dma_Parameter.u32SourceAddress = (uint32_t)&(u32_p_adc0_channel_table[0]);
ux_Dma_Parameter.u32DestinationAddress = (uint32_t)&(ADC0_SC1A);
ux_Dma_Parameter.u16SourceNextValueOffset = sizeof(uint32_t);
ux_Dma_Parameter.u16DestinationNextValueOffset = 0;
ux_Dma_Parameter.u8SourceAddressModulo = 0;
ux_Dma_Parameter.u8DestinationAddressModulo = 0;
ux_Dma_Parameter.xSourceDataSize = DMA_TRANSFER_SIZE_32_BIT;
ux_Dma_Parameter.xDestinationDataSize = DMA_TRANSFER_SIZE_32_BIT;
ux_Dma_Parameter.u32ByteTransferCount = sizeof(uint32_t);
ux_Dma_Parameter.u32LastSourceAddressAdjustment = -(ADC0_TABLE_LEN * ux_Dma_Parameter.u16SourceNextValueOffset);
ux_Dma_Parameter.u32LastDestinationAddressAdjustment = 0;
ux_Dma_Parameter.u16BufferSize = ADC0_TABLE_LEN;
DMA_Init(DMA_CHANNEL_1 DMAMUX, &ux_Dma_Parameter);
DMA_Cmd(DMA_CHANNEL_1, DMAMUX, ENABLE);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////使能DMA
DMA_EnableRequest(DMAMUX, DMA_CHANNEL_0);
DMA_EnableRequest(DMAMUX, DMA_CHANNEL_1);
/////////////////////////////经果:这个设想我在硬件上测试过,结果貌似是可以,我的多路ADC采样的结果 都正常
////////////疑问:这样子操作 可靠吗
|
|