[STM32F4] stm32F407 ADC

[复制链接]
3321|40
 楼主| c17 发表于 2023-5-27 00:51 | 显示全部楼层
电压转换 865206470e39a688a6.png
 楼主| c17 发表于 2023-5-27 00:51 | 显示全部楼层
多重工作模式:
ADC_CCR:MULTI[4:0]

ADC_CCR:DMA[1:0]

96786470e3a7d5e2b.png
 楼主| c17 发表于 2023-5-27 00:52 | 显示全部楼层
独立模式 29716470e3b305ad8.png
 楼主| c17 发表于 2023-5-27 00:52 | 显示全部楼层
双重规则同步模式

1、规则指的是只适用于规则通道,注入通道不行
2、同步指的是两个/三个ADC同时采集多个通道,
比如示波器的双通道同时采集。
注意:不要在同步模式时采集同一个通道

   如下是ADC 1/2 双重规则同步模式图

ADC1采集ch10 和ch11

ADC2采集ch11 和ch12

ADC 1/2 同步采集 ch10/11  ch11/12
373176470e3c7c8cd7.png
 楼主| c17 发表于 2023-5-27 00:52 | 显示全部楼层
多重交替模式
1、交替模式只能用于规则组,通常只有一个通道,在一个ADC转换的时候,另外一个ADC又开始采集,这样可以提高ADC的采样率,最高为6M
2、数据传输时使用DMA模式2,当有两个数据项可用时( 32bit),生成一个DMA请求。

这是三个ADC 交替模式,用模式2,数据组合方式
525806470e3d949b4b.png
 楼主| c17 发表于 2023-5-27 00:53 | 显示全部楼层
542716470e3e90c685.png
305336470e3e232464.png

DMA mode 2: On each DMA request (two data items are available) two halfwords
representing two ADC-converted data items are transferred as a word.
In Dual ADC mode, both ADC2 and ADC1 data are transferred on the first request
(ADC2 data take the upper half-word and ADC1 data take the lower half-word) and
so on.
In Triple ADC mode, three DMA requests are generated. On the first request, both
ADC2 and ADC1 data are transferred (ADC2 data take the upper half-word and
ADC1 data take the lower half-word). On the second request, both ADC1 and
ADC3 data are transferred (ADC1 data take the upper half-word and ADC3 data
take the lower half-word).On the third request, both ADC3 and ADC2 data are
transferred (ADC3 data take the upper half-word and ADC2 data take the lower
half-word) and so on.
DAM mode 2 is used in interleaved mode and in regular simultaneous mode (for
Dual ADC mode only).
Example:
a) Interleaved dual mode: a DMA request is generated each time 2 data items are
available:
1st request: ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]
2nd request: ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]
b) Interleaved triple mode: a DMA request is generated each time 2 data items are
available//这是上面三个ADC图数据的组合方式,假如用DMA 的时候,用三个32位数组
 楼主| c17 发表于 2023-5-27 00:53 | 显示全部楼层
第一个存储的是1st request:  ,二个是2nd request,三个是3rd request
1st request: ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]


2nd request: ADC_CDR[31:0] = ADC1_DR[15:0] | ADC3_DR[15:0]
3rd request: ADC_CDR[31:0] = ADC3_DR[15:0] | ADC2_DR[15:0]
4th request: ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]
 楼主| c17 发表于 2023-5-27 00:53 | 显示全部楼层
固件结构介绍:
ADC_InitTypeDef

657826470e41243c6a.png
ADC_Resolution: 配置 ADC 的分辨率,可选的分辨率有12 位、 10 位、 8 位和 6 位。 ADC_CR1:RES[1:0]
ScanConvMode: 配置是否使用扫描模式,单通道DISABLE,多通道 ENABLE。 ADC_CR1:SCAN
ADC_ContinuousConvMode: 配置连续转换还是单次转换。 ADC_CR1: CONT
ADC_ExternalTrigConvEdge: 外部触发极性选择,如果使用外部触发,可以选择触发的极性,可选有禁止触发检测、上升沿触发检测、下降沿触发检测以及上升沿和下降沿均可触发检测。 ADC_CR2: EXTEN/ JEXTEN
 楼主| c17 发表于 2023-5-27 00:54 | 显示全部楼层
ADC_ExternalTrigConv: 外部触发选择,实际上,我们一般使用软件自动触发。 ADC_CR2: EXTSEL[3:0]/ JEXTSEL[3:0]
ADC_DataAlign: 转换结果数据对齐模式,可选ADC_DataAlign_Right 或ADC_DataAlign_Left。ADC_CR2:ALIGN
ADC_NbrOfChannel: AD 转换通道数目。 ADC_SQR1:L[3:0]/ADC_JSQR:JL[1:0]
ADC_CommonInitTypeDef 这是ADC共用初始化结构体

28976470e42d03c8a.png

ADC_Mode: ADC模工作式选择,有独立模式、双重模式以及三重模式。 ADC_CCR:MULTI
ADC_Prescaler: ADC 时钟分频系数选择, ADC 时钟是有 PCLK2 分频而来,分频系数决定 ADC 时钟频率,可选的分频系数为 2、 4、 6 和 8。 ADC 最大时钟配置为36MHz。 ADC_CCR:ADCPRE
 楼主| c17 发表于 2023-5-27 00:54 | 显示全部楼层
