單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網單片機
W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。
在封裝規格上,W55MH32 提供了兩種選擇:QFN68和QFN100。
W55MH32Q采用QFN68封裝版本,尺寸為8x8mm,它擁有36個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、3個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN以及1個USB2.0。在保持與同系列其他版本一致的核心性能基礎上,僅減少了部分GPIO以及SDIO接口,其他參數保持一致,性價比優勢顯著,尤其適合網關模組等對空間布局要求較高的場景。緊湊的尺寸和精簡化外設配置,使其能夠在有限空間內實現高效的網絡連接與數據交互,成為物聯網網關、邊緣計算節點等緊湊型設備的理想選擇。 同系列還有QFN100封裝的W55MH32L版本,該版本擁有更豐富的外設資源,適用于需要多接口擴展的復雜工控場景,軟件使用方法一致。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32Q這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。

第十四章 ADC(上篇)
1ADC簡介
12 位 ADC 是一種逐次逼近型模擬數字轉換器。它有多達 18 個通道,可測量 16 個外部和 2 個內部信號源。各通道的 A/D 轉換可以單次、連續、掃描或間斷模式執行。ADC 的結果可以左對齊或右對齊方式存儲在 16 位數據寄存器中。
模擬看門狗特性允許應用程序檢測輸入電壓是否超出用戶定義的高/低閥值。ADC 的輸入時鐘不得超過 14MHz,它是由 PCLK2 經分頻產生。
1.1 ADC主要特征
W55MH32的ADC的主要特征如下:
12 位分辨率
- ?轉換結束、注入轉換結束和發生模擬看門狗事件時產生中斷
- ?單次和連續轉換模式
- ?從通道 0 到通道 n 的自動掃描模式
- ?自校準
- ?帶內嵌數據一致性的數據對齊
- ?采樣間隔可以按通道分別編程
- ?規則轉換和注入轉換均有外部觸發選項
- ?間斷模式
- ?雙重模式(帶 2 個或以上 ADC 的器件)
- ?ADC 轉換時間:時鐘為 56MHz 時為 1μs(時鐘為 72MHz 為 1.17μs)
- ?ADC 供電要求:2.4V 到 3.6V
- ?ADC 輸入范圍:VREF-≤VIN≤VREF+
- ?規則通道轉換期間有 DMA 請求產生。下圖是 ADC 模塊的方框圖。
注意: 如果有 VREF-引腳,必須和 VSSA 相連接
1.2 ADC功能描述
ADC功能框圖如下:

單個 ADC 框圖
1.ADC3 的規則轉換和注入轉換觸發與 ADC1 和 ADC2 的不同。
名稱 | 信號類型 | 注解 |
VREF+ | 輸入,模擬參考正極 | ADC 使用的高端 / 正極參考電壓,2.4V ≤ VREF+ ≤ VDDA |
VDDA(*) | 輸入,模擬電源 | 等效于 VDO 的模擬電源:2.4V ≤ VDDA ≤ VDD (3.6V) |
VREF- | 輸入,模擬參考負極 | ADC 使用的低端 / 負極參考電壓,VREF- ≈ VSSA |
VSSA(*) | 輸入,模擬電源地 | 等效于 VSS 的模擬電源地 |
ADC_IN[15:0] | 模擬輸入 | 16 個 ADC 模擬通道 |
1.VDDA 和 VSSA 應該分別連接到 VDD 和 VSS。
1.3 ADC開關控制
通過設置 ADC_CR2 寄存器的 ADON 位可給 ADC 上電。當第一次設置 ADON 位時,它將 ADC 從斷電狀態下喚醒。ADC 上電延遲一段時間后(tSTAB),再次設置 ADON 位時開始進行轉換。
通過清除 ADON 位可以停止轉換,并將 ADC 置于斷電模式。在這個模式中,ADC 幾乎不耗電(僅幾個μA)。
1.4 ADC時鐘
由時鐘控制器提供的 ADCCLK 時鐘和 PCLK2(APB2 時鐘)同步。RCC 控制器為 ADC 時鐘提供一個專用的可編程預分頻器,詳見第 6 節-復位和時鐘控制(RCC)。
2 模式選擇
2.1 通道選擇
有 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]位中。
如果 ADC_SQRx 或 ADC_JSQR 寄存器在轉換期間被更改,當前的轉換被清除,一個新的啟動脈沖將發送到 ADC 以轉換新選擇的組。
溫度傳感器/VREFINT 內部通道
溫度傳感器和通道 ADC1_IN16 相連接,內部參照電壓 VREFINT 和 ADC1_IN17 相連接。可以按注入或規則通道對這兩個內部通道進行轉換。
注意:溫度傳感器和 VREFINT 只能出現在主 ADC1 中。
2.2 單次轉換模式
單次轉換模式下,ADC 只執行一次轉換。該模式既可通過設置 ADC_CR2 寄存器的 ADON 位(只適用于規則通道)啟動也可通過外部觸發啟動(適用于規則通道或注入通道),這時 CONT 位為 0。一旦選擇通道的轉換完成:
如果一個規則通道被轉換:轉換數據被儲存在 16 位 ADC_DR 寄存器中EOC(轉換結束)標志被設置如果設置了 EOCIE,則產生中斷。
如果一個注入通道被轉換:轉換數據被儲存在 16 位的 ADC_DRJ1 寄存器中JEOC(注入轉換結束)標志被設置如果設置了 JEOCIE 位,則產生中斷。然后 ADC 停止。
2.3 連續轉換模式
在連續轉換模式中,當前面 ADC 轉換一結束馬上就啟動另一次轉換。此模式可通過外部觸發啟動或通過設置 ADC_CR2 寄存器上的 ADON 位啟動,此時 CONT 位是 1。
每個轉換后:如果一個規則通道被轉換:轉換數據被儲存在 16 位的 ADC_DR 寄存器中EOC(轉換結束)標志被設置如果設置了 EOCIE,則產生中斷。
如果設置了 JEOCIE 位,則產生中斷。
2.4 時序圖
如下圖所示,ADC 在開始精確轉換前需要一個穩定時間 tSTAB。在開始 ADC 轉換和 14 個時鐘周期后,EOC 標志被設置,16 位 ADC 數據寄存器包含轉換的結果。

