在线时间10 小时
UID3601865
ST金币60
蝴蝶豆0
注册时间2019-11-14
该用户从未签到
初级会员
- 最后登录
- 2023-5-25
|
我使用STM32F030 用TIM3 触发ADC 然后使用DMA 将数据传出来 代码如下:void Adc_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOC Periph clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* Configure PC8 and PC9 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_2| GPIO_Pin_5| GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void ADC_Bsp_Init( void )
{
ADC_InitTypeDef ADC_InitStructure;
/*ÉèÖÃADC·ÖƵÒò×ÓΪ4 ,ADC×î´óʱ¼ä²»Äܳ¬¹ý14M*/
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;
// ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//??AD???????
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//??AD???????
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T3_TRGO;//?????????
// ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConvEdge_None;//?????????
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//???????????????????
// ADC_InitStructure.ADC_ScanDirection=ADC_ScanDirection_Backward;
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward; //CH0-18
ADC_Init(ADC1, &ADC_InitStructure);
// /* ADC DMA request in circular mode */
ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
//ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 0, ADC_SampleTime_28_5Cycles);
ADC_ChannelConfig(ADC1, ADC_Channel_0|ADC_Channel_2|ADC_Channel_5, ADC_SampleTime_28_5Cycles);
/* ADC Calibration */
ADC_GetCalibrationFactor(ADC1);
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Wait the ADCEN falg */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
TIM_Cmd(TIM3, ENABLE);
DMA_Cmd(DMA1_Channel1, ENABLE);
// ADC_StartOfConversion(ADC1);
}
void Tim3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//????
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_ClockDivision=0;//48M
TIM_TimeBaseStructure.TIM_Prescaler=480;//48k 1Tick=1ms
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period=1000-1;//10s??
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//??RepetitionCounter+1????????
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update);//TIM15?Update??????TRGO
// TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//?????? TIM ???,?????1
TIM_ClearFlag(TIM3,TIM_FLAG_Update); //????????? ????????
// TIM_Cmd(TIM3,ENABLE);//??TIM3
}
void DMA_Bsp_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_DeInit(DMA1_Channel1);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitStructure.DMA_PeripheralBaseAddr = (unsigned int)&ADC1->DR;
// DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->ADDR11;
DMA_InitStructure.DMA_MemoryBaseAddr = (unsigned int)&g_usAdcBuff[0];
// DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC1_addr11;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = NUM_ADC_LENTH;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
// DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
// DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
// DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC|DMA_IT_HT, ENABLE);
// DMA_Cmd(DMA1_Channel1, ENABLE);
}
void DMA1_Channel1_IRQHandler(void)
死活进不了 DMA中断
然后我做了几个实验
1、将ADC 改成 外部中断,也就是不使用定时器触发,采用连续采样,可以进DMA 中断
2、 我配置好并且开TIM3 中断,TIM3 中断可以进
这样我就实在找不出来哪里设置不对,进不了 DMA 中断
哪位大侠能帮看看代码哪里有问题么
|
|