HC32F460_AOS自动运行系统
目录
- AOS介绍
- 事件源
- 如何使用事件源?
- 补充
- 软件触发源如何使用?
- 公共触发源如何使用?
AOS介绍
- HC32中的AOS,又叫自动运行系统,就是STM32中的事件系统。
- AOS可以实现无CPU接入下,自动完成部分功能。
- 比如定时器溢出之后串口发送数据。
- AOS系统中分为事件源和事件目标。事件源触发时间目标。
事件源
/**
*******************************************************************************
** \brief Event number enumeration
******************************************************************************/
typedef enum en_event_src
{
EVT_SWI_IRQ0 = 0U,
EVT_SWI_IRQ1 = 1U,
......
EVT_SDIOC2_DMAR = 483U,
EVT_SDIOC2_DMAW = 484U,
EVT_MAX = 511U,
}en_event_src_t;
如何使用事件源?
以AOS中的DMA1 传输启动触发源选择寄存器(DMA1_TRGSELx)(x=0~3)为例
如果希望定时溢出的时候触发DMA传输,那么就把b8~b0设置为定时溢出事件
DMA的初始化代码如下,其中就包含事件源设置
#define TEST_DMA_UNIT (M4_DMA1)
#define TEST_DMA_CLOCK_UNIT (PWC_FCG0_PERIPH_DMA1)
#define TEST_DMA_CHANNEL (DmaCh1)
#define TEST_DMA_TRIG_SOURCE (EVT_TMR01_GCMA)
s
tc_dma_config_t stcDmaCfg;
MEM_ZERO_STRUCT(stcDmaCfg);
PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_AOS, Enable);
PWC_Fcg0PeriphClockCmd(TEST_DMA_CLOCK_UNIT, Enable);
stcDmaCfg.u16BlockSize = 1u;
stcDmaCfg.u16TransferCnt = 1;
stcDmaCfg.u32SrcAddr = (uint32_t)(&SImulate_REG_SRC);
stcDmaCfg.u32DesAddr = (uint32_t)(&SImulate_REG_DST);
stcDmaCfg.stcDmaChCfg.enSrcInc = AddressFix;
stcDmaCfg.stcDmaChCfg.enDesInc = AddressFix;
stcDmaCfg.stcDmaChCfg.enTrnWidth = Dma32Bit;
stcDmaCfg.stcDmaChCfg.enIntEn = Disable;
DMA_InitChannel(TEST_DMA_UNIT, TEST_DMA_CHANNEL, &stcDmaCfg);
DMA_SetTriggerSrc(TEST_DMA_UNIT, TEST_DMA_CHANNEL, TEST_DMA_TRIG_SOURCE);//设置触发源
DMA_Cmd(TEST_DMA_UNIT, Enable);
上面代码中设定的事件是EVT_TMR01_GCMA,参考timer01的描述如下
补充
上面的设置可以满足我们日常需求了。AOS还提供了两个特殊的功能:
- 软件触发事件
- 公共事件
从上图中的绿色线来看,右边是触发目标,左边是AOS触发源。
触发目标的可选的触发源有如下类型 - 软件触发源,与专用触发源一起只能选择一条,用于主动触发事件
- 专用触发源,与软件触发源一起只能选择一条,用于外设输出事件
- 公共触发源,两条,可以同时选择,用于广播事件
触发目标最多可以选择三条触发源。上一节我们描述的就是专用触发源。
软件触发源如何使用?
软件触发源用于主动触发事件,测试用会很不错。
使用软件触发源,我们需要将待触发目标的触发源绑定为软件触发源,然后代码中主动触发即可。
软件触发源在库中的描述与专用触发源一起
/**
*******************************************************************************
** \brief Event number enumeration
******************************************************************************/
typedef enum en_event_src
{
EVT_SWI_IRQ0 = 0U,
EVT_SWI_IRQ1 = 1U,
......
/* AOS 就这个*/
EVT_AOS_STRG = 319U,
......
EVT_SDIOC2_DMAR = 483U,
EVT_SDIOC2_DMAW = 484U,
EVT_MAX = 511U,
}en_event_src_t;
触发目标要将触发源设置为软件触发源,然后再代码中主动触发
以DMA为例
#define TEST_DMA_UNIT (M4_DMA1)
#define TEST_DMA_CLOCK_UNIT (PWC_FCG0_PERIPH_DMA1)
#define TEST_DMA_CHANNEL (DmaCh1)
#define TEST_DMA_TRIG_SOURCE (EVT_AOS_STRG)
DMA_SetTriggerSrc(TEST_DMA_UNIT, TEST_DMA_CHANNEL, TEST_DMA_TRIG_SOURCE);
AOS_SW_Trigger(); //软件触发
公共触发源如何使用?
公共触发源用于实现多个 AOS 源触发同一 AOS 目标的功能。
以DMA为例,如果要实现定时器溢出和串口接收事件一起触发DMA传输,要做如下事情:
- 设置DMA事件源为串口接收
- 设置DMA事件源寄存器中公共触发使能为1,1:允许AOS_COMTRG的公共触发事件触发DMA1传输
- 设置公共触发源为定时器溢出。
可以看到,公共触发源事件是共享的。设置在公共触发源的事件会广播给所有希望听到公共触发源事件的出发目标。