ADC_DMAAccessMode: DMA 模式设置,只有在双重或者三重模式才需要设置,可以设置三种模式,具体可参考参考手册11.9章节的说明。 ADC_CCR:DMA
Bits 15:14 DMA: Direct memory access mode for multi ADC mode
This bit-field is set and cleared by software. Refer to the DMA controller section for more
details.
00: DMA mode disabled
01: DMA mode 1 enabled (2 / 3 half-words one by one - 1 then 2 then 3)
10: DMA mode 2 enabled (2 / 3 half-words by pairs - 2&1 then 1&3 then 3&2)
11: DMA mode 3 enabled (2 / 3 bytes by pairs - 2&1 then 1&3 then 3&2)
 楼主| c17 发表于 2023-5-27 00:54 | 显示全部楼层
ADC_TwoSamplingDelay: 2 个采样阶段之间的延迟,仅适用于双重或三重交错模式。 ADC_CCR:DELAY

Bit 11:8 DELAY: Delay between 2 sampling phases
Set and cleared by software. These bits are used in dual or triple interleaved modes.
0000: 5 * TADCCLK
0001: 6 * TADCCLK
0010: 7 * TADCCLK
...
1111: 20 * TADCCLK
Bits 7:5 Reserved, must be kept at reset value.
 楼主| c17 发表于 2023-5-27 00:54 | 显示全部楼层
1-配置规则通道的转换顺序


ADC_RegularChannelConfig
(ADC_TypeDef* ADCx,    // 使用哪个ADC
uint8_t ADC_Channel,      // 使用哪个通道
uint8_t Rank,                      // 通道的转换顺序
uint8_t ADC_SampleTime) // 采样时间
 楼主| c17 发表于 2023-5-27 00:54 | 显示全部楼层
2、使能ADC


ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState)
ADC_CR2:ADON
 楼主| c17 发表于 2023-5-27 00:55 | 显示全部楼层
3-软件触发转换
ADC_SoftwareStartConv(ADC_TypeDef* ADCx)
ADC_CR2:SWSTART
 楼主| c17 发表于 2023-5-27 00:55 | 显示全部楼层
4-单重ADC DMA 请求
ADC_DMARequestAfterLastTransferCmd(ADC_TypeDef* ADCx,
FunctionalState NewState)
ADC_CR2:DDS
ADC_DMACmd(RHEOSTAT_ADC, ENABLE);
ADC_CR2:DMA

 楼主| c17 发表于 2023-5-27 00:55 | 显示全部楼层
5-多重ADC DMA 请求
ADC_MultiModeDMARequestAfterLastTransferCmd(FunctionalState
NewState)
ADC_CCR:DDS, ADC_CCR:DMA
 楼主| c17 发表于 2023-5-27 00:55 | 显示全部楼层
编程
  1. #ifndef __BSP_ADC_H
  2. #define        __BSP_ADC_H

  3. #include "stm32f4xx.h"

  4. // ADC GPIO 宏定义
  5. #define RHEOSTAT_ADC_GPIO_PORT    GPIOB
  6. #define RHEOSTAT_ADC_GPIO_PIN     GPIO_Pin_0
  7. #define RHEOSTAT_ADC_GPIO_CLK     RCC_AHB1Periph_GPIOB

  8. // ADC 序号宏定义
  9. #define RHEOSTAT_ADC              ADC1
  10. #define RHEOSTAT_ADC_CLK          RCC_APB2Periph_ADC1
  11. #define RHEOSTAT_ADC_CHANNEL      ADC_Channel_8


  12. // ADC 中断宏定义
  13. #define Rheostat_ADC_IRQ            ADC_IRQn
  14. #define Rheostat_ADC_INT_FUNCTION   ADC_IRQHandler


  15. void Rheostat_Init(void);

  16. #endif /* __BSP_ADC_H */





  17. void Rheostat_Init(void)
  18. {
  19.         Rheostat_ADC_GPIO_Config();
  20.         Rheostat_ADC_Mode_Config();
  21.         Rheostat_ADC_NVIC_Config();
  22. }

  23. static void Rheostat_ADC_GPIO_Config(void)
  24. {
  25.                 GPIO_InitTypeDef GPIO_InitStructure;
  26.        
  27.         // 使能 GPIO 时钟
  28.         RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK, ENABLE);
  29.                
  30.         // 配置 IO
  31.         GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN;
  32.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;            
  33.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //不上拉不下拉
  34.         GPIO_Init(RHEOSTAT_ADC_GPIO_PORT, &GPIO_InitStructure);               
  35. }

  36. static void Rheostat_ADC_Mode_Config(void)
  37. {
  38.         ADC_InitTypeDef ADC_InitStructure;
  39.   ADC_CommonInitTypeDef ADC_CommonInitStructure;
  40.        
  41.   // 开启ADC时钟
  42.         RCC_APB2PeriphClockCmd(RHEOSTAT_ADC_CLK , ENABLE);

  43.   // -------------------ADC Common 结构体 参数 初始化------------------------
  44.         // 独立ADC模式
  45.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  46.   // 时钟为fpclk x分频       
  47.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
  48.   // 禁止DMA直接访问模式       
  49.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  50.   // 采样时间间隔       
  51.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;  
  52.   ADC_CommonInit(&ADC_CommonInitStructure);
  53.        
  54.   // -------------------ADC Init 结构体 参数 初始化--------------------------
  55.         ADC_StructInit(&ADC_InitStructure);
  56.   // ADC 分辨率
  57.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  58.   // 禁止扫描模式,多通道采集才需要       
  59.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  60.   // 连续转换       
  61.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  62.   //禁止外部边沿触发
  63.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  64.   //外部触发通道,本例子使用软件触发,此值随便赋值即可
  65.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  66.   //数据右对齐       
  67.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  68.   //转换通道 1个
  69.   ADC_InitStructure.ADC_NbrOfConversion = 1;                                    
  70.   ADC_Init(RHEOSTAT_ADC, &ADC_InitStructure);
  71.   //---------------------------------------------------------------------------
  72.        
  73.   // 配置 ADC 通道转换顺序为1,第一个转换,采样时间为3个时钟周期
  74.   ADC_RegularChannelConfig(RHEOSTAT_ADC, RHEOSTAT_ADC_CHANNEL, 1, ADC_SampleTime_56Cycles);
  75.         // ADC 转换结束产生中断,在中断服务程序中读取转换值
  76.        

  77.         ADC_ITConfig(RHEOSTAT_ADC, ADC_IT_EOC, ENABLE);
  78.   // 使能ADC
  79.   ADC_Cmd(RHEOSTAT_ADC, ENABLE);  
  80.   //开始adc转换,软件触发
  81.   ADC_SoftwareStartConv(RHEOSTAT_ADC);
  82. }

  83. // 配置中断优先级
  84. static void Rheostat_ADC_NVIC_Config(void)
  85. {
  86.   NVIC_InitTypeDef NVIC_InitStructure;
  87.        
  88.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  89.        
  90.   NVIC_InitStructure.NVIC_IRQChannel = Rheostat_ADC_IRQ;
  91.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  92.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  93.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  94.        
  95.   NVIC_Init(&NVIC_InitStructure);
  96. }


  97. 中断函数
  98. extern __IO uint16_t ADC_ConvertedValue;

  99. // ADC 转换完成中断服务程序
  100. void ADC_IRQHandler(void)
  101. {
  102.         if(ADC_GetITStatus(RHEOSTAT_ADC,ADC_IT_EOC)==SET)
  103.         {
  104.   // 读取ADC的转换值
  105.                 ADC_ConvertedValue = ADC_GetConversionValue(RHEOSTAT_ADC);

  106.         }
  107.         ADC_ClearITPendingBit(RHEOSTAT_ADC,ADC_IT_EOC);

  108. }       

  109. int main(void)
  110. {       
  111.   /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  112.   Debug_USART_Config();
  113.         Rheostat_Init();       
  114.        
  115.     while (1)
  116.     {
  117.            
  118.                         ADC_Vol =(float) ADC_ConvertedValue/4096*(float)3.3; // 读取转换的AD值

  119.       printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue);
  120.       printf("\r\n The current AD value = %f V \r\n",ADC_Vol);     

  121.       Delay(0xffffee);  
  122.     }
  123. }
 楼主| c17 发表于 2023-5-27 00:55 | 显示全部楼层
