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