時序圖
2.5 模擬看門狗
如果被 ADC 轉換的模擬電壓低于低閥值或高于高閥值,AWD 模擬看門狗狀態位被設置。閥值位于ADC_HTR 和 ADC_LTR 寄存器的最低 12 個有效位中。通過設置 ADC_CR1 寄存器的 AWDIE 位以允許產生相應中斷。
閥值獨立于由 ADC_CR2 寄存器上的 ALIGN 位選擇的數據對齊模式。通過配置 ADC_CR1 寄存器,模擬看門狗可以作用于 1 個或多個通道。

模擬看門狗警戒區
模擬看門狗通道選擇
模擬看門狗警戒的通道 | ADC_CR1 寄存器控制位 | ||
AWDSGL 位 | AWDEN 位 | JAWDEN 位 | |
無 | 任意值 | 0 | 0 |
所有注入通道 | 0 | 0 | 1 |
所有規則通道 | 0 | 1 | 0 |
所有注入和規則通道 | 0 | 1 | 1 |
單一的 (1) 注入通道 | 1 | 0 | 1 |
單一的 (1) 規則通道 | 1 | 1 | 0 |
單一的 (1) 注入或規則通道 | 1 | 1 | 1 |
2.6 掃描模式
此模式用來掃描一組模擬通道。
掃描模式可通過設置 ADC_CR1 寄存器的 SCAN 位來選擇。一旦這個位被設置,ADC 掃描所有被ADC_SQRX 寄存器(對規則通道)或 ADC_JSQR(對注入通道)選中的所有通道。在每個組的每個通道上執行單次轉換。在每個轉換結束時,同一組的下一個通道被自動轉換。如果設置了 CONT 位,轉換不會在選擇組的最后一個通道上停止,而是再次從選擇組的第一個通道繼續轉換。
如果設置了 DMA 位,在每次 EOC 后,DMA 控制器把規則組通道的轉換數據傳輸到 SRAM 中。而注入通道轉換的數據總是存儲在 ADC_JDRx 寄存器中。
2.7 注入通道管理
觸發注入
清除 ADC_CR1 寄存器的 JAUTO 位,并且設置 SCAN 位,即可使用觸發注入功能。
1. 利用外部觸發或通過設置 ADC_CR2 寄存器的 ADON 位,啟動一組規則通道的轉換。
2. 如果在規則通道轉換期間產生一外部注入觸發,當前轉換被復位,注入通道序列被以單次掃描方式進行轉換。
3. 然后,恢復上次被中斷的規則組通道轉換。如果在注入轉換期間產生一規則事件,注入轉換不會被中斷,但是規則序列將在注入序列結束后被執行。
注: 當使用觸發的注入轉換時,必須保證觸發事件的間隔長于注入序列。例如:序列長度為 28 個ADC 時鐘周期(即 2 個具有 1.5 個時鐘間隔采樣時間的轉換),觸發之間最小的間隔必須是 29 個ADC 時鐘周期。
自動注入
如果設置了 JAUTO 位,在規則組通道之后,注入組通道被自動轉換。這可以用來轉換在ADC_SQRx 和 ADC_JSQR 寄存器中設置的多至 20 個轉換序列。
在此模式里,必須禁止注入通道的外部觸發。
如果除 JAUTO 位外還設置了 CONT 位,規則通道至注入通道的轉換序列被連續執行。對于 ADC 時鐘預分頻系數為 4 至 8 時,當從規則轉換切換到注入序列或從注入轉換切換到規則序列時,會自動插入 1 個 ADC 時鐘間隔;當 ADC 時鐘預分頻系數為 2 時,則有 2 個 ADC 時鐘間隔的延遲。
注意: 不可能同時使用自動注入和間斷模式。