ADC—独立模式-单通道-DMA
  1. #ifndef __BSP_ADC_H
  2. #define        __BSP_ADC_H

  3. #include "stm32f4xx.h"

  4. // ADC GPIO 宏定义
  5. #define RHEOSTAT_ADC_GPIO_PORT    GPIOB
  6. #define RHEOSTAT_ADC_GPIO_PIN     GPIO_Pin_0
  7. #define RHEOSTAT_ADC_GPIO_CLK     RCC_AHB1Periph_GPIOB

  8. // ADC 序号宏定义
  9. #define RHEOSTAT_ADC              ADC1
  10. #define RHEOSTAT_ADC_CLK          RCC_APB2Periph_ADC1
  11. #define RHEOSTAT_ADC_CHANNEL      ADC_Channel_8

  12. // ADC DR寄存器宏定义,ADC转换后的数字值则存放在这里
  13. #define RHEOSTAT_ADC_DR_ADDR    ((u32)ADC1+0x4c)

  14. // ADC DMA 通道宏定义,这里我们使用DMA传输
  15. #define RHEOSTAT_ADC_DMA_CLK      RCC_AHB1Periph_DMA2
  16. #define RHEOSTAT_ADC_DMA_CHANNEL  DMA_Channel_0
  17. #define RHEOSTAT_ADC_DMA_STREAM   DMA2_Stream0



  18. void Rheostat_Init(void);

  19. #endif /* __BSP_ADC_H */





  20. /**
  21.   ******************************************************************************
  22.   * [url=home.php?mod=space&uid=288409]@file[/url]    bsp_bsp_adc.c
  23.   * [url=home.php?mod=space&uid=187600]@author[/url]  fire
  24.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.0
  25.   * [url=home.php?mod=space&uid=212281]@date[/url]    2015-xx-xx
  26.   * [url=home.php?mod=space&uid=247401]@brief[/url]   adc驱动
  27.   ******************************************************************************
  28.   * @attention
  29.   *
  30.   * 实验平台:野火  STM32 F407 开发板  
  31.   * 论坛    :http://www.firebbs.cn
  32.   * 淘宝    :https://fire-stm32.taobao.com
  33.   *
  34.   ******************************************************************************
  35.   */
  36. #include "./adc/bsp_adc.h"

  37. __IO uint16_t ADC_ConvertedValue;

  38. static void Rheostat_ADC_GPIO_Config(void)
  39. {
  40.                 GPIO_InitTypeDef GPIO_InitStructure;
  41.        
  42.         // 使能 GPIO 时钟
  43.         RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK, ENABLE);
  44.                
  45.         // 配置 IO
  46.         GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN;
  47.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;            
  48.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //不上拉不下拉
  49.         GPIO_Init(RHEOSTAT_ADC_GPIO_PORT, &GPIO_InitStructure);               
  50. }

  51. static void Rheostat_ADC_Mode_Config(void)
  52. {
  53.         DMA_InitTypeDef DMA_InitStructure;
  54.         ADC_InitTypeDef ADC_InitStructure;
  55.   ADC_CommonInitTypeDef ADC_CommonInitStructure;
  56.        
  57.   // ------------------DMA Init 结构体参数 初始化--------------------------
  58.   // ADC1使用DMA2,数据流0,通道0,这个是手册固定死的
  59.   // 开启DMA时钟
  60.   RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_DMA_CLK, ENABLE);
  61.         // 外设基址为:ADC 数据寄存器地址
  62.         DMA_InitStructure.DMA_PeripheralBaseAddr = RHEOSTAT_ADC_DR_ADDR;       
  63.   // 存储器地址,实际上就是一个内部SRAM的变量       
  64.         DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&ADC_ConvertedValue;  
  65.   // 数据传输方向为外设到存储器       
  66.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;       
  67.         // 缓冲区大小为,指一次传输的数据量
  68.         DMA_InitStructure.DMA_BufferSize = 1;       
  69.         // 外设寄存器只有一个,地址不用递增
  70.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  71.   // 存储器地址固定
  72.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  73.   // // 外设数据大小为半字,即两个字节
  74.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  75.   //        存储器数据大小也为半字,跟外设数据大小相同
  76.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;       
  77.         // 循环传输模式
  78.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  79.   // DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
  80.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  81.   // 禁止DMA FIFO        ,使用直连模式
  82.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;  
  83.   // FIFO 大小,FIFO模式禁止时,这个不用配置       
  84.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  85.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  86.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;  
  87.         // 选择 DMA 通道,通道存在于流中
  88.   DMA_InitStructure.DMA_Channel = RHEOSTAT_ADC_DMA_CHANNEL;
  89.   //初始化DMA流,流相当于一个大的管道,管道里面有很多通道
  90.         DMA_Init(RHEOSTAT_ADC_DMA_STREAM, &DMA_InitStructure);
  91.         // 使能DMA流
  92.   DMA_Cmd(RHEOSTAT_ADC_DMA_STREAM, ENABLE);
  93.        
  94.         // 开启ADC时钟
  95.         RCC_APB2PeriphClockCmd(RHEOSTAT_ADC_CLK , ENABLE);
  96.   // -------------------ADC Common 结构体 参数 初始化------------------------
  97.         // 独立ADC模式
  98.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  99.   // 时钟为fpclk x分频       
  100.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
  101.   // 禁止DMA直接访问模式       
  102.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  103.   // 采样时间间隔       
  104.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;  
  105.   ADC_CommonInit(&ADC_CommonInitStructure);
  106.        
  107.   // -------------------ADC Init 结构体 参数 初始化--------------------------
  108.         ADC_StructInit(&ADC_InitStructure);
  109.   // ADC 分辨率
  110.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  111.   // 禁止扫描模式,多通道采集才需要       
  112.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  113.   // 连续转换       
  114.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  115.   //禁止外部边沿触发
  116.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  117.   //外部触发通道,本例子使用软件触发,此值随便赋值即可
  118.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  119.   //数据右对齐       
  120.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  121.   //转换通道 1个
  122.   ADC_InitStructure.ADC_NbrOfConversion = 1;                                    
  123.   ADC_Init(RHEOSTAT_ADC, &ADC_InitStructure);
  124.   //---------------------------------------------------------------------------
  125.        
  126.   // 配置 ADC 通道转换顺序为1,第一个转换,采样时间为3个时钟周期
  127.   ADC_RegularChannelConfig(RHEOSTAT_ADC, RHEOSTAT_ADC_CHANNEL, 1, ADC_SampleTime_56Cycles);

  128.   // 使能DMA请求 after last transfer (Single-ADC mode)
  129.   ADC_DMARequestAfterLastTransferCmd(RHEOSTAT_ADC, ENABLE);
  130.   // 使能ADC DMA
  131.   ADC_DMACmd(RHEOSTAT_ADC, ENABLE);
  132.        
  133.         // 使能ADC
  134.   ADC_Cmd(RHEOSTAT_ADC, ENABLE);  
  135.   //开始adc转换,软件触发
  136.   ADC_SoftwareStartConv(RHEOSTAT_ADC);
  137. }



  138. void Rheostat_Init(void)
  139. {
  140.         Rheostat_ADC_GPIO_Config();
  141.         Rheostat_ADC_Mode_Config();
  142. }


  143. int main(void)
  144. {       
  145.   /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  146.   Debug_USART_Config();
  147.         Rheostat_Init();       
  148.        
  149.     while (1)
  150.     {
  151.    
  152.       printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue);
  153.       printf("\r\n The current AD value = %f V \r\n",ADC_Vol);     

  154.                         ADC_Vol =(float) ADC_ConvertedValue/4096*(float)3.3; // 读取转换的AD值


  155.       Delay(0xffffee);  
  156.     }
  157. }
 楼主| c17 发表于 2023-5-27 00:56 | 显示全部楼层
