datasheet

STM32学习手记:数据的保存与毁灭

2018-02-09 22:30:56来源: eefocus 关键字:STM32  学习手记  数据  保存与毁灭

      从51开始,单片机玩了很长时间了,有51,PIC,AVR等等,早就想跟潮流玩玩ARM,但一直没有开始,原因-----不知道玩了ARM可以做什么(对我自己而言)。如果为学习而学习,肯定学不好。然后cortex-m3出来了,据说,这东西可以替代单片机,于是马上开始关注。也在第一时间开始学习,可惜一开始就有点站错了队,选错了型(仍是对我自己而言)。我希望这种芯片应该是满大街都是,随便哪里都可以买得到,但我选的第一种显然做不到。为此,大概浪费了一年多时间吧,现在,回到对我来说是正确的道路上来啦,边学边写点东西


    这里写的是我的学习的过程,显然,很多时候会是不全面的,不系统的,感悟式的,甚至有时会是错误的,有些做法会是不专业的。那么,为什么我还要写呢?这是一个有趣的问题,它甚至涉及到博客为什么要存在的问题。显然,博客里面的写的东西,其正确性、权威性大多没法和书比,可为什么博客会存在呢?理由很多,我非专家,只说作为一个学习32位单片机的工程师角度来分享整个学习过程,整理成一个学习手记,也便于以后文档备份。

    本章节将学习

    一、认识ADC兼进一步看懂STM的库

    ADC是多少位的?

    12位

    ADC有多少个?

    1个、2个或多至3个,视不同的器件而不同;每个又有多个通道。

    关于通道的名堂:

    10.3.3 通道选择

    有16个多路通道。可以把转换分成两组:规则的和注入的。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。

    ● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数写入ADC_SQR1寄存器的L[3:0]位中。

    ● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目必须写入ADC_JSQR寄存器的L[1:0]位中。

    它们有什么区别:

    l 不同的组转换后保存数据的地方不一样,产生的中断标志不一样。

    l 在扫描模式下,规则组会有能力把各通道数据通过DMA传给SRAM,而注入组的数据总是存在在ADC_JDRx中。

    还有其他的一些区别,这里暂不一一罗列。

    ST为什么这么样来设计AD转换,肯定是有理由的,但是我不知道,因此,我也就难以深入地理解AD转换的各种模式。这也就是说,对于知识的理解,要把它放在其应用背景中去学习才能学得好。因此,其他知识积累得越多,学起来也就越快,这也就是所谓的“功底”问题。某人功底深厚,意味着他见多识广,遇到的事情多,能够很快找到处理某件事情的“原型”。当然,也有一些人抽象学习能力极强,就算找不到“原型”,他也能学得很好。基本上,这类人的科学素养更高一些,在工程师、工科类学生中并不多见。

    闲话少说,下面来看怎么样来使用AD转换器?

    以一段源程序为例分别来解读,同时进一步理解STM32中有关符号的含义,相信以后再读库源程序,定能更上一层楼。

    为看得清楚一些,以下代码用一种颜色表示。

    /* ADC1 开始准备配置*/

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

    /*设置ADC-》CR1的19:16,确定ADC工作模式,一共有10种工作模式

    #define ADC_Mode_Independent ((uint32_t)0x00000000) 0000:独立模式

    #define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) 0001:混合的同步规则+注入同步模式

    #define ADC_Mode_RegSimult_ALTErTrig ((uint32_t)0x00020000) 0010:混合的同步规则+交替触发模式

    #define ADC_Mode_InjecSimult_FastInterl ((uint32_t)0x00030000) 0011:混合同步注入+快速交替模式

    #define ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000) 0100:混合同步注入+慢速交替模式

    #define ADC_Mode_InjecSimult ((uint32_t)0x00050000) 0101:注入同步模式

    #define ADC_Mode_RegSimult ((uint32_t)0x00060000) 0110:规则同步模式

    #define ADC_Mode_FastInterl ((uint32_t)0x00070000) 0111:快速交替模式

    #define ADC_Mode_SlowInterl ((uint32_t)0x00080000) 1000:慢速交替模式

    #define ADC_Mode_AlterTrig ((uint32_t)0x00090000) 1001:交替触发模式

    */

    ADC_InitStructure.ADC_SCANConvMode = ENABLE;

    /* ADC_ScanConvMode在stm32f10x_adc.h中定义如下:

    FunctionalState ADC_ScanConvMode;

    这个参数用来指定转换是扫描(多通道模式)还是单个转换(单通道模式),该参数可以被设置为DISABLE或者ENABLE。

    在数据手册中,SCAN位是这样描述的:扫描模式

    该位由软件设置和清除,用于开启或关闭扫描模式。在扫描模式中,由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_NbrOf

[1] [2] [3] [4]

关键字:STM32  学习手记  数据  保存与毁灭

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2018020937733.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:在线仿真器在嵌入式系统设计中的应用
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利
推荐阅读
全部
STM32
学习手记
数据
保存与毁灭

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved