91精品国产麻豆国产自产在线_大香蕉琪琪色免费在线视频_性高朝久久久久久久久久_97久久精品亚洲中文字幕无码_精品久久久久久综合日本_精品久久久噜噜噜久久久_欧美国产日韩精品_亚洲欧洲日产国码av系列天堂_樱桃成人免费在线视频高清无码_91中文字幕午夜看片福利

歡迎光臨!1kic網(wǎng)專注于為電子元器件行業(yè)提供免費(fèi)及更實(shí)惠的芯片ic交易網(wǎng)站。
熱門關(guān)鍵詞: LM358 TL431 ULN2003 OP07 STM32F103C8T6
STM32學(xué)習(xí)手記(5):數(shù)據(jù)的保存與毀滅!
來源: | 作者: | 發(fā)表于:2012-12-20
從51開始,單片機(jī)玩了很長時(shí)間了,有51,PIC,AVR等等,早就想跟潮流玩玩ARM,但一直沒有開始,原因-----不知道玩了ARM可以做什么(對我自己而言)。如果為學(xué)習(xí)而學(xué)習(xí),肯定學(xué)不好。然后cortex-m3出來了,據(jù)說,這東西可以替代單片機(jī),于是馬上開始關(guān)注。也在第一時(shí)間開始學(xué)習(xí),可惜一開始就有點(diǎn)站錯(cuò)了隊(duì),選錯(cuò)了型(仍是對我自己而言)。我希望這種芯片應(yīng)該是滿大街都是,隨便哪里都可以買得到,但我選的第一種顯然做不到。為此,大概浪費(fèi)了一年多時(shí)間吧,現(xiàn)在,回到對我來說是正確的道路上來啦,邊學(xué)邊寫點(diǎn)東西。

   STM32單片機(jī)學(xué)習(xí)手記(5):數(shù)據(jù)的保存與毀滅!


