微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32学习手记(5):数据的保存与毁灭!(一)

STM32学习手记(5):数据的保存与毁灭!(一)

时间:01-18 来源:互联网 点击:

扫描模式

  该位由软件设置和清除,用于开启或关闭扫描模式。在扫描模式中,由ADC_SQRx或ADC_JSQRx寄存器选中的通道被转换。

  0:关闭扫描模式

  1:使用扫描模式

  注:如果分别设置了EOCIE或JEOCIE位,只在最后一个通道转换完毕才会产生EOC或JEOC中断。

  这样,如果一次需要对多个通道进行转换,这位就必须设置为ENABLE。

  */

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

  /* FunctionalState ADC_ContinuousConvMode;

  这个参数用来指定转换是连续进行还是单次进行,它可以设置为ENABLE或者DISABLE。

  这两个参数中出现了FunctionalState数据类型,那么它是什么呢,顺滕摸瓜,可以看到它的的定义如下:

  typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;

  因此,它相当于是一个位变量,我的理解,DISPABLE=0这个没有问题,ENABLE=!DISABLE是否应该确切的是1??否则下面的设置就会有问题。

  用这两个符号来对寄存器中的位进行设置的话,还需要提供位置信息,如下面的代码所示:

  tmpreg1 |= (uint32_t)(ADC_InitStruct-》ADC_DataAlign | ADC_InitStruct-》ADC_ExternalTrigConv |

  ((uint32_t)ADC_InitStruct-》ADC_ContinuousConvMode 《《 1));

  这个《《1就是位置信息,CONT是CON2寄存器的位1

  这样,我们看STM32的库又能多看懂一点了。

  用于设定CON2的CONT位(位1):是否连续转换

  该位由软件设置和清除。如果设置了此位,则转换将连续进行直到该位被清除。

  0:单次转换模式 1:连续转换模式

  */

  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

  /* uint32_t ADC_ExternalTrigConv;

  定义如何来触发AD转换,一共有8个可选项,以下给出两个来解释一下:

  #define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000)

  将0x00040000写成二进制,就是:

  0000 0000 0000 0100 0000 0000 0000 0000

  对照下面的说明,不难看出,第19:17位是 010,即定时器1的CC3事件触发。

  #define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000)

  将0x000E0000写成二进制,就是:

  0000 0000 0000 1110 0000 0000 0000 0000

  对照下面的说明,是SWSTART方式,即用软件标志来启动转换。

关于EXTSEL[2:0]的说明:

  位19:17 EXTSEL[2:0]:选择启动规则通道组转换的外部事件

  这些位选择用于启动规则通道组转换的外部事件

  ADC1和ADC2的触发配置如下

  000:定时器1的CC1事件 100:定时器3的TRGO事件

  001:定时器1的CC2事件 101:定时器4的CC4事件

  010:定时器1的CC3事件 110:EXTI线11/ TIM8_TRGO,

  仅大容量产品具有TIM8_TRGO功能

  011:定时器2的CC2事件 111:SWSTART

  ADC3的触发配置如下

  000:定时器3的CC1事件 100:定时器8的TRGO事件

  001:定时器2的CC3事件 101:定时器5的CC1事件

  010:定时器1的CC3事件 110:定时器5的CC3事件

  011:定时器8的CC1事件 111:SWSTART

  */

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  /*

  这个是用来设定数据对齐模式的,有两种可能:

  #define ADC_DataAlign_Right ((uint32_t)0x00000000)

  #define ADC_DataAlign_Left ((uint32_t)0x00000800)

  找到数据手册上的相关说明:

  位11:ALIGN:数据对齐

  该位由软件设置和清除。

  0:右对齐 1:左对齐

  */

  ADC_InitStructure.ADC_NbrOfChannel = 1;

  /* ADC_NbrOfChannel的定义如下:

  uint8_t ADC_NbrOfChannel;

  指定有多少个通道会被转换,它的值可以是1~16,这个数据将会影响到寄存器ADC_SQR1,下面是stm32f10x_adc.c中的相关代码:

  。。.。。.

  tmpreg2 |= (uint8_t) (ADC_InitStruct-》ADC_NbrOfChannel - (uint8_t)1);

  tmpreg1 |= (uint32_t)tmpreg2 《《 20;

  ADCx-》SQR1 = tmpreg1;

  看到mpreg1 |= (uint32_t)tmpreg2 《《 20;中的:20,用上面我们刚理解到的原则,这个值的低位将在ADC_SQR1的20位,而它的值是1~16,从代码中可以看到这里又减去1,则其设置值为:0~15,即4bit就够了,那么从20往前数,也就是[23:20],那么SQR1中这几位的用途是什么呢?顺这条线索我们去找SQR1中的23:20位,看它是怎么用的。

  位23:20 L[3:0]:规则通道序列长度

  这些位定义了在规则通道转

  0000:1个转换

  0001:2个转换

  ……

  1111:16个转换

  也就是设置一次进行几个通道的转换,看来我们的理解完全正确。

  */

  ADC_Init(ADC1, ADC_InitStructure);

  //通过前面一系列的设置,可以执行ADC_Init函数了。

  /* ADC1 规则通道15(Channel15)配置(规则通道见文章开头)*/

ADC_RegularChannelConfig(ADC1, ADC_Cha

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top