STM32上的事件标志是如何工作的?

目标:
本文的目的是通过一个如何实现和使用事件标志资源的工作示例进行简要解释。尽管本示例使用的是STM32G474 Discovery套件,但您可以将此知识库应用于任何其他ST板或微控制器。

简介:
事件标志是信号量和互斥的非常有用的扩展,并为线程同步提供了一个强大的工具。创建时使用tx_event_flags_create()调用时,组中的32个事件标志被初始化为零,其中每个事件标志由一个比特表示,因此该事件具有32个比特。线程可以要求通过OR或AND来监视特定的位,并且它们可以同时对一组中的所有32个事件标志进行操作。如果设置了这些位,就会通知线程,并且这可以用于同步多个线程。
下图显示了OR和and的可能和最典型组合的快速流程图。

事件标志创建
事件标志由函数创建tx_eventflags_create(发送事件标志_创建)
 
/*全局变量*/TX_EVENT_FLAGS_GROUP事件_ptr;/*在主*/tx_event_flags_create(&event_ptr,“外部中断”)中;
第一个参数是事件标志句柄事件_ptr。第二个参数是事件名称,在这种情况下:外部中断
事件标志集
事件标志由函数设置tx_event_flags_set。第一个参数是事件标志句柄。第二个参数是要设置的标志。第三个参数是标志的设置方式,可以是“或”或“与”。在下面的例子中,标志位1(10b)将与事件标志内容进行“或”运算(AND模式主要用于清除已设置的事件标志)。
VOID my_thread_entry2(ULONG initial_put){while(1){tx_thread_sleep(50);tx_event_flags_set(&event_ptr,0x2,tx_OR);}}

事件标志获取
对于检查是否设置了标志的线程,我们可以使用一个函数tx_event_flags_get
tx_event_flags_get(&event_ptr,0x3,tx_AND_CLEAR,&events,tx_WAIT_FOREVER);

第一个参数是事件标志句柄事件_ptr。第二个参数是所需的标志位置0x3(11b)。第三个论点是如何获取标志:TX_AND、TX_OR、TX_OR_CLEAR、TX_AND_CLEAR。第四个参数是用于获取标志结果的指针。第五十个也是最后一个论点是等待时间,范围从:TX_NO_等待(0x00) TX_等待_反转(0xFFFFFFFF)。事件标志与OR一起获取:

事件标志与AND一起获得:

事件标志采用OR CLEAR:

事件标志与AND CLEAR一起获得:

示例代码:
为了展示EF(事件标志)资源的实现,本文使用了STM32G474 Discovery工具包上提供的RGB LED和Joycle按钮。因此,创建了一个事件标志组,其中每个位都与一个操纵杆按钮相关联。标志由EXTI(外部中断)回调功能设置,该功能检查按下了哪个按钮。为了管理彩色Led,PWM模式下的三个定时器通道与每个信号Led引脚相关联。
根据设置的标志,两个线程管理PWM定时器,更改定时器捕获比较寄存器,并实现以下功能:
  • 选择按钮:设置事件标志0(1b),将LED更改为彩虹模式。
  • 向上按钮:设置事件标志1(10b),将LED颜色更改为红色。
  • 右侧按钮:设置事件标志2(100b)将LED颜色更改为绿色。
  • 向下按钮:设置事件标志3(1000b),将LED颜色更改为蓝色。
  • LEFT按钮:设置Event Flag 4(10000b)以关闭LED。
OneColorThread调用的第一个线程正在等待来自Up、Right、Down或Left按钮的事件标志。当设置了标志时,线程将运行清除标志并更新计时器捕获比较值,这会影响PWM占空比更改Led颜色。
RainbowThread调用的第二个线程将在设置SELECT按钮标志时运行,与其他线程不同,这在运行时不会清除标志。EXTI回调功能永远不会清除与选择按钮对应的标志以更新到下一阶段。
第二个线程应该连续运行,因为PWM占空比需要连续更新以更改LED颜色,这对于演示使用事件标志资源的替代管理方式也很有用。为了简化代码,创建了一个查找表来生成30%时间为0%的三角形波形。因此,根据生成以下波形和颜色,在每个通道中应用120°相位。

在第2部分中,我们将逐步介绍使用STM32CubeIDE在STM32项目上实现引入的概念。
再见!