STM32ZET6芯片4通道ADC定时器触发DMA存贮的库函数初始化

2019-07-21 03:04发布

void  Adc_Init(void)
AD初始化设置   
  *******************************************************************************/
void  Adc_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;     /*******************ADC**************/
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE ); //使能PORTC通道时钟     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOC,&GPIO_InitStructure);
    /*******************TIM**************/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);   //使能TIM1时钟
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
/* 定时计算:(1 /(72 / (36 - 1 + 1))) * 780 us = 390us */
    TIM_TimeBaseStructure.TIM_Period = 780;                  //自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler=36 - 1;                 //TIMx 时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;       //采样分频  
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);             //初始化定时器
    /* TIM1 通道1配置PWM工作模式 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;           //PWM1工作模式
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
    TIM_OCInitStructure.TIM_Pulse = 100;                        //占空比75%
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;        
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);                    //使能预装载寄存器     /*******************DMA**************/
    /* 使能DMA时钟 */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); 
    /* DMA1 第1通道配置(对应外设ADC1) ----------------------------------------------*/
    DMA_DeInit(DMA1_Channel1);                                              //开启DMA1的第1通道
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;             //DMA对应的外设基地址,即 ADC1_DR寄存器基地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue;         //内存存储基地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                     //DMA传输方向单向,转换模式为SRC模式,由外设搬移到内存
    DMA_InitStructure.DMA_BufferSize = AD_BUF_SIZE;                         //DMA缓存大小,1个
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;     //接收一次数据后,设备地址禁止后移
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 //设置DMA的内存递增模式
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //定义外设数据宽度为16位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;     //DMA搬移数据尺寸,HalfWord就是为16位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                         //转换模式,循环缓存模式。
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                     //DMA优先级高
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                      //M2M模式禁用
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);          
    /* 使能 DMA1 第1通道 */
    DMA_Cmd(DMA1_Channel1, ENABLE);     /*******************ADC**************/ 
    /* 使能ADC1和GPIOC时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
    /* ADC1 配置 ------------------------------------------------------*/
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                  //独立的转换模式
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;                      //开启扫描模式(多通道)
//    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                    //开启 连续转换模式
//    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ADC外部开关,关闭状态
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                     //关闭 连续转换模式
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;    //转换外部触发启动
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                  //对齐方式,ADC为12位中,右对齐方式
    ADC_InitStructure.ADC_NbrOfChannel = 5;                                 //开启通道数,5个
    ADC_Init(ADC1, &ADC_InitStructure);     /* ADC1 规则模式通道配置 */
    /* ADC1 通道组 第10~13个通道 采样顺序1~4,转换时间 */   
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_239Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_239Cycles5);    
                          
 /* ADC1 regular channel16 configuration */
 ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 5, ADC_SampleTime_55Cycles5); //ADC1,ADC通道16     ADC_TempSensorVrefintCmd(ENABLE);     //ADC内置温度传感器使能(要使用片内温度传感器,切记要开启它)
   
    /* 使能 ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);
    /* 使能 ADC1 外部触发 */
    ADC_ExternalTrigConvCmd(ADC1, ENABLE);   
    /* 使能 ADC1 */
    ADC_Cmd(ADC1, ENABLE);
        
    /* 使能 ADC1 重新校准 */  
    ADC_ResetCalibration(ADC1);
    /* 等待 ADC1 重新校准完成*/
    while(ADC_GetResetCalibrationStatus(ADC1)); 
    /* 开始 ADC1 校准 */
    ADC_StartCalibration(ADC1);  
    /* 等待 ADC1 校准完成 */
    while(ADC_GetCalibrationStatus(ADC1)); 
    /* 连续转换开始,ADC1 通过 DMA 方式不断的更新RAM区。 */
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);      /*******************TIM**************/    
    /* TIM1 使能 */
    TIM_Cmd(TIM1, ENABLE);
    /* TIM1 主输出使能 */
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
magicoctoy
1楼-- · 2019-07-21 08:16
可用
正点原子
2楼-- · 2019-07-21 12:21
 精彩回答 2  元偷偷看……
miaoguoqiang
3楼-- · 2019-07-21 14:17
没有反应是怎么回事,感觉完全没有被触发
zhaolei0329
4楼-- · 2019-07-21 15:50
可用,谢谢分享
和埠岭扛把子
5楼-- · 2019-07-21 17:34
亲测添加dma中断即可使用  很赞  感谢楼主  顺便贴一下中断函数
void DMA1_Channel1_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA_IT_TC))
    {

        DMA_ClearITPendingBit(DMA_IT_TC); //清除全部中断标志
    }
}
和埠岭扛把子
6楼-- · 2019-07-21 23:30
发现了个问题 为什么一直进DMA1_Channel1_IRQHandler(void)中断呢,并且这个中断关不掉

一周热门 更多>