中级会员
 
- 积分
- 236
- 金钱
- 236
- 注册时间
- 2015-1-22
- 在线时间
- 72 小时
|

楼主 |
发表于 2020-8-28 15:14:54
|
显示全部楼层
是,哪里确实错了。已经改好。
今天试了下定时器触发,两路AD同时采样,DMA不中断,大家看看哪里问题?
/这里使用的是定时器4!
void TIM4_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_OCInitStruct.TIM_OCMode =TIM_OCMode_PWM1 ;
TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_Low;
TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse =324/2;
TIM_OC4Init(TIM4, &TIM_OCInitStruct);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);//TIMx_CCR1寄存器的预装载功能,Enable就是下一次更新事件时被更新;Disable是立即生效!!!
TIM_Cmd(TIM4, ENABLE); //使能TIMx
TST_GPIO_Init();
//TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
}
void GPIO_Ad_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void DMA_ADC_INIT(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1); //*DMA通道1*/
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; /*外设地址*/
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value[0][0]; /* 内存地址*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /* DMA 传输方向单向*/
DMA_InitStructure.DMA_BufferSize =32*2; /* 设置DMA在传输时缓冲区的长度 word*/
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*设置DMA的外设递增模式,一个外设*/
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*设置DMA的内存递增模式*/
// DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; /*外设数据字长*/
// DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord; /*内存数据字长*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //外设数据单位(每次传输32位)
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //内存数据单位(每次传输32位)
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; /*设置DMA的传输模式:连续不断的循环模式*/
DMA_InitStructure.DMA_Priority=DMA_Priority_High; /*设置DMA的优先级别*/
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; /*设置DMA的2个memory中的变量互相访问*/
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //
DMA_Cmd(DMA1_Channel1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
ADC_DeInit(ADC1);
ADC_DeInit(ADC2);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC1工作在注入模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; /*ENABLE-ADC多通道扫描, DISABLE-ADC单通道扫描*/
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /* ENABLE--ADC连续转化模式 DISABLE--ADC单次转化模式*/
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T4_CC4;//ADC_ExternalTrigConv_T4_CC4;ADC_ExternalTrigConv_None /*ADC外部开关,关闭状态*/
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /*对齐方式,ADC为12位中,右对齐方式*/
ADC_InitStructure.ADC_NbrOfChannel =2; /*开启通道数,1个*/
ADC_Init(ADC1, &ADC_InitStructure);
ADC_DMACmd(ADC1, ENABLE); //使能ADC1的DMA
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC2工作在注入模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; /*ENABLE-ADC多通道扫描, DISABLE-ADC单通道扫描*/
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /* ENABLE--ADC连续转化模式 DISABLE--ADC单次转化模式*/
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ADC_ExternalTrigConv_T4_CC4;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /*对齐方式,ADC为12位中,右对齐方式*/
ADC_InitStructure.ADC_NbrOfChannel = 2; //要进行ADC转换的通道数:PHASE_B_ADC_CHANNEL,TEMP_FDBK_CHANNEL
ADC_Init(ADC2, &ADC_InitStructure);
ADC_ExternalTrigConvCmd(ADC2, ENABLE); //ADC2外部触发使能,双ADC模式的从ADC必须要用这条语句
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5); //A相电流
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_13Cycles5); //母线电压
ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 1, ADC_SampleTime_13Cycles5); //B相电流
ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 2, ADC_SampleTime_13Cycles5); //温度电压
ADC_Cmd(ADC1, ENABLE); //ADC1使能
ADC_ResetCalibration(ADC1); //复位校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //等待校准寄存器复位完成
ADC_StartCalibration(ADC1); //ADC1开始校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准完成
ADC_Cmd(ADC2, ENABLE); //ADC2使能
ADC_ResetCalibration(ADC2); //复位校准寄存器
while(ADC_GetResetCalibrationStatus(ADC2)); //等待校准寄存器复位完成
ADC_StartCalibration(ADC2); //ADC2开始校准
while(ADC_GetCalibrationStatus(ADC2)); //等待校准完成
} |
|