OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2345|回复: 1

STM32F103ZET6 定时器触发ADC采集,用DMA方式将数据传入CPU,但程序总是不执行DMA中断,求助各位大佬我的初始化配置哪里出了问题

[复制链接]

2

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2019-7-10
在线时间
9 小时
发表于 2019-7-16 11:18:53 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 龚向新 于 2019-7-16 11:49 编辑

#include "adc.h"
#include "delay.h"
#include "stm32f10x.h"
#include <stdio.h>
#include "string.h"
#include "stm32f10x.h"
#include "led.h"

#define ADC_BUFF_LEN    200
#define ADC1_DR_Address    ((uint32_t)0x4001244C)
uint16_t ADC_ConvertedValue[ADC_BUFF_LEN];
uint16_t WriteBuff[ADC_BUFF_LEN];
                  
void  Adc_Init(void)
{  
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );   //&Ecirc;&sup1;&Auml;&Uuml;ADC1&Iacute;¨&micro;&Agrave;&Ecirc;±&Ouml;&Oacute;/////

RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //&Eacute;è&Ouml;&Atilde;ADC·&Ouml;&AElig;&micro;&Ograve;ò×&Oacute;6 72M/6=12,ADC×&icirc;&acute;ó&Ecirc;±&frac14;&auml;&sup2;&raquo;&Auml;&Uuml;&sup3;&not;&sup1;&yacute;14M
//PA1 ×÷&Icirc;&ordf;&Auml;&pound;&Auml;&acirc;&Iacute;¨&micro;&Agrave;&Ecirc;&auml;&Egrave;&euml;&Ograve;&yacute;&frac12;&Aring;                        
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //&Auml;&pound;&Auml;&acirc;&Ecirc;&auml;&Egrave;&euml;&Ograve;&yacute;&frac12;&Aring;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1);  //&cedil;&acute;&Icirc;&raquo;ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC&sup1;¤×÷&Auml;&pound;&Ecirc;&frac12;:ADC1&ordm;&Iacute;ADC2&sup1;¤×÷&Ocirc;&Uacute;&para;&Agrave;&Aacute;&cent;&Auml;&pound;&Ecirc;&frac12;
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //&Auml;&pound;&Ecirc;&yacute;×&ordf;&raquo;&raquo;&sup1;¤×÷&Ocirc;&Uacute;&micro;&yen;&Iacute;¨&micro;&Agrave;&Auml;&pound;&Ecirc;&frac12;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //&Auml;&pound;&Ecirc;&yacute;×&ordf;&raquo;&raquo;&sup1;¤×÷&Ocirc;&Uacute;&micro;&yen;&acute;&Icirc;×&ordf;&raquo;&raquo;&Auml;&pound;&Ecirc;&frac12;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; //×&ordf;&raquo;&raquo;&Oacute;&Eacute;&Egrave;í&frac14;&thorn;&para;&oslash;&sup2;&raquo;&Ecirc;&Ccedil;&Iacute;&acirc;&sup2;&iquest;&acute;&yen;·&cent;&AElig;&ocirc;&para;&macr;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC&Ecirc;&yacute;&frac34;&Yacute;&Oacute;&Ograve;&para;&Ocirc;&AElig;&euml;
ADC_InitStructure.ADC_NbrOfChannel = 2; //&Euml;&sup3;&ETH;ò&frac12;&oslash;&ETH;&ETH;&sup1;&aelig;&Ocirc;ò×&ordf;&raquo;&raquo;&micro;&Auml;ADC&Iacute;¨&micro;&Agrave;&micro;&Auml;&Ecirc;&yacute;&Auml;&iquest;
ADC_Init(ADC1, &ADC_InitStructure); //&cedil;ù&frac34;&Yacute;ADC_InitStruct&Ouml;&ETH;&Ouml;&cedil;&para;¨&micro;&Auml;&sup2;&Icirc;&Ecirc;&yacute;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&Iacute;&acirc;&Eacute;èADCx&micro;&Auml;&frac14;&Auml;&acute;&aelig;&AElig;÷   

