高级会员

- 积分
- 778
- 金钱
- 778
- 注册时间
- 2013-4-23
- 在线时间
- 165 小时
|
10金钱
用的STM32F401的TIM3的更新事件去触发ADC转换,然后通过DMA去搬运到内存,现在发现DMA中断只能进去一次,请教一下是什么问题啊?
void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// NVIC_InitTypeDef NVIC_InitStructure;
/* Enable TIM3 clock */
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 780-1; //计数值
TIM_TimeBaseStructure.TIM_Prescaler = 42; //42M 时钟预分频42 1M
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分割时钟
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
TIM_ARRPreloadConfig(TIM3, ENABLE);
// TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
// //中断优先级NVIC设置
// NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
// NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM3, ENABLE);
}
void DMA_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/***************************************************************
* 函数名:DMA_Config
* 输入 :void
* 输出 :void
* 功能 :
****************************************************************/
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
/* Enable DMA2 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
/* DMA2_Stream0_Channel_0 Configuration ------------------------------*/
DMA_DeInit(DMA2_Stream0);
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&ADC1->DR);
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = CHANNEL_BUF_TOTAL_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
DMA_NVIC_Config();
DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);
/* Enable DMA2 steam0 */
DMA_Cmd(DMA2_Stream0, ENABLE);
}
void DMA2_Stream0_IRQHandler(void)
{
if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0) != RESET )
{
DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
FinshFlag=1;
}
}
void ADC_Configuration(void) //ADC配置函数
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
/* Enable ADC1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* Single ADC mode */
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
/* ADCCLK = PCLK2/4 */
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; //4分频21M
/* Available only for multi ADC mode */
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled ;
/* Delay between 2 sampling phases */
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/* Configure ADC1 to convert continously channel14 ***********/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_56Cycles); //8
// ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
// ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
ADC_DMACmd(ADC1, ENABLE);
// ADC_SoftwareStartConv(ADC1);
}
|
最佳答案
查看完整内容[请看2#楼]
已解决,需要加一句ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
|