ADC—独立模式-多通道-DMA  scan模式 三根个引脚采集
  1. #ifndef __BSP_ADC_H
  2. #define        __BSP_ADC_H

  3. #include "stm32f4xx.h"

  4. #define RHEOSTAT_NOFCHANEL      3

  5. /*=====================通道1 IO======================*/
  6. // PB0 通过调帽接电位器
  7. // ADC IO宏定义
  8. #define RHEOSTAT_ADC_GPIO_PORT1    GPIOB
  9. #define RHEOSTAT_ADC_GPIO_PIN1     GPIO_Pin_0
  10. #define RHEOSTAT_ADC_GPIO_CLK1     RCC_AHB1Periph_GPIOB
  11. #define RHEOSTAT_ADC_CHANNEL1      ADC_Channel_8
  12. /*=====================通道2 IO ======================*/
  13. // PB1 通过调帽接光敏电阻
  14. // ADC IO宏定义
  15. #define RHEOSTAT_ADC_GPIO_PORT2    GPIOB
  16. #define RHEOSTAT_ADC_GPIO_PIN2     GPIO_Pin_1
  17. #define RHEOSTAT_ADC_GPIO_CLK2     RCC_AHB1Periph_GPIOB
  18. #define RHEOSTAT_ADC_CHANNEL2      ADC_Channel_9
  19. /*=====================通道3 IO ======================*/
  20. // PA6 悬空,可用杜邦线接3V3或者GND来实验
  21. // ADC IO宏定义
  22. #define RHEOSTAT_ADC_GPIO_PORT3    GPIOA
  23. #define RHEOSTAT_ADC_GPIO_PIN3     GPIO_Pin_6
  24. #define RHEOSTAT_ADC_GPIO_CLK3     RCC_AHB1Periph_GPIOA
  25. #define RHEOSTAT_ADC_CHANNEL3     ADC_Channel_6

  26. // ADC 序号宏定义
  27. #define RHEOSTAT_ADC              ADC1
  28. #define RHEOSTAT_ADC_CLK          RCC_APB2Periph_ADC1
  29. // ADC DR寄存器宏定义,ADC转换后的数字值则存放在这里
  30. #define RHEOSTAT_ADC_DR_ADDR    ((u32)ADC1+0x4c)


  31. // ADC DMA 通道宏定义,这里我们使用DMA传输
  32. #define RHEOSTAT_ADC_DMA_CLK      RCC_AHB1Periph_DMA2
  33. #define RHEOSTAT_ADC_DMA_CHANNEL  DMA_Channel_0
  34. #define RHEOSTAT_ADC_DMA_STREAM   DMA2_Stream0



  35. void Rheostat_Init(void);

  36. #endif /* __BSP_ADC_H */

  37. /**
  38.   ******************************************************************************
  39.   * @file    bsp_bsp_adc.c
  40.   * @author  fire
  41.   * @version V1.0
  42.   * @date    2015-xx-xx
  43.   * @brief   adc驱动
  44.   ******************************************************************************
  45.   * @attention
  46.   *
  47.   * 实验平台:野火  STM32 F407 开发板  
  48.   * 论坛    :http://www.firebbs.cn
  49.   * 淘宝    :https://fire-stm32.taobao.com
  50.   *
  51.   ******************************************************************************
  52.   */
  53. #include "./adc/bsp_adc.h"

  54. __IO uint16_t ADC_ConvertedValue[RHEOSTAT_NOFCHANEL]={0};

  55. static void Rheostat_ADC_GPIO_Config(void)
  56. {
  57.         GPIO_InitTypeDef GPIO_InitStructure;       
  58.         /*=====================通道1======================*/       
  59.         // 使能 GPIO 时钟
  60.         RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK1,ENABLE);               
  61.         // 配置 IO
  62.   GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN1;
  63.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  64.   //不上拉不下拉       
  65.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  66.         GPIO_Init(RHEOSTAT_ADC_GPIO_PORT1, &GPIO_InitStructure);

  67.         /*=====================通道2======================*/
  68.         // 使能 GPIO 时钟
  69.         RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK2,ENABLE);               
  70.         // 配置 IO
  71.   GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN2;
  72.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  73.   //不上拉不下拉       
  74.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  75.         GPIO_Init(RHEOSTAT_ADC_GPIO_PORT2, &GPIO_InitStructure);       

  76.         /*=====================通道3=======================*/
  77.         // 使能 GPIO 时钟
  78.         RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK3,ENABLE);               
  79.         // 配置 IO
  80.   GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN3;
  81.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  82.   //不上拉不下拉       
  83.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  84.         GPIO_Init(RHEOSTAT_ADC_GPIO_PORT3, &GPIO_InitStructure);
  85. }

  86. static void Rheostat_ADC_Mode_Config(void)
  87. {
  88.         DMA_InitTypeDef DMA_InitStructure;
  89.         ADC_InitTypeDef ADC_InitStructure;
  90.   ADC_CommonInitTypeDef ADC_CommonInitStructure;
  91.        
  92.   // ------------------DMA Init 结构体参数 初始化--------------------------
  93.   // ADC1使用DMA2,数据流0,通道0,这个是手册固定死的
  94.   // 开启DMA时钟
  95.   RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_DMA_CLK, ENABLE);
  96.         // 外设基址为:ADC 数据寄存器地址
  97.         DMA_InitStructure.DMA_PeripheralBaseAddr = RHEOSTAT_ADC_DR_ADDR;       
  98.   // 存储器地址,实际上就是一个内部SRAM的变量       
  99.         DMA_InitStructure.DMA_Memory0BaseAddr = (u32)ADC_ConvertedValue;  
  100.   // 数据传输方向为外设到存储器       
  101.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;       
  102.         // 缓冲区大小为,指一次传输的数据量
  103.         DMA_InitStructure.DMA_BufferSize = RHEOSTAT_NOFCHANEL;       
  104.         // 外设寄存器只有一个,地址不用递增
  105.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  106.   // 存储器地址固定
  107.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  108.   // // 外设数据大小为半字,即两个字节
  109.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  110.   //        存储器数据大小也为半字,跟外设数据大小相同
  111.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;       
  112.         // 循环传输模式
  113.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  114.   // DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
  115.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  116.   // 禁止DMA FIFO        ,使用直连模式
  117.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;  
  118.   // FIFO 大小,FIFO模式禁止时,这个不用配置       
  119.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  120.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  121.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;  
  122.         // 选择 DMA 通道,通道存在于流中
  123.   DMA_InitStructure.DMA_Channel = RHEOSTAT_ADC_DMA_CHANNEL;
  124.   //初始化DMA流,流相当于一个大的管道,管道里面有很多通道
  125.         DMA_Init(RHEOSTAT_ADC_DMA_STREAM, &DMA_InitStructure);
  126.         // 使能DMA流
  127.   DMA_Cmd(RHEOSTAT_ADC_DMA_STREAM, ENABLE);
  128.        
  129.         // 开启ADC时钟
  130.         RCC_APB2PeriphClockCmd(RHEOSTAT_ADC_CLK , ENABLE);
  131.   // -------------------ADC Common 结构体 参数 初始化------------------------
  132.         // 独立ADC模式
  133.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  134.   // 时钟为fpclk x分频       
  135.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
  136.   // 禁止DMA直接访问模式       
  137.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  138.   // 采样时间间隔       
  139.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;  
  140.   ADC_CommonInit(&ADC_CommonInitStructure);
  141.        
  142.   // -------------------ADC Init 结构体 参数 初始化--------------------------
  143.         ADC_StructInit(&ADC_InitStructure);
  144.   // ADC 分辨率
  145.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  146.   // 扫描模式,多通道采集需要       
  147.   ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  148.   // 连续转换       
  149.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  150.   //禁止外部边沿触发
  151.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  152.   //外部触发通道,本例子使用软件触发,此值随便赋值即可
  153.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  154.   //数据右对齐       
  155.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  156.   //转换通道 1个
  157.   ADC_InitStructure.ADC_NbrOfConversion = RHEOSTAT_NOFCHANEL;                                    
  158.   ADC_Init(RHEOSTAT_ADC, &ADC_InitStructure);
  159.   //---------------------------------------------------------------------------
  160.        
  161.   // 配置 ADC 通道转换顺序和采样时间周期
  162.   ADC_RegularChannelConfig(RHEOSTAT_ADC, RHEOSTAT_ADC_CHANNEL1, 1,
  163.                                  ADC_SampleTime_3Cycles);
  164.   ADC_RegularChannelConfig(RHEOSTAT_ADC, RHEOSTAT_ADC_CHANNEL2, 2,
  165.                                  ADC_SampleTime_3Cycles);
  166.   ADC_RegularChannelConfig(RHEOSTAT_ADC, RHEOSTAT_ADC_CHANNEL3, 3,
  167.                                  ADC_SampleTime_3Cycles);

  168.   // 使能DMA请求 after last transfer (Single-ADC mode)
  169.   ADC_DMARequestAfterLastTransferCmd(RHEOSTAT_ADC, ENABLE);
  170.   // 使能ADC DMA
  171.   ADC_DMACmd(RHEOSTAT_ADC, ENABLE);
  172.        
  173.         // 使能ADC
  174.   ADC_Cmd(RHEOSTAT_ADC, ENABLE);  
  175.   //开始adc转换,软件触发
  176.   ADC_SoftwareStartConv(RHEOSTAT_ADC);
  177. }



  178. void Rheostat_Init(void)
  179. {
  180.         Rheostat_ADC_GPIO_Config();
  181.         Rheostat_ADC_Mode_Config();
  182. }



  183. /**
  184.   ******************************************************************************
  185.   * @file    main.c
  186.   * @author  fire
  187.   * @version V1.0
  188.   * @date    2015-xx-xx
  189.   * @brief   ADC例程
  190.   ******************************************************************************
  191.   * @attention
  192.   *
  193.   * 实验平台:野火  STM32 F407 开发板
  194.   * 论坛    :http://www.firebbs.cn
  195.   * 淘宝    :https://fire-stm32.taobao.com
  196.   *
  197.   ******************************************************************************
  198.   */
  199.   
  200. #include "stm32f4xx.h"
  201. #include "./usart/bsp_debug_usart.h"
  202. #include "./adc/bsp_adc.h"

  203. // ADC转换的电压值通过MDA方式传到SRAM
  204. extern __IO uint16_t ADC_ConvertedValue[RHEOSTAT_NOFCHANEL];

  205. // 局部变量,用于保存转换计算后的电压值          
  206. float ADC_ConvertedValueLocal[RHEOSTAT_NOFCHANEL]={0};

  207. static void Delay(__IO uint32_t nCount)         //简单的延时函数
  208. {
  209.         for(; nCount != 0; nCount--);
  210. }

  211. /**
  212.   * @brief  主函数
  213.   * @param  无
  214.   * @retval 无
  215.   */
  216. int main(void)
  217. {       
  218.   /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  219.   Debug_USART_Config();
  220.         Rheostat_Init();       
  221.        
  222.         while (1)
  223.         {
  224.                 ADC_ConvertedValueLocal[0] =(float) ADC_ConvertedValue[0]/4096*(float)3.3;
  225.                 ADC_ConvertedValueLocal[1] =(float) ADC_ConvertedValue[1]/4096*(float)3.3;
  226.                 ADC_ConvertedValueLocal[2] =(float) ADC_ConvertedValue[2]/4096*(float)3.3;
  227.                
  228.                 printf("\r\n CH1_C3 value = %f V \r\n",ADC_ConvertedValueLocal[0]);
  229.                 printf("\r\n CH2_PA4 value = %f V \r\n",ADC_ConvertedValueLocal[1]);
  230.                 printf("\r\n CH3_PA6 value = %f V \r\n",ADC_ConvertedValueLocal[2]);
  231.                
  232.                 printf("\r\n\r\n");
  233.                 Delay(0xffffff);  
  234.         }
  235. }



  236. /*********************************************END OF FILE**********************/



 楼主| c17 发表于 2023-5-27 00:56 | 显示全部楼层