注入轉換延時
2.8 間斷模式
規則組
此模式通過設置 ADC_CR1 寄存器上的 DISCEN 位激活。它可以用來執行一個短序列的 n 次轉換(n<=8),此轉換是 ADC_SQRx 寄存器所選擇的轉換序列的一部分。數值 n 由 ADC_CR1 寄存器的DISCNUM[2:0]位給出。
一個外部觸發信號可以啟動 ADC_SQRx 寄存器中描述的下一輪 n 次轉換,直到此序列所有的轉換完成為止。總的序列長度由 ADC_SQR1 寄存器的 L[3:0]定義。
舉例:
n=3,被轉換的通道=0、1、2、3、6、7、9、10
第一次觸發:轉換的序列為 0、1、2
第二次觸發:轉換的序列為 3、6、7
第三次觸發:轉換的序列為 9、10,并產生 EOC 事件
第四次觸發:轉換的序列 0、1、2
注意: 當以間斷模式轉換一個規則組時,轉換序列結束后不自動從頭開始。當所有子組被轉換完成,下一次觸發啟動第一個子組的轉換。在上面的例子中,第四次觸發重新轉換第一子組的通道 0、1 和 2。
注入組
此模式通過設置 ADC_CR1 寄存器的 JDISCEN 位激活。在一個外部觸發事件后,該模式按通道順序逐個轉換 ADC_JSQR 寄存器中選擇的序列。一個外部觸發信號可以啟動 ADC_JSQR 寄存器選擇的下一個通道序列的轉換,直到序列中所有的轉換完成為止。總的序列長度由 ADC_JSQR 寄存器的 JL[1:0]位定義。
舉例:
n=1,被轉換的通道=1、2、3
第一次觸發:通道 1 被轉換
第二次觸發:通道 2 被轉換
第三次觸發:通道 3 被轉換,并且產生 EOC 和 JEOC 事件
第四次觸發:通道 1 被轉換
注意: 1.當完成所有注入通道轉換,下個觸發啟動第 1 個注入通道的轉換。在上述例子中,第四個觸發重新轉換第 1 個注入通道 1。
2.不能同時使用自動注入和間斷模式。
3.必須避免同時為規則和注入組設置間斷模式。間斷模式只能作用于一組轉換。
3 校準
ADC 有一個內置自校準模式。校準可大幅減小因內部電容器組的變化而造成的準精度誤差。在校準期間,在每個電容器上都會計算出一個誤差修正碼(數字值),這個碼用于消除在隨后的轉換中每個電容器上產生的誤差。
通過設置 ADC_CR2 寄存器的 CAL 位啟動校準。一旦校準結束,CAL 位被硬件復位,可以開始正常轉換。建議在上電時執行一次 ADC 校準。校準階段結束后,校準碼儲存在 ADC_DR 中。
注意:1.建議在每次上電后執行一次校準。
2.啟動校準前,ADC 必須處于關電狀態(ADON='0')超過至少兩個 ADC 時鐘周期。

校準時序圖
3.1 數據對齊
ADC_CR2 寄存器中的 ALIGN 位選擇轉換后數據儲存的對齊方式。數據可以左對齊或右對齊,如


注入組通道轉換的數據值已經減去了在 ADC_JOFRx 寄存器中定義的偏移量,因此結果可以是一個負值。SEXT 位是擴展的符號值。
對于規則組通道,不需減去偏移值,因此只有 12 個位有效。

