通常,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 通道上有活动。
评论
查看更多