pfboyi 发表于 2021-6-3 11:50

adc和dac 弹性映射的使用

使用遇到的问题:
1.adc使用DAM弹性映射,不能采集到adc数据
adc例程正常采集,调整为弹性映射之后,一样不能采集
2.dac使用DMA弹性映射,不能输出dac数据
dac例程正常输出,调整为弹性映射之后,一样不能输出

void dac_init(void)
{
        GPIO_InitType GPIO_InitStructure;

/* Once the DAC channel is enabled, the corresponding GPIO pin is automatically
   connected to the DAC converter. In order to avoid parasitic consumption,
   the GPIO pin should be configured in analog */
GPIO_InitStructure.GPIO_Pins =GPIO_Pins_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_ANALOG;
GPIO_Init(GPIOA, &GPIO_InitStructure);
       
          GPIO_InitStructure.GPIO_Pins = GPIO_Pins_0|GPIO_Pins_1;                               
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;       
GPIO_Init(GPIOC, &GPIO_InitStructure);

DAC_InitType                          DAC_InitStructure;
DMA_InitType                          DMA_InitStructure;
TMR_TimerBaseInitType    TMR_TimeBaseStructure;


/* TIM4 Configuration */
/* Time base configuration */
TMR_TimeBaseStructInit(&TMR_TimeBaseStructure);
TMR_TimeBaseStructure.TMR_Period = 0x19;         
TMR_TimeBaseStructure.TMR_DIV = 0x0;      
TMR_TimeBaseStructure.TMR_ClockDivision = 0x0;   
TMR_TimeBaseStructure.TMR_CounterMode = TMR_CounterDIR_Up;
TMR_TimeBaseInit(TMR4, &TMR_TimeBaseStructure);

/* TIM4 TRGO selection */
TMR_SelectOutputTrigger(TMR4, TMR_TRGOSource_Update);

/* DAC channel1 Configuration */
DAC_StructInit(&DAC_InitStructure);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_TMR4_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);

/* DAC channel2 Configuration */
DAC_Init(DAC_Channel_2, &DAC_InitStructure);

/* Fill Sine32bit table */
for (Idx = 0; Idx < 32; Idx++)
{
    DualSine12bit = (Sine12bit << 16) + (Sine12bit);
}

/* DMA2 channel4 configuration */
DMA_Reset(DMA2_Channel4);

DMA_DefaultInitParaConfig(&DMA_InitStructure);
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit;
DMA_InitStructure.DMA_Direction = DMA_DIR_PERIPHERALDST;
DMA_InitStructure.DMA_BufferSize = 32;
DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE;
DMA_InitStructure.DMA_PeripheralDataWidth = DMA_PERIPHERALDATAWIDTH_WORD;
DMA_InitStructure.DMA_MemoryDataWidth = DMA_MEMORYDATAWIDTH_WORD;
DMA_InitStructure.DMA_Mode = DMA_MODE_CIRCULAR;
DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH;
DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;

DMA_Init(DMA2_Channel4, &DMA_InitStructure);
//DMA_Flexible_Config(DMA2, Flex_Channel4, DMA_FLEXIBLE_DAC1);//开启DMA弹性映射,弹性映射必须要加上这个配置!
/* Enable DMA2 Channel4 */
DMA_ChannelEnable(DMA2_Channel4, ENABLE);

/* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is
   automatically connected to the DAC converter. */
DAC_Ctrl(DAC_Channel_1, ENABLE);
/* Enable DAC Channel2: Once the DAC channel2 is enabled, PA.05 is
   automatically connected to the DAC converter. */
DAC_Ctrl(DAC_Channel_2, ENABLE);

/* Enable DMA for DAC Channel2 */
DAC_DMACtrl(DAC_Channel_2, ENABLE);

/* TIM2 enable counter */
TMR_Cmd(TMR4, ENABLE);
}

pfboyi 发表于 2021-6-3 16:48

这个问题已经找到,例程本身存在问题,DMA使能的是DAC2,但是引脚对应是DAC1的。之所以会出现上面现象,可以正常输出,可能是因为DAC1和DAC2操作的是同一寄存器。

林堪堪 发表于 2021-6-3 19:25

pfboyi 发表于 2021-6-3 16:48
这个问题已经找到,例程本身存在问题,DMA使能的是DAC2,但是引脚对应是DAC1的。之所以会出现上面现象,可 ...

我看了官方原例程没啥问题啊,DAC2固定映射对应DMA_channel4,但是是可以操作DAC1/2公用寄存器的,你这个代码里面就是操作的公用寄存器(DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit;),也可以用DAC1对应的DMA2_channel3来操作这个公用寄存器,都可以。
然后原例程里面双通道输出的话,DAC1/2对应的PA4/PA5都有配置的,你这个代码估计没注意删掉了吧。
弹性映射的话可以参考下官方例程的DMA文件夹里面弹性映射相关的例程,用这个函数:DMA_Flexible_Config。



pfboyi 发表于 2021-6-8 10:04

林堪堪 发表于 2021-6-3 19:25
我看了官方原例程没啥问题啊,DAC2固定映射对应DMA_channel4,但是是可以操作DAC1/2公用寄存器的,你这个 ...

那就麻烦您试下,在DAC1或2 和 引脚 不对应的情况下,使用弹性映射操作共用寄存器,看下还能不能输出?

skyred 发表于 2021-7-2 11:20

pfboyi 发表于 2021-6-3 16:48
这个问题已经找到,例程本身存在问题,DMA使能的是DAC2,但是引脚对应是DAC1的。之所以会出现上面现象,可 ...

我能稍微问下,弹性映射是个啥么

chenjun89 发表于 2021-7-3 08:10

这种情况下,一般是软件配置问题。

muyichuan2012 发表于 2021-7-6 17:53

AT32弹性映射的描述:
https://www.arterytek.com/download/AN0009_DMA_with_Flexible_Mapping_ZH_V1.0.0.pdf
页: [1]
查看完整版本: adc和dac 弹性映射的使用