數據右對齊

數據左對齊
3.2 可編程的通道采樣時間
ADC 使用若干個 ADC_CLK 周期對輸入電壓采樣,采樣周期數目可以通過 ADC_SMPR1 和ADC_SMPR2 寄存器SMP[2:0]位更改。每個通道可以分別用不同的時間采樣。
總轉換時間如下計算:
TCONV=采樣時間+12.5 個周期
例如:
當 ADCCLK=14MHz,采樣時間為 1.5 周期
TCONV=1.5+12.5=14 周期=1μs
3.3 外部觸發轉換
轉換可以由外部事件觸發(例如定時器捕獲,EXTI 線)。如果設置了 EXTTRIG 控制位,則外部事件就能夠觸發轉換。EXTSEL[2:0]和 JEXTSEL2:0]控制位允許應用程序選擇 8 個可能的事件中的某一個,可以觸發規則和注入組的采樣。
注意: 當外部觸發信號被選為 ADC 規則或注入轉換時,只有它的上升沿可以啟動轉換。
表 ADC1 和 ADC2 用于規則通道的外部觸發
觸發源 | 類型 | EXTSSEL[2:0] |
TIM1_CC1 事件 | 來自片上定時器的內部信號 | 000 |
TIM1_CC2 事件 | 001 | |
TIM1_CC3 事件 | 010 | |
TIM2_CC2 事件 | 011 | |
TIM3_TRGO 事件 | 100 | |
TIM4_CC4 事件 | 101 | |
EXTI 線 11/TIM8_TRGO事件(1) | 外部引腳/來自片上定時器的內部信號 | 110 |
SWSTART | 軟件控制位 | 111 |
(1)對于規則通道,選中 EXTI 線路 11 或 TIM8_TRGO 作為外部觸發事件,可以分別通過設置 ADC1和 ADC2 的 ADC1_ETRGREG_REMAP 位和 ADC2_ETRGREG_REMAP 位實現。
表 ADC1 和 ADC2 用于注入通道的外部觸發
觸發源 | 連接類型 | JEXTSE[2:0] |
TIM1_TRGO 事件 | 來自片上定時器的內部信號 | 000 |
TIM1_CC4 事件 | 001 | |
TIM2_TRGO 事件 | 010 | |
TIM2_CC1 事件 | 011 | |
TIM3_CC4 事件 | 100 | |
TIM4_TRGO 事件 | 101 | |
EXTI 線 15/TIM8_CC4 事件(1) | 外部引腳 / 來自片上定時器的內部信號 | 110 |
SWSTART | 軟件控制位 | 111 |
(2)為注入信道選擇外部觸發器 EXTIline15 或 TIM8-CC4 事件是通過分別為 ADC1 和 ADC2 配置ADC1ETRGINJREMAP 和 ADC2 ETRGINJ·REMAP 來完成的。
表 ADC3 用于規則通道的外部觸發
觸發源 | 連接類型 | EXTSSEL[2:0] |
TIM3_CC1 事件 | 來自片上定時器的內部信號 | 000 |
TIM2_CC3 事件 | 001 | |
TIM1_CC3 事件 | 010 | |
TIM8_CC1 事件 | 011 | |
TIM8_TRGO 事件 | 100 | |
TIM5_CC1 事件 | 101 | |
TIM5_CC3 事件 | 110 | |
SWSTART | 軟件控制位 | 111 |
表 ADC3 用于注入通道的外部觸發
觸發源 | 連接類型 | JEXTSE[2:0] |
TIM1_TRGO 事件 | 來自片上定時器的內部信號 | 000 |
TIM1_CC4 事件 | 001 | |
TIM4_CC3 事件 | 010 | |
TIM8_CC2 事件 | 011 | |
TIM8_CC4 事件 | 100 | |
TIM5_TRGO 事件 | 101 | |
TIM5_CC4 事件 | 110 | |
JSWSTART | 軟件控制位 | 111 |
軟件觸發事件可以通過對寄存器 ADC_CR2 的 SWSTART 或 JSWSTART 位置'1'產生。規則組的轉換可以被注入觸發打斷。
3.4 DMA請求
因為規則通道轉換的值儲存在一個僅有的數據寄存器中,所以當轉換多個規則通道時需要使用DMA,這可以避免丟失已經存儲在 ADC_DR 寄存器中的數據。只有在規則通道的轉換結束時才產生 DMA 請求,并將轉換的數據從 ADC_DR 寄存器傳輸到用戶指定的目的地址。
注: 只有 ADC1 和 ADC3 擁有 DMA 功能。由 ADC2 轉化的數據可以通過雙 ADC 模式,利用 ADC1 的DMA 功能傳輸。
4 雙ADC模式
在有 2 個或以上 ADC 模塊的產品中,可以使用雙 ADC 模式。在雙 ADC 模式里,根據 ADC1_CR1 寄存器中 DUALMOD[2:0]位所選的模式,轉換的啟動可以是ADC1 主和 ADC2 從的交替觸發或同步觸發。
注意: 在雙 ADC 模式里,當轉換配置成由外部事件觸發時,用戶必須將其設置成僅觸發主 ADC,從 ADC設置成軟件觸發,這樣可以防止意外的觸發從轉換。但是,主和從 ADC 的外部觸發必須同時被激活。
共有 6 種可能的模式:
- ?同步注入模式
- ?同步規則模式
- ?快速交叉模式
- ?慢速交叉模式
- ?交替觸發模式
- ?獨立模式
還有可以用下列方式組合使用上面的模式:
- ?同步注入模式+同步規則模式
- ?同步規則模式+交替觸發模式
- ?同步注入模式+交叉模式
注意: 在雙 ADC 模式里,為了在主數據寄存器上讀取從轉換數據,必須使能 DMA 位,即使不使用 DMA傳輸規則通道數據。