ADC—双重ADC-多通道-规则同步   可以是SCAN模式,每个ADCX的多个通道

现在是ADC1 和2 的每一个通道
  1. /**
  2.   ******************************************************************************
  3.   * @file    main.c
  4.   * @author  fire
  5.   * @version V1.0
  6.   * @date    2015-xx-xx
  7.   * @brief   ADC例程
  8.   ******************************************************************************
  9.   * @attention
  10.   *
  11.   * 实验平台:野火  STM32 F407 开发板
  12.   * 论坛    :http://www.firebbs.cn
  13.   * 淘宝    :https://fire-stm32.taobao.com
  14.   *
  15.   ******************************************************************************
  16.   */
  17.   
  18. #include "stm32f4xx.h"
  19. #include "./usart/bsp_debug_usart.h"
  20. #include "./adc/bsp_adc.h"

  21. // ADC1转换的电压值通过MDA方式传到SRAM
  22. extern __IO uint16_t ADC_ConvertedValue[2];

  23. // 局部变量,用于保存转换计算后的电压值          
  24. float ADC_ConvertedValueLocal[2];

  25. static void Delay(__IO uint32_t nCount)         //简单的延时函数
  26. {
  27.         for(; nCount != 0; nCount--);
  28. }

  29. /**
  30.   * @brief  主函数
  31.   * @param  无
  32.   * @retval 无
  33.   */
  34. int main(void)
  35. {       
  36.   /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  37.   Debug_USART_Config();
  38.         Rheostat_Init();       
  39.        
  40.   while (1)
  41.   {
  42.     Delay(0xffffee);  
  43.    
  44.     ADC_ConvertedValueLocal[0] =(float)((uint16_t)ADC_ConvertedValue[0]*3.3/4096);
  45.     ADC_ConvertedValueLocal[1] =(float)((uint16_t)ADC_ConvertedValue[1]*3.3/4096);   
  46.    
  47.     printf("\r\n The current AD value = 0x%08X \r\n", ADC_ConvertedValue[0]);
  48.     printf("\r\n The current AD value = 0x%08X \r\n", ADC_ConvertedValue[1]);     
  49.    
  50.     printf("\r\n The current ADC1 value = %f V \r\n",ADC_ConvertedValueLocal[0]);
  51.     printf("\r\n The current ADC2 value = %f V \r\n",ADC_ConvertedValueLocal[1]);   
  52.   }
  53. }



  54. /*********************************************END OF FILE**********************/



  55. #ifndef __BSP_ADC_H
  56. #define        __BSP_ADC_H

  57. #include "stm32f4xx.h"

  58. /*=====================通道1 IO======================*/
  59. // PB0 通过调帽接电位器
  60. // ADC IO宏定义
  61. #define RHEOSTAT_ADC_GPIO_PORT1    GPIOB
  62. #define RHEOSTAT_ADC_GPIO_PIN1     GPIO_Pin_0
  63. #define RHEOSTAT_ADC_GPIO_CLK1     RCC_AHB1Periph_GPIOB

  64. // ADC 序号宏定义
  65. #define RHEOSTAT_ADC1             ADC1
  66. #define RHEOSTAT_ADC1_CLK         RCC_APB2Periph_ADC1
  67. #define RHEOSTAT_ADC_CHANNEL1     ADC_Channel_8
  68. /*=====================通道2 IO ======================*/
  69. // PB1 通过调帽接光敏电阻
  70. // ADC IO宏定义
  71. #define RHEOSTAT_ADC_GPIO_PORT2    GPIOB
  72. #define RHEOSTAT_ADC_GPIO_PIN2     GPIO_Pin_1
  73. #define RHEOSTAT_ADC_GPIO_CLK2     RCC_AHB1Periph_GPIOB

  74. #define RHEOSTAT_ADC2             ADC2
  75. #define RHEOSTAT_ADC2_CLK         RCC_APB2Periph_ADC2
  76. #define RHEOSTAT_ADC_CHANNEL2     ADC_Channel_9

  77. // ADC CDR寄存器宏定义,ADC转换后的数字值则存放在这里
  78. #define RHEOSTAT_ADC_CDR_ADDR    ((uint32_t)0x40012308)

  79. // ADC DMA 通道宏定义,这里我们使用DMA传输
  80. #define RHEOSTAT_ADC_DMA_CLK      RCC_AHB1Periph_DMA2
  81. #define RHEOSTAT_ADC_DMA_CHANNEL  DMA_Channel_0
  82. #define RHEOSTAT_ADC_DMA_STREAM   DMA2_Stream0


  83. void Rheostat_Init(void);

  84. #endif /* __BSP_ADC_H */

  85. /**
  86.   ******************************************************************************
  87.   * @file    bsp_bsp_adc.c
  88.   * @author  fire
  89.   * @version V1.0
  90.   * @date    2015-xx-xx
  91.   * @brief   adc驱动
  92.   ******************************************************************************
  93.   * @attention
  94.   *
  95.   * 实验平台:野火  STM32 F407 开发板  
  96.   * 论坛    :http://www.firebbs.cn
  97.   * 淘宝    :https://fire-stm32.taobao.com
  98.   *
  99.   ******************************************************************************
  100.   */
  101. #include "./adc/bsp_adc.h"

  102. __IO uint16_t ADC_ConvertedValue[2];

  103. static void Rheostat_ADC_GPIO_Config(void)
  104. {
  105.                 GPIO_InitTypeDef GPIO_InitStructure;
  106.        
  107.         // 使能 GPIO 时钟
  108.         RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK1, ENABLE);
  109.         RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK2, ENABLE);
  110.                
  111.         // 配置 IO
  112.         GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN1;
  113.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;            
  114.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //不上拉不下拉
  115.         GPIO_Init(RHEOSTAT_ADC_GPIO_PORT1, &GPIO_InitStructure);

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

  122. static void Rheostat_ADC_Mode_Config(void)
  123. {
  124.         DMA_InitTypeDef DMA_InitStructure;
  125.         ADC_InitTypeDef ADC_InitStructure;
  126.   ADC_CommonInitTypeDef ADC_CommonInitStructure;
  127.        
  128.   // ------------------DMA Init 结构体参数 初始化--------------------------
  129.   // ADC1使用DMA2,数据流0,通道0,这个是手册固定死的
  130.   // 开启DMA时钟
  131.   RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_DMA_CLK, ENABLE);
  132.         // 外设基址为:ADC 数据寄存器地址
  133.         DMA_InitStructure.DMA_PeripheralBaseAddr = RHEOSTAT_ADC_CDR_ADDR;       
  134.   // 存储器地址,实际上就是一个内部SRAM的变量       
  135.         DMA_InitStructure.DMA_Memory0BaseAddr = (u32)ADC_ConvertedValue;  
  136.   // 数据传输方向为外设到存储器       
  137.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;       
  138.         // 缓冲区大小为,指一次传输的数据量
  139.         DMA_InitStructure.DMA_BufferSize = 2;       
  140.         // 外设寄存器只有一个,地址不用递增
  141.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  142.   // 存储器地址固定
  143.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  144.   // // 外设数据大小为半字,即两个字节
  145.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  146.   //        存储器数据大小也为半字,跟外设数据大小相同
  147.         DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;       
  148.         // 循环传输模式
  149.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  150.   // DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
  151.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  152.   // 禁止DMA FIFO        ,使用直连模式
  153.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;  
  154.   // FIFO 大小,FIFO模式禁止时,这个不用配置       
  155.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  156.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  157.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;  
  158.         // 选择 DMA 通道,通道存在于流中
  159.   DMA_InitStructure.DMA_Channel = RHEOSTAT_ADC_DMA_CHANNEL;
  160.   //初始化DMA流,流相当于一个大的管道,管道里面有很多通道
  161.         DMA_Init(RHEOSTAT_ADC_DMA_STREAM, &DMA_InitStructure);
  162.         // 使能DMA流
  163.   DMA_Cmd(RHEOSTAT_ADC_DMA_STREAM, ENABLE);
  164.        
  165.        
  166.         // 开启ADC时钟
  167.         RCC_APB2PeriphClockCmd(RHEOSTAT_ADC1_CLK , ENABLE);
  168.   RCC_APB2PeriphClockCmd(RHEOSTAT_ADC2_CLK , ENABLE);
  169.        
  170.   // -------------------ADC Common 结构体 参数 初始化------------------------
  171.         // 独立ADC模式
  172.   ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;
  173.   // 时钟为fpclk x分频       
  174.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
  175.   // 禁止DMA直接访问模式       
  176.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
  177.   // 采样时间间隔       
  178.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;  
  179.   ADC_CommonInit(&ADC_CommonInitStructure);
  180.        
  181.   // -------------------ADC Init 结构体 参数 初始化--------------------------
  182.         ADC_StructInit(&ADC_InitStructure);
  183.   // ADC 分辨率
  184.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  185.   // 禁止扫描模式,多通道采集才需要       
  186.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  187.   // 连续转换       
  188.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  189.   //禁止外部边沿触发
  190.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  191.   //外部触发通道,本例子使用软件触发,此值随便赋值即可
  192.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  193.   //数据右对齐       
  194.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  195.   //转换通道 1个
  196.   ADC_InitStructure.ADC_NbrOfConversion = 1;
  197.        
  198.   //---------------------------------------------------------------------------       
  199.   ADC_Init(RHEOSTAT_ADC1, &ADC_InitStructure);       
  200.    // 配置 ADC 通道转换顺序为1,第一个转换,采样时间为3个时钟周期
  201.   ADC_RegularChannelConfig(RHEOSTAT_ADC1, RHEOSTAT_ADC_CHANNEL1, 1, ADC_SampleTime_3Cycles);   
  202.   //---------------------------------------------------------------------------
  203.        
  204.         ADC_Init(RHEOSTAT_ADC2, &ADC_InitStructure);
  205.   // 配置 ADC 通道转换顺序为1,第一个转换,采样时间为3个时钟周期
  206.   ADC_RegularChannelConfig(RHEOSTAT_ADC2, RHEOSTAT_ADC_CHANNEL2, 1, ADC_SampleTime_3Cycles);   
  207.   //---------------------------------------------------------------------------
  208.                

  209.   // 使能DMA请求 after last transfer (multi-ADC mode)
  210.   ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
  211. // 使能ADC DMA
  212.   ADC_DMACmd(RHEOSTAT_ADC1, ENABLE);
  213.        
  214.   // 使能ADC
  215.   ADC_Cmd(RHEOSTAT_ADC1, ENABLE);  
  216.   ADC_Cmd(RHEOSTAT_ADC2, ENABLE);   
  217.   
  218.   //开始adc转换,软件触发
  219.   ADC_SoftwareStartConv(RHEOSTAT_ADC1);
  220.   //ADC_SoftwareStartConv(RHEOSTAT_ADC2);
  221. }



  222. void Rheostat_Init(void)
  223. {
  224.         Rheostat_ADC_GPIO_Config();
  225.         Rheostat_ADC_Mode_Config();
  226. }




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

本版积分规则

快速回复 在线客服 返回列表 返回顶部