普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 3065|回复: 1

10

[复制链接]

3

主题

4

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2020-3-21 18:43:38 | 显示全部楼层 |阅读模式
6. ADC模数转换--多通道-DMA方式 - TIM4_CH4外部触发
普中6806L的板子,扩展程序里面的6. ADC模数转换--多通道-DMA方式 - TIM4_CH4外部触发
初始化定时器4,ADC触发选择的是ADC_ExternalTrigConv_T3_TRGO
查阅其他资料发现还要用TIM_SelectOutputTrigger选择触发源,但是这个程序里面都没有,却可以正确运行,有大神可以帮忙看看吗
  1. oid ADCx_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量       
  4.         ADC_InitTypeDef       ADC_InitStructure;
  5.         DMA_InitTypeDef DMA_InitStructure;
  6.        
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);
  8.         // 打开DMA时钟
  9.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  10.         // 复位DMA控制器
  11.         DMA_DeInit(DMA1_Channel1);
  12.        
  13.         // 配置 DMA 初始化结构体
  14.         // 外设基址为:ADC 数据寄存器地址
  15.         DMA_InitStructure.DMA_PeripheralBaseAddr = ( u32 ) ( & ( ADC1->DR ) );
  16.        
  17.         // 存储器地址,实际上就是一个内部SRAM的变量
  18.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertValue;
  19.        
  20.         // 数据源来自外设
  21.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  22.        
  23.         //数据数
  24.         DMA_InitStructure.DMA_BufferSize = 5;
  25.        
  26.         // 外设寄存器只有一个,地址不用递增
  27.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  28.         // 存储器地址固定
  29.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  30.        
  31.         // 外设数据大小为半字,即两个字节
  32.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  33.        
  34.         // 内存数据大小也为半字,跟外设数据大小相同
  35.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  36.        
  37.         // 循环传输模式
  38.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;       

  39.         // DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
  40.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  41.        
  42.         // 禁止存储器到存储器模式,因为是从外设到存储器
  43.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  44.        
  45.         // 初始化DMA
  46.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  47.        
  48.         // 使能 DMA 通道
  49.         DMA_Cmd(DMA1_Channel1 , ENABLE);
  50.        
  51.        
  52.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
  53.        
  54.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//ADC
  55.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模拟输入
  56.         GPIO_Init(GPIOC,&GPIO_InitStructure);
  57.        
  58.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  59.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式       
  60.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//打开连续转换
  61.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;//禁止触发检测,使用软件触发
  62.         ADC_InitStructure.ADC_DataAlign = ADC_ExternalTrigConv_T4_CC4;//右对齐       
  63.         ADC_InitStructure.ADC_NbrOfChannel = 5;//1个转换在规则序列中 也就是只转换规则序列1
  64.         ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
  65.        
  66.         ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);        //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度                            
  67.         ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5);        //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度                            
  68.         ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_239Cycles5);
  69.         ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_239Cycles5);
  70.         ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_239Cycles5);
  71.        
  72.         ADC_Cmd(ADC1, ENABLE);//开启AD转换器
  73.        
  74.         // 使能ADC DMA 请求
  75.         ADC_DMACmd(ADC1, ENABLE);
  76.        
  77.         ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
  78.         while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
  79.        
  80.         ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
  81.         while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序

  82.         ADC_SoftwareStartConvCmd(ADC1, DISABLE);//使能或者失能指定的ADC的软件转换启动功能
  83.        
  84. }
  85. 定时器部分
  86. void TIM4_Init(u16 per,u16 psc)
  87. {
  88.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  89.         NVIC_InitTypeDef NVIC_InitStructure;
  90.        
  91.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
  92.        
  93.         TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值
  94.         TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
  95.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  96.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
  97.         TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
  98.        
  99.         TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
  100.         TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
  101.        
  102.         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道
  103.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
  104.         NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //子优先级
  105.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  106.         NVIC_Init(&NVIC_InitStructure);       
  107.        
  108.         TIM_Cmd(TIM4,ENABLE); //使能定时器       
  109. }

  110. /*******************************************************************************
  111. * 函 数 名         : TIM4_IRQHandler
  112. * 函数功能                   : TIM4中断函数
  113. * 输    入         : 无
  114. * 输    出         : 无
  115. *******************************************************************************/
  116. extern float vol[5];
  117. void TIM4_IRQHandler(void)
  118. {
  119.         if(TIM_GetITStatus(TIM4,TIM_IT_Update))
  120.         {
  121.                 //led2=!led2;
  122.                 vol[0]=(float)ADC_ConvertValue[0]*(3.3/4096);
  123.                         printf("检测vol[0]电压值为:%.2fV\r\n",vol[0]);
  124.                         vol[1]=(float)ADC_ConvertValue[1]*(3.3/4096);
  125.                         printf("检测vol[1]电压值为:%.2fV\r\n",vol[1]);
  126.                         vol[2]=(float)ADC_ConvertValue[2]*(3.3/4096);
  127.                         printf("检测vol[2]电压值为:%.2fV\r\n",vol[2]);
  128.                         vol[3]=(float)ADC_ConvertValue[3]*(3.3/4096);
  129.                         printf("检测vol[3]电压值为:%.2fV\r\n",vol[3]);
  130.                         vol[4]=(float)ADC_ConvertValue[4]*(3.3/4096);
  131.                         printf("检测vol[4]电压值为:%.2fV\r\n",vol[4]);
  132.         }
  133.         TIM_ClearITPendingBit(TIM4,TIM_IT_Update);       
  134. }


复制代码
回复

使用道具 举报

3

主题

4

帖子

75

积分

注册会员

Rank: 2

积分
75
 楼主| 发表于 2020-4-7 21:33:16 | 显示全部楼层
抱歉,以为是悬赏积分填成10了,耽误各位浏览时间
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-20 08:37 , Processed in 0.105818 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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