通常,MCU 花費(fèi)大量時(shí)間在外設(shè)之間傳遞信息。不一定是這樣。
外圍反射系統(tǒng) (PRS) 是一個(gè)網(wǎng)絡(luò),它允許不同的外圍模塊直接相互通信,而不涉及 CPU。發(fā)出反射信號的外圍模塊稱為生產(chǎn)者。PRS 將這些反射信號路由到消費(fèi)外圍設(shè)備,這些外圍設(shè)備根據(jù)接收到的反射信號應(yīng)用操作。沒有給出反射信號的格式,但 PRS 可以應(yīng)用邊沿觸發(fā)和其他功能。
概述
圖 1 概述了一個(gè)通道以及如何使用 PRS 連接四個(gè)不同的外圍設(shè)備。PRS 包含八個(gè)互連通道,每個(gè)通道都可以在生產(chǎn)商提供的所有輸出反射信號之間進(jìn)行選擇。然后,消費(fèi)者可以選擇要收聽的 PRS 通道,并根據(jù)通過該通道路由的 Reflex 信號執(zhí)行操作。Reflex 信號既可以是脈沖信號,也可以是電平信號。同步 PRS 脈沖是一個(gè) HFPERCLK 周期長,可以由生產(chǎn)者發(fā)出(例如 ADC 轉(zhuǎn)換完成)??,也可以由 PRS 通道中的邊沿檢測器生成。電平信號可以是任意波形,但會與 HFPERCLK 同步。
圖 1 顯示了連接到兩個(gè) PRS 通道的四個(gè)外設(shè)。一個(gè)通道上有 TIMER0 和 ADC0,ACMP 和 TIMER1 連接到第二個(gè)通道。TIMER0 溢出可啟動 ADC 單次轉(zhuǎn)換,ACMP 輸出可用作 TIMER1 上比較/捕捉通道的輸入。
圖 1:PRS 概覽。
一般操作
通道功能
可以對 PRS 內(nèi)的反射信號應(yīng)用不同的功能。每個(gè)通道都包括一個(gè)邊沿檢測器,可以從電平信號中生成脈沖信號。也可以通過軟件寫入 PRS_SWPULSE 和 PRS_SWLEVEL 寄存器來生成輸出反射信號。PRS_SWLEVEL 是每個(gè)通道的可編程電平,并保存其編程到的值。如果 PRS_SWPULSE 寫入 1,它將發(fā)出一個(gè)周期的高脈沖,否則斷言 0。然后,SWLEVEL 和 SWPULSE 信號與來自生產(chǎn)者的選定輸入進(jìn)行異或運(yùn)算,以形成發(fā)送到收聽頻道的消費(fèi)者的輸出信號。如圖 1 所示。
efm32lib 函數(shù)void PRS_SourceSignalSet(unsigned int ch, uint32_t source, uint32_t signal, PRS_Edge_TypeDef edge)可用于輕松配置 PRS 通道。通過指定從外設(shè)產(chǎn)生外設(shè)信號的 PRS 通道和產(chǎn)生脈沖的邊沿,該函數(shù)相應(yīng)地配置 PRS。
生產(chǎn)者
每個(gè) PRS 通道可以在來自多個(gè)生產(chǎn)者的信號之間進(jìn)行選擇,這在 PRS_CHx_CTRL 的 SOURCESEL 中進(jìn)行配置。這些生產(chǎn)者中的每一個(gè)都輸出一個(gè)或多個(gè)信號,可以通過設(shè)置 PRS_CHx_CTRL 中的 SIGSEL 字段來選擇這些信號。將 SOURCESEL 位設(shè)置為 0(關(guān)閉)會導(dǎo)致輸入多路復(fù)用器輸出恒定的 0。表 1 中給出了可用生產(chǎn)者的概述。
表 1:反射生產(chǎn)者。
消費(fèi)者
消費(fèi)者外圍設(shè)備(表 2)可以設(shè)置為偵聽 PRS 通道并根據(jù)該通道上接收到的信號執(zhí)行操作。大多數(shù)消費(fèi)者期望脈沖輸入,而有些消費(fèi)者也可以處理電平輸入。
表 2:反射消費(fèi)者。
軟件示例
本節(jié)介紹了四個(gè)軟件示例,用于探索使用 PRS 的外設(shè)之間可能的交互:
TIMER 觸發(fā) ADC 轉(zhuǎn)換
使用 ACMP 和 TIMER 進(jìn)行脈沖寬度測量
GPIO觸發(fā)UART傳輸
軟件觸發(fā)的 DAC 轉(zhuǎn)換
TIMER 觸發(fā)的 ADC 轉(zhuǎn)換
圖 2 顯示了如何設(shè)置 ADC0 以在每次 TIMER0 溢出時(shí)啟動單次轉(zhuǎn)換。TIMER0 在每次溢出時(shí)通過 PRS 將 TIMER0 發(fā)送的一個(gè) HFPERCLK 周期的高脈沖發(fā)送到 ADC0,ADC 進(jìn)行一次轉(zhuǎn)換,顯示在 STK/DK 開發(fā)板的 LCD 上。ADC 消耗脈沖信號,這些信號與 TIMER 產(chǎn)生的信號相同。在這種情況下,不需要邊緣檢測,因此 PRS 使輸入信號保持不變。
圖 2:TIMER0 溢出使用 PRS 啟動 ADC0 單次轉(zhuǎn)換。
ADC 配置為 8 位分辨率和 Vdd 作為參考和輸入。當(dāng) ADC 完成轉(zhuǎn)換時(shí),它會產(chǎn)生一個(gè)轉(zhuǎn)換完成中斷。然后 CPU 將獲取結(jié)果并將其顯示在 LCD 上。顯示的結(jié)果是從始終為 255 的 ADC0_SINGLEDATA 寄存器直接讀取的結(jié)果,假設(shè)輸入與參考相同。DMA 也可用于獲取轉(zhuǎn)換結(jié)果,并且由 AN0021 模數(shù)轉(zhuǎn)換器覆蓋。
該軟件項(xiàng)目prs_timer_adc實(shí)現(xiàn)了這個(gè)示例,可以在 STK 和 DK 開發(fā)板上使用。
使用 ACMP 和 TIMER 進(jìn)行脈沖寬度測量
圖 3 說明了如何測量任意波形的脈沖寬度或周期。ACMP 用于通過 PRS 發(fā)送電平信號。TIMER0 同時(shí)消耗脈沖和電平信號,因此 PRS 使輸入信號保持不變。在 TIMER0 上,PRS 信號用作 CC0 通道的輸入。TIMER0 在上升沿開始計(jì)數(shù),在下降沿捕獲計(jì)數(shù)器值。
圖 3 還顯示了 ACMP 通過 PRS 發(fā)送到 TIMER 的電平輸出,TIMER 使用捕捉功能測量脈沖寬度。
軟件項(xiàng)目prs_pulse_width實(shí)現(xiàn)了這個(gè)例子,可以在 STK 和 DK 上使用。要觸發(fā)脈沖寬度測量,引腳 PC4(DK 原型板上的 P4.7)必須連接到 VMCU 以產(chǎn)生將觸發(fā) ACMP 并啟動 TIMER 的高電平。當(dāng)連接被釋放時(shí),ACMP 的輸出將再次變?yōu)榈碗娖剑⑶?TIMER 捕獲計(jì)數(shù)器值并將其顯示在 LCD 上。
圖 3:ACMP 電平輸出用作 TIMER0 CC0 通道輸入的 PRS 信號。
GPIO 觸發(fā)的 USART 發(fā)送
圖 4 說明了如何使用通過 GPIO 傳入的外部信號來啟用 USART 發(fā)送器。它顯示了來自生產(chǎn)者端的 GPIO 引腳通過 PRS 邊沿檢測器發(fā)送的正邊沿,以在消費(fèi)者端創(chuàng)建一個(gè) HFPERCLK 周期脈沖。GPIO 產(chǎn)生不被 UART 消耗的電平信號,因此必須使用邊沿檢測器在 GPIO 正邊沿轉(zhuǎn)換時(shí)生成脈沖信號。時(shí)鐘脈沖使能 USART TX 并傳輸放置在 TX 緩沖區(qū)中的數(shù)據(jù)。要使 GPIO 生成 PRS 信號,必須在 GPIO_INSENSE 寄存器中啟用 PRS Sense。
軟件項(xiàng)目prs_gpio_uart實(shí)現(xiàn)了這個(gè)例子,并且只適用于 DK。要啟用 USART TX,引腳 PD0 必須連接到 VMCU 以產(chǎn)生上升沿。然后,EFM32 將通過 SERIAL A 以 57600 波特率、無奇偶校驗(yàn)和一位停止位發(fā)送字符“X”。
圖 4:使用 PRS 由 GPIO 信號啟用的 USART TX。
軟件生成的 PRS 脈沖觸發(fā) DAC 轉(zhuǎn)換
圖 5 顯示了如何通過軟件生成 PRS 脈沖。PRS 脈沖將觸發(fā) DAC 轉(zhuǎn)換,在引腳 PB11 上輸出 0.5 V 信號??梢酝ㄟ^軟件生成脈沖和電平信號。在這種情況下,會生成一個(gè)脈沖信號,因?yàn)樗?DAC 消耗的信號類型。DAC 轉(zhuǎn)換也可以由 DAC 本身中的軟件啟動。此示例僅顯示如何也可以通過 PRS 完成此操作。
圖 5:軟件觸發(fā)的 PRS 信號。
圖 5 顯示了由軟件觸發(fā)的一個(gè) HFPERCLK 周期脈沖。脈沖和電平信號可由軟件分別直接寫入 PRS_SWPULSE 和 PRS_SWLEVEL 寄存器來生成。它們也可以使用 efm32lib 中的函數(shù)生成:
void PRS_PulseTrigger(uint32_t channels)產(chǎn)生脈沖信號
void PRS_LevelSet(uint32_t level, uint32_t mask)產(chǎn)生電平信號
該軟件項(xiàng)目prs_soft_dac實(shí)現(xiàn)了這個(gè)示例,并且可以在 STK 和 DK 上使用。
監(jiān)測 PRS 信號
可以使用消耗 PRS 信號的外設(shè)監(jiān)測 PRS 通道。一個(gè)示例是使用 TIMER 在連接到的 PRS 通道上有活動時(shí)進(jìn)行捕獲。該軟件項(xiàng)目main_prs_channel_scan舉例說明了如何實(shí)現(xiàn)這一點(diǎn),并且可以在 STK 和 DK 上使用。
該function PRS_ScanChannel(TIMER_TypeDef *timer, TIMER_PRSSEL_TypeDef prsCh, TIMER_Edge_TypeDef edgeType) in the main_prs_channel_scan項(xiàng)目可用于監(jiān)控特定 PRS 頻道上的活動。它在選定的 TIMER 上設(shè)置 CC0 通道以捕獲選定的信號邊沿。該項(xiàng)目可以在STK和DK上使用,參數(shù)如下:
timer:指向 TIMER 外設(shè)寄存器 c\block 的指針
prsCh:要監(jiān)控的 PRS 頻道
edgeType:要監(jiān)視/捕獲的信號邊沿
此函數(shù)將掛起等待 PRS 通道中的活動的 while 循環(huán)。當(dāng)此類活動發(fā)生時(shí),它會在 LCD 上寫入 PRS 和頻道號。要在這條線上產(chǎn)生活動,用戶必須將 PC4 連接到 VMCU 以使用 ACMP 在 PRS 通道上產(chǎn)生上升沿轉(zhuǎn)換。
另一種選擇是使用捕獲中斷而不是輪詢。這樣程序就不會掛起,處理器將可用于執(zhí)行其他任務(wù)。當(dāng)觸發(fā)捕獲時(shí),用戶知道所選 PRS 通道上有活動。
評論
查看更多