打印
[APM32F4]

APM32F411 双ADC中断采样配置

[复制链接]
10137|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Alden|  楼主 | 2023-11-30 10:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#技术资源#
上一篇讲了APM32F411 相比APM32F407和ST411等的ADC2基址地址不同,需要对标准库的stm32f4xx.h中的ADC2_BASE进行修改。
https://bbs.21ic.com/icview-3337494-1-1.html
有同学可能对信息的配置还不是很清楚,这里详细整理下。

为了减少工作量,直接在野火407开发板的配套例程上进行修改。
第一步:将407的工程修改为411的工程。
1、更改芯片选型

2、更改工程宏定义

3、启动文件更改为411的

4、时钟配置中外部晶振默认是有源晶振,使用无源晶振可以修改。

这样就能将原本407的工程修改为适配411的工程。
第二步:修改增加APM32F411的ADC2配置
1、更改ADC2基地址

2、ADC.h文件中增加ADC2的宏定义

3、ADC.c文件中增加ADC2的初始化。
__IO uint16_t ADC_ConvertedValue[2];

static void Rheostat_ADC_GPIO_Config(void)
{
                GPIO_InitTypeDef GPIO_InitStructure;
       
        // 使能 GPIO 时钟
        RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK1, ENABLE);
        RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK2, ENABLE);
               
        // 配置 IO
        GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;            
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //不上拉不下拉
        GPIO_Init(RHEOSTAT_ADC_GPIO_PORT1, &GPIO_InitStructure);

        // 配置 IO
        GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;            
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //不上拉不下拉
        GPIO_Init(RHEOSTAT_ADC_GPIO_PORT2, &GPIO_InitStructure);       
}

static void Rheostat_ADC_Mode_Config(void)
{
        //DMA_InitTypeDef DMA_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
       

       
        // 开启ADC时钟
        RCC_APB2PeriphClockCmd(RHEOSTAT_ADC1_CLK , ENABLE);
  RCC_APB2PeriphClockCmd(RHEOSTAT_ADC2_CLK , ENABLE);
       
  // -------------------ADC Common 结构体 参数 初始化------------------------
        // 独立ADC模式
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  // 时钟为fpclk x分频       
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div6;
  // 禁止DMA直接访问模式       
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  // 采样时间间隔       
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;  
  ADC_CommonInit(&ADC_CommonInitStructure);
       
  // -------------------ADC Init 结构体 参数 初始化--------------------------
        ADC_StructInit(&ADC_InitStructure);
  // ADC 分辨率
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  // 禁止扫描模式,多通道采集才需要       
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  // 连续转换       
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  //禁止外部边沿触发
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  //外部触发通道,本例子使用软件触发,此值随便赋值即可
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  //数据右对齐       
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  //转换通道 1个
  ADC_InitStructure.ADC_NbrOfConversion = 1;
       
  //---------------------------------------------------------------------------       
  ADC_Init(RHEOSTAT_ADC1, &ADC_InitStructure);       
   // 配置 ADC 通道转换顺序为1,第一个转换,采样时间为3个时钟周期
  ADC_RegularChannelConfig(RHEOSTAT_ADC1, RHEOSTAT_ADC_CHANNEL1, 1, ADC_SampleTime_112Cycles);   
  //---------------------------------------------------------------------------
       
        ADC_Init(RHEOSTAT_ADC2, &ADC_InitStructure);
  // 配置 ADC 通道转换顺序为1,第一个转换,采样时间为3个时钟周期
  ADC_RegularChannelConfig(RHEOSTAT_ADC2, RHEOSTAT_ADC_CHANNEL2, 1, ADC_SampleTime_112Cycles);   
  //---------------------------------------------------------------------------
               
        ADC_ITConfig(RHEOSTAT_ADC1, ADC_IT_EOC, ENABLE);
                ADC_ITConfig(RHEOSTAT_ADC2, ADC_IT_EOC, ENABLE);
  // 使能ADC
  ADC_Cmd(RHEOSTAT_ADC1, ENABLE);  
  ADC_Cmd(RHEOSTAT_ADC2, ENABLE);   
  
  //开始adc转换,软件触发
  ADC_SoftwareStartConv(RHEOSTAT_ADC1);
  ADC_SoftwareStartConv(RHEOSTAT_ADC2);
}
ADC2的使用方式与ADC1是完全相同的。
4、ADC中断函数中增加ADC2
void ADC_IRQHandler(void)
{
        if(ADC_GetITStatus(RHEOSTAT_ADC1,ADC_IT_EOC)==SET)
        {
  // 读取ADC的转换值
                ADC_ConvertedValue[0] = ADC_GetConversionValue(RHEOSTAT_ADC1);

        }
        ADC_ClearITPendingBit(RHEOSTAT_ADC1,ADC_IT_EOC);
       
        if(ADC_GetITStatus(RHEOSTAT_ADC2,ADC_IT_EOC)==SET)
        {
                        ADC_ClearITPendingBit(RHEOSTAT_ADC2,ADC_IT_EOC);
  // 读取ADC的转换值
                ADC_ConvertedValue[1] = ADC_GetConversionValue(RHEOSTAT_ADC2);

        }
}       
ADC_ConvertedValue[2]中就分别是ADC1和ADC2的采样值。
在main中调用读取即可。
ADC—双ADC中断.zip (9.87 MB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

83

帖子

1

粉丝