雙 ADC 框圖
1.外部觸發信號作用于 ADC2,但在本圖中沒有顯示。
2.在某些雙 ADC 模式中,在完整的 ADC1 數據寄存器(ADC1_DR)中包含了 ADC1 和 ADC2 的規則轉換數據。
4.1 同步注入模式
此模式轉換一個注入通道組。外部觸發來自 ADC1 的注入組多路開關(由 ADC1_CR2 寄存器的JEXTSEL[2:0]選擇),它同時給 ADC2 提供同步觸發。
注意: 不要在 2 個 ADC 上轉換相同的通道(兩個 ADC 在同一個通道上的采樣時間不能重疊)。在 ADC1 或 ADC2 的轉換結束時:
轉換的數據存儲在每個 ADC 接口的 ADC_JDRx 寄存器中。
當所有 ADC1/ADC2 注入通道都被轉換時,產生 JEOC 中斷(若任一 ADC 接口開放了中斷)。
注: 在同步模式中,必須轉換具有相同時間長度的序列,或保證觸發的間隔比 2 個序列中較長的序列長,否則當較長序列的轉換還未完成時,具有較短序列的 ADC 轉換可能會被重啟。

在 4 個通道上的同步注入模式
4.2 同步規則模式
此模式在規則通道組上執行。外部觸發來自 ADC1 的規則組多路開關(由 ADC1_CR2 寄存器的EXTSEL[2:0]選擇),它同時給 ADC2 提供同步觸發。
注意: 不要在 2 個 ADC 上轉換相同的通道((兩個 ADC 在同一個通道上的采樣時間不能重疊)。在 ADC1 或 ADC2 的轉換結束時:
產生一個 32 位 DMA 傳輸請求(如果設置了 DMA 位),32 位的 ADC1_DR 寄存器內容傳輸到SRAM 中,它上半個字包含 ADC2 的轉換數據,低半個字包含 ADC1 的轉換數據。
當所有 ADC1/ADC2 規則通道都被轉換完時,產生 EOC 中斷(若任一 ADC 接口開放了中斷)。
注: 在同步規則模式中,必須轉換具有相同時間長度的序列,或保證觸發的間隔比 2 個序列中較長的序列長,否則當較長序列的轉換還未完成時,具有較短序列的 ADC 轉換可能會被重啟。

在 16 個通道上的同步規則模式
4.3 快速交叉模式
此模式只適用于規則通道組(通常為一個通道)。外部觸發來自 ADC1 的規則通道多路開關。外部觸發產生后:
ADC2 立即啟動并且ADC1 在延遲 7 個 ADC 時鐘周期后啟動如果同時設置了 ADC1 和 ADC2 的 CONT 位,所選的兩個 ADC 規則通道將被連續地轉換。ADC1產生一個EOC中斷后(由EOCIE使能),產生一個32位的DMA傳輸請求(如果設置了DMA位),ADC1_DR 寄存器的 32 位數據被傳輸到 SRAM,ADC1_DR 的上半個字包含 ADC2 的轉換數據,低半個字包含 ADC1 的轉換數據。
注意: 最大允許采樣時間<7 個 ADCCLK 周期,避免 ADC1 和 ADC2 轉換相同通道時發生兩個采樣周期的重疊。

在 1 個通道上連續轉換模式下的快速交叉模式
4.4 慢速交叉模式
此模式只適用于規則通道組(只能為一個通道)。外部觸發來自 ADC1 的規則通道多路開關。外部觸發產生后:
ADC2 立即啟動并且 ADC1 在延遲 14 個 ADC 時鐘周期后啟動在延遲第二次 14 個 ADC 周期后 ADC2 再次啟動,如此循環。
注意: 最大允許采樣時間<14 個 ADCCLK 周期,以避免和下個轉換重疊。ADC1產生一個EOC中斷后(由EOCIE使能),產生一個32位的DMA傳輸請求(如果設置了DMA位),ADC1_DR 寄存器的 32 位數據被傳輸到 SRAM,ADC1_DR 的上半個字包含 ADC2 的轉換數據,低半個字包含 ADC1 的轉換數據。在 28 個 ADC 時鐘周期后自動啟動新的 ADC2 轉換。在這個模式下不能設置 CONT 位,因為它將連續轉換所選擇的規則通道。
注意: 應用程序必須確保當使用交叉模式時,不能有注入通道的外部觸發產生。

在 1 個通道上的慢速交叉模式
4.5 交替觸發模式
此模式只適用于注入通道組。外部觸發源來自 ADC1 的注入通道多路開關。
當第一個觸發產生時,ADC1 上的所有注入組通道被轉換。
當第二個觸發到達時,ADC2 上的所有注入組通道被轉換。
如此循環……
如果允許產生 JEOC 中斷,在所有 ADC1 注入組通道轉換后產生一個 JEOC 中斷。如果允許產生JEOC 中斷,在所有 ADC2 注入組通道轉換后產生一個 JEOC 中斷。當所有注入組通道都轉換完后,如果又有另一個外部觸發,交替觸發處理從轉換 ADC1 注入組通道重新開始。

交替觸發:每個 ADC1 的注入通道組
如果 ADC1 和 ADC2 上同時使用了注入間斷模式:
當第一個觸發產生時,ADC1 上的第一個注入通道被轉換。
當第二個觸發到達時,ADC2 上的第一個注入通道被轉換。
如此循環……
如果允許產生 JEOC 中斷,在所有 ADC1 注入組通道轉換后產生一個 JEOC 中斷。如果允許產生JEOC 中斷,在所有 ADC2 注入組通道轉換后產生一個 JEOC 中斷。
當所有注入組通道都轉換完后,如果又有另一個外部觸發,則重新開始交替觸發過程。

交替觸發:在間斷模式下每個 ADC 上的 4 個注入通道
4.6 獨立模式
此模式里,雙 ADC 同步不工作,每個 ADC 接口獨立工作。
5 混合的規則
5.1 混合的規則/注入同步模式
規則組同步轉換可以被中斷,以啟動注入組的同步轉換。
注: 在混合的規則/注入同步模式中,必須轉換具有相同時間長度的序列,或保證觸發的間隔比 2 個序列中較長的序列長,否則當較長序列的轉換還未完成時,具有較短序列的 ADC 轉換可能會被重啟。
5.2 混合的同步規則+交替觸發模式
規則組同步轉換可以被中斷,以啟動注入組交替觸發轉換。圖 顯示了一個規則同步轉換被交替觸發所中斷。注入交替轉換在注入事件到達后立即啟動。如果規則轉換已經在運行,為了在注入轉換后確保同步,所有的 ADC(主和從)的規則轉換被停止,并在注入轉換結束時同步恢復。
注: 在混合的同步規則+交替觸發模式中,必須轉換具有相同時間長度的序列,或保證觸發的間隔比 2個序列中較長的序列長,否則當較長序列的轉換還未完成時,具有較短序列的 ADC 轉換可能會被重啟。

交替+規則同步
如果觸發事件發生在一個中斷了規則轉換的注入轉換期間,這個觸發事件將被忽略。下圖示出了這種情況的操作(第 2 個觸發被忽略)。

觸發事件發生在注入轉換期間
5.3 混合同步注入+交叉模式
一個注入事件可以中斷一個交叉轉換。這種情況下,交叉轉換被中斷,注入轉換被啟動,在注入序列轉換結束時,交叉轉換被恢復。下圖是這種情況的一個例子。
注: 當 ADC 時鐘預分頻系數設置為 4 時,交叉模式恢復后不會均勻地分配采樣時間,采樣間隔是 8 個ADC 時鐘周期與 6 個 ADC 時鐘周期輪替,而不是均勻的 7 個 ADC 時鐘周期。

交叉的單通道轉換被注入序列 CH11 和 CH12 中斷
6 溫度傳感器
溫度傳感器可以用來測量器件周圍的溫度(TA)。
溫度傳感器在內部和 ADC1_IN16 輸入通道相連接,此通道把傳感器輸出的電壓轉換成數字值。溫度傳感器模擬輸入推薦采樣時間是 17.1μs。當沒有被使用時,傳感器可以置于關電模式。
注意: 必須設置 TSVREFE 位激活內部通道:ADC1_IN16(溫度傳感器)和 ADC1_IN17(VREFINT)的轉換。溫度傳感器輸出電壓隨溫度線性變化,由于生產過程的變化,溫度變化曲線的偏移在不同芯片上會有不同(最多相差 45°C)。
內部溫度傳感器更適合于檢測溫度的變化,而不是測量絕對的溫度。如果需要測量精確的溫度,應該使用一個外置的溫度傳感器。

溫度傳感器和 VREFINT 通道框圖
讀溫度
為使用傳感器:
1. 選擇 ADC1_IN16 輸入通道
2. 選擇采樣時間為 17.1μs
3. 設置 ADC 控制寄存器 2(ADC_CR2)的 TSVREFE 位,以喚醒關電模式下的溫度傳感器
4. 通過設置 ADON 位啟動 ADC 轉換(或用外部觸發)
5. 讀 ADC 數據寄存器上的 VSENSE 數據結果
6. 利用下列公式得出溫度
溫度(°C)={(V25-VSENSE)/Avg_Slope}+25
這里:
V25=VSENSE 在 25°C 時的數值
Avg_Slope=溫度與 VSENSE 曲線的平均斜率(單位為 mV/°C 或μV/°C)參考數據手冊的電氣
特性章節中 V25 和 Avg_Slope 的實際值。
注意: 傳感器從關電模式喚醒后到可以輸出正確水平的 VSENSE 前,有一個建立時間。ADC 在上電后也有一個建立時間,因此為了縮短延時,應該同時設置 ADON 和 TSVREFE 位
7 ADC中斷
規則和注入組轉換結束時能產生中斷,當模擬看門狗狀態位被設置時也能產生中斷。它們都有獨立的中斷使能位。
注: ADC1 和 ADC2 的中斷映射在同一個中斷向量上,而 ADC3 的中斷有自己的中斷向量
ADC_SR 寄存器中有 2 個其他標志,但是它們沒有相關聯的中斷:
JSTRT(注入組通道轉換的啟動)
STRT(規則組通道轉換的啟動)
中斷事件 | 事件標志 | 使能控制位 |
規則組轉換結束 | EOC | EOCIE |
注入組轉換結束 | JEOC | JEOCIE |
設置了模擬看門狗狀態位 | AWD | AWDIE |
8 例程設計
8.1 ADC_AnalogWatchdog例程
1.初始化部分
// 延時函數初始化(由delay.h提供)
delay_init();
// UART配置函數
void UART_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 使能USART1和GPIOA時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
// 配置TX引腳(PA9)為復用推挽輸出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置RX引腳(PA10)為浮空輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置串口參數:115200bps, 8位數據, 1位停止位, 無校驗
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
// ADC配置函數
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 使能GPIOA和ADC1時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div8); // ADC時鐘=PCLK2/8(假設PCLK2=72MHz,ADC時鐘=9MHz)
ADC_DeInit(ADC1); // 復位ADC1配置
// 配置ADC為獨立模式,單通道單次轉換
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 非掃描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 單次轉換模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 軟件觸發
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右對齊
ADC_InitStructure.ADC_NbrOfChannel = 1; // 轉換通道數1
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE); // 使能ADC1
// 配置NVIC中斷優先級
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 最高搶占優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 配置ADC通道10(PA0),采樣時間239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);
// 配置模擬看門狗:監測通道10,閾值范圍1024~2048(對應電壓0.825V~1.65V,假設VREF=3.3V)
ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_10);
ADC_AnalogWatchdogThresholdsConfig(ADC1, 2048, 1024);
ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable); // 使能單通道看門狗
ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE); // 使能模擬看門狗中斷
// ADC校準(關鍵步驟,確保轉換精度)
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));
}
- ?延時函數初始化:調用delay_init()函數,為后續的延時操作做準備。
- ?UART 配置:UART_Configuration()函數用于配置 USART1,包含使能時鐘、設置 GPIO 引腳、初始化串口參數(如波特率、數據位、停止位等),并且使能串口。
- ?ADC 配置:ADC_Configuration()函數對 ADC1 進行配置,具體操作有使能時鐘、設置 ADC 時鐘分頻、初始化 ADC 參數(如工作模式、轉換模式等)、配置模擬看門狗(設定監測通道和閾值)、使能模擬看門狗中斷以及進行 ADC 校準。
2.主循環部分
int main(void)
{
RCC_ClocksTypeDef clocks;
delay_init();
UART_Configuration();
ADC_Configuration();
RCC_GetClocksFreq(&clocks);
// 打印系統時鐘信息
printf("n");
printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn",
(float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
(float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);
printf("ADC Analog Watchdog Testn");
printf("LTR: 1024, HTR: 2048n");
// 主循環:周期性觸發ADC轉換
while (1)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 軟件觸發ADC轉換
delay_ms(200); // 等待轉換完成并延時200ms
}
}
在main函數的無限循環里,每隔 200ms 啟動一次 ADC 轉換。這樣做的目的是周期性地對 ADC 通道進行采樣。
3.中斷處理部分
// 模擬看門狗中斷處理函數
void ADC1_2_IRQHandler(void)
{
ADC_ITConfig(ADC1, ADC_IT_AWD, DISABLE); // 臨時禁用中斷,避免重復觸發
if (SET == ADC_GetFlagStatus(ADC1, ADC_FLAG_AWD)) // 檢查模擬看門狗標志
{
ADC_ClearFlag(ADC1, ADC_FLAG_AWD); // 清除中斷標志
ADC_ClearITPendingBit(ADC1, ADC_IT_AWD); // 清除中斷掛起位
// 打印觸發中斷的ADC值(12位精度,范圍0~4095)
printf("ADC Awd is Happened. Code Value = %d rn", ADC1->DR);
}
ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE); // 重新使能中斷
}
ADC1_2_IRQHandler函數作為模擬看門狗中斷的處理函數。當 ADC 值超出預設的閾值范圍時,會觸發該中斷。在中斷處理過程中,先禁用中斷,接著清除中斷標志和掛起位,然后打印出觸發中斷時的 ADC 值,最后重新使能中斷。
9 下載驗證
9.1 ADC_AnalogWatchdog例程
實驗現象分析
系統啟動信息: 系統啟動后,會在串口輸出系統時鐘頻率信息,同時顯示正在進行 ADC 模擬看門狗測試以及預設的下限和上限。
ADC 轉換: 系統會每隔 200ms 啟動一次 ADC 轉換。若輸入到 ADC 通道 10 的電壓值處于 1024 - 2048 的范圍內,不會有額外信息輸出。
模擬看門狗觸發:當輸入到 ADC 通道 10 的電壓值超出 1024 - 2048 的范圍時,會觸發模擬看門狗中斷,在串口輸出觸發中斷時的 ADC 值。
持續運行: 系統會持續運行,不斷進行 ADC 轉換,并在需要時觸發模擬看門狗中斷。

WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
-
傳感器
+關注
關注
2565文章
52880瀏覽量
766496 -
單片機
+關注
關注
6067文章
44969瀏覽量
649738 -
以太網
+關注
關注
41文章
5628瀏覽量
175682 -
adc
+關注
關注
99文章
6681瀏覽量
548976 -
數字轉換器
+關注
關注
0文章
239瀏覽量
28084
發布評論請先 登錄
第十章 W55MH32中斷應用概覽

基于AVR高性能單片機的以太網接口設計
W5100在單片機實現以太網通信中的應用

高性能單片機Mega64和10Mb/s以太網控制芯片,實現以太網接口設計方案

第一章 W55MH32 高性能以太網單片機的學習方法概述

第二章 開發板與芯片介紹 詳解W55MH32芯片及開發板

W55MH32高性能以太網單片機教程 第九章 窗口看門狗(WWDG)

WIZnet W55MH32以太網單片機開發教程 第十一章 通用定時器(上篇)

WIZnet W55MH32以太網單片機開發教程第十一章 通用定時器(下篇)

評論