ADC_TempSensorVrefintCmd(ENABLE);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5 );

ADC_Cmd(ADC1, ENABLE); //&Ecirc;&sup1;&Auml;&Uuml;&Ouml;&cedil;&para;¨&micro;&Auml;ADC1

//ADC_ExternalTrigConvCmd(ADC1, ENABLE);///&Ntilde;&Iuml;&Ouml;&Oslash;&raquo;&sup3;&Ograve;&Eacute;&Ograve;&ordf;&sup2;&raquo;&Ograve;&ordf;

ADC_DMACmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1); //&Ecirc;&sup1;&Auml;&Uuml;&cedil;&acute;&Icirc;&raquo;&ETH;&pound;×&frac14;  
while(ADC_GetResetCalibrationStatus(ADC1)); //&micro;&Egrave;&acute;&yacute;&cedil;&acute;&Icirc;&raquo;&ETH;&pound;×&frac14;&frac12;á&Ecirc;&oslash;
ADC_StartCalibration(ADC1);  //&iquest;&ordf;&AElig;&ocirc;AD&ETH;&pound;×&frac14;
while(ADC_GetCalibrationStatus(ADC1));  //&micro;&Egrave;&acute;&yacute;&ETH;&pound;×&frac14;&frac12;á&Ecirc;&oslash;

ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //&Ecirc;&sup1;&Auml;&Uuml;&Ouml;&cedil;&para;¨&micro;&Auml;ADC1&micro;&Auml;&Egrave;í&frac14;&thorn;×&ordf;&raquo;&raquo;&AElig;&ocirc;&para;&macr;&sup1;&brvbar;&Auml;&Uuml;

//ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC&Iacute;¨&micro;&Agrave;,&sup2;&Eacute;&Ntilde;ù&Ecirc;±&frac14;&auml;&Icirc;&ordf;239.5&Ouml;&Uuml;&AElig;&Uacute;         
}      

void ADC1_ExternalTrig_T1_CC1_Init(void)
{
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
    TIM_OCInitTypeDef         TIM_OCInitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    /* Time Base configuration */
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 1000-1;         
    TIM_TimeBaseStructure.TIM_Prescaler = 72-1;      
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;   
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    /* TIM1 channel1 configuration in PWM mode */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
    TIM_OCInitStructure.TIM_Pulse = 500;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;         
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
    TIM_Cmd(TIM1, DISABLE);
}
void ADC1_DMA1_Init(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    /* DMA1 Channel1 Configuration ----------------------------------------------*/
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;////
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 2;////&cedil;&Auml;&Icirc;&ordf;2&pound;&iquest;
    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_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    DMA_ITConfig(DMA1_Channel1, DMA_IT_TC | DMA_IT_HT, ENABLE);///
    /* Enable DMA1 channel1 */
    DMA_Cmd(DMA1_Channel1, ENABLE);
}
void ADC1_DMA1_IT_Hander(void)
{
    if(DMA_GetFlagStatus(DMA1_FLAG_HT1))
    {
        DMA_ClearITPendingBit(DMA_IT_HT);
        memcpy(WriteBuff, ADC_ConvertedValue, ADC_BUFF_LEN*sizeof(uint16_t)/2);LED0=!LED0;
    }
    if(DMA_GetFlagStatus(DMA1_FLAG_TC1))
    {
        DMA_ClearITPendingBit(DMA1_FLAG_TC1);
        memcpy(WriteBuff+ADC_BUFF_LEN/2, ADC_ConvertedValue+ADC_BUFF_LEN/2, ADC_BUFF_LEN*sizeof(uint16_t)/2);LED0=!LED0;
    }
}


最佳答案

查看完整内容[请看2#楼]

看能参考帖子不;http://www.openedv.com/forum.php?mod=viewthread&tid=277863&highlight=%B6%A8%CA%B1%C6%F7%2BADC
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-7-16 11:18:54 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 05:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表