這里寫的是我的學(xué)習(xí)的過程,顯然,很多時(shí)候會是不全面的,不系統(tǒng)的,感悟式的,甚至有時(shí)會是錯(cuò)誤的,有些做法會是不專業(yè)的。那么,為什么我還要寫呢?這是一個(gè)有趣的問題,它甚至涉及到博客為什么要存在的問題。顯然,博客里面的寫的東西,其正確性、權(quán)威性大多沒法和書比,可為什么博客會存在呢?理由很多,我非專家,只說作為一個(gè)學(xué)習(xí)32位單片機(jī)的工程師角度來分享整個(gè)學(xué)習(xí)過程,整理成一個(gè)學(xué)習(xí)手記,也便于以后文檔備份。
本章節(jié)將學(xué)習(xí)

  一、認(rèn)識ADC兼進(jìn)一步看懂STM的庫

  ADC是多少位的?

  12位

  ADC有多少個(gè)?

  1個(gè)、2個(gè)或多至3個(gè),視不同的器件而不同;每個(gè)又有多個(gè)通道。

  關(guān)于通道的名堂:

  10.3.3 通道選擇

  有16個(gè)多路通道??梢园艳D(zhuǎn)換分成兩組:規(guī)則的和注入的。在任意多個(gè)通道上以任意順序進(jìn)行的一系列轉(zhuǎn)換構(gòu)成成組轉(zhuǎn)換。例如,可以如下順序完成轉(zhuǎn)換:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。

  ● 規(guī)則組由多達(dá)16個(gè)轉(zhuǎn)換組成。規(guī)則通道和它們的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇。規(guī)則組中轉(zhuǎn)換的總數(shù)寫入ADC_SQR1寄存器的L[3:0]位中。

  ● 注入組由多達(dá)4個(gè)轉(zhuǎn)換組成。注入通道和它們的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里的轉(zhuǎn)換總數(shù)目必須寫入ADC_JSQR寄存器的L[1:0]位中。

  它們有什么區(qū)別:

  l 不同的組轉(zhuǎn)換后保存數(shù)據(jù)的地方不一樣,產(chǎn)生的中斷標(biāo)志不一樣。

  l 在掃描模式下,規(guī)則組會有能力把各通道數(shù)據(jù)通過DMA傳給SRAM,而注入組的數(shù)據(jù)總是存在在ADC_JDRx中。

  還有其他的一些區(qū)別,這里暫不一一羅列。

  ST為什么這么樣來設(shè)計(jì)AD轉(zhuǎn)換,肯定是有理由的,但是我不知道,因此,我也就難以深入地理解AD轉(zhuǎn)換的各種模式。這也就是說,對于知識的理解,要把它放在其應(yīng)用背景中去學(xué)習(xí)才能學(xué)得好。因此,其他知識積累得越多,學(xué)起來也就越快,這也就是所謂的“功底”問題。某人功底深厚,意味著他見多識廣,遇到的事情多,能夠很快找到處理某件事情的“原型”。當(dāng)然,也有一些人抽象學(xué)習(xí)能力極強(qiáng),就算找不到“原型”,他也能學(xué)得很好?;旧希@類人的科學(xué)素養(yǎng)更高一些,在工程師、工科類學(xué)生中并不多見。

  閑話少說,下面來看怎么樣來使用AD轉(zhuǎn)換器?

  以一段源程序?yàn)槔謩e來解讀,同時(shí)進(jìn)一步理解STM32中有關(guān)符號的含義,相信以后再讀庫源程序,定能更上一層樓。

  為看得清楚一些,以下代碼用一種顏色表示。

  /* ADC1 開始準(zhǔn)備配置*/

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

  /*設(shè)置ADC-》CR1的19:16,確定ADC工作模式,一共有10種工作模式

  #define ADC_Mode_Independent ((uint32_t)0x00000000) 0000:獨(dú)立模式

  #define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) 0001:混合的同步規(guī)則+注入同步模式

  #define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) 0010:混合的同步規(guī)則+交替觸發(fā)模式

  #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:規(guī)則同步模式

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

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

  #define ADC_Mode_AlterTrig ((uint32_t)0x00090000) 1001:交替觸發(fā)模式

  */

  ADC_InitStructure.ADC_ScanConvMode = ENABLE;

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

  FunctionalState ADC_ScanConvMode;

  這個(gè)參數(shù)用來指定轉(zhuǎn)換是掃描(多通道模式)還是單個(gè)轉(zhuǎn)換(單通道模式),該參數(shù)可以被設(shè)置為DISABLE或者ENABLE。

  在數(shù)據(jù)手冊中,SCAN位是這樣描述的:掃描模式

  該位由軟件設(shè)置和清除,用于開啟或關(guān)閉掃描模式。在掃描模式中,由ADC_SQRx或ADC_JSQRx寄存器選中的通道被轉(zhuǎn)換。

  0:關(guān)閉掃描模式

  1:使用掃描模式

  注:如果分別設(shè)置了EOCIE或JEOCIE位,只在最后一個(gè)通道轉(zhuǎn)換完畢才會產(chǎn)生EOC或JEOC中斷。

  這樣,如果一次需要對多個(gè)通道進(jìn)行轉(zhuǎn)換,這位就必須設(shè)置為ENABLE。

  */

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

  /* FunctionalState ADC_ContinuousConvMode;

  這個(gè)參數(shù)用來指定轉(zhuǎn)換是連續(xù)進(jìn)行還是單次進(jìn)行,它可以設(shè)置為ENABLE或者DISABLE。

  這兩個(gè)參數(shù)中出現(xiàn)了FunctionalState數(shù)據(jù)類型,那么它是什么呢,順滕摸瓜,可以看到它的的定義如下:

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

  因此,它相當(dāng)于是一個(gè)位變量,我的理解,DISPABLE=0這個(gè)沒有問題,ENABLE=!DISABLE是否應(yīng)該確切的是1??否則下面的設(shè)置就會有問題。

  用這兩個(gè)符號來對寄存器中的位進(jìn)行設(shè)置的話,還需要提供位置信息,如下面的代碼所示:

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

 ?。ǎ╱int32_t)ADC_InitStruct-》ADC_ContinuousConvMode 《《 1));

  這個(gè)《《1就是位置信息,CONT是CON2寄存器的位1

  這樣,我們看STM32的庫又能多看懂一點(diǎn)了。

  用于設(shè)定CON2的CONT位(位1):是否連續(xù)轉(zhuǎn)換

  該位由軟件設(shè)置和清除。如果設(shè)置了此位,則轉(zhuǎn)換將連續(xù)進(jìn)行直到該位被清除。

  0:單次轉(zhuǎn)換模式 1:連續(xù)轉(zhuǎn)換模式

  */

  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

  /* uint32_t ADC_ExternalTrigConv;

  定義如何來觸發(fā)AD轉(zhuǎn)換,一共有8個(gè)可選項(xiàng),以下給出兩個(gè)來解釋一下:

  #define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000)

  將0x00040000寫成二進(jìn)制,就是:

  0000 0000 0000 0100 0000 0000 0000 0000

  對照下面的說明,不難看出,第19:17位是 010,即定時(shí)器1的CC3事件觸發(fā)。

  #define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000)

  將0x000E0000寫成二進(jìn)制,就是:

  0000 0000 0000 1110 0000 0000 0000 0000

  對照下面的說明,是SWSTART方式,即用軟件標(biāo)志來啟動轉(zhuǎn)換。

分享到:
展會信息
市場分析
政策法規(guī)

1kic網(wǎng)-首個(gè)免費(fèi)IC網(wǎng)-電子元器件ic交易網(wǎng)-芯片集成電路代理商供應(yīng)商查詢