STM32学习手记(5):数据的保存与毁灭!(一)
扫描模式 该位由软件设置和清除,用于开启或关闭扫描模式。在扫描模式中,由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
- AT240C02中EEPROM保存数据(12-01)
- linux环境变量设置及保存地点(09-12)
- STM32学习手记(5):数据的保存与毁灭!(二)(01-18)
- 基于Windows CE的注册表在线修改及保存(08-27)
- 现场总线控制系统功能块实例化(08-10)
- SOPC系统中如何利用Flash来保存用户程序(04-18)