当前位置: 首页 > article >正文

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传输
  • 设置公共触发源为定时器溢出。
    在这里插入图片描述

可以看到,公共触发源事件是共享的。设置在公共触发源的事件会广播给所有希望听到公共触发源事件的出发目标。


http://www.kler.cn/a/546143.html

相关文章:

  • 什么是偏光环形光源
  • 掌握 systemd:Linux 服务管理的核心工具
  • 数据结构——Makefile、算法、排序(2025.2.13)
  • LabVIEW太阳能制冷监控系统
  • 【天地图】绘制、删除点线面
  • 【如何掌握CSP-J 信奥赛中的暴力算法】
  • 同.NET 8一起发布的C#12语法中新特性及用法演示
  • Xilinx kintex-7系列 FPGA支持PCIe 3.0 吗?
  • 【数据处理】使用python收集网络数据--爬虫基础
  • 《玩转AI大模型:从入门到创新实践》(10)附录一、AI工具百宝箱
  • 代码aaa
  • Unity入门3 添加碰撞体
  • 保姆级GitHub大文件(100mb-2gb)上传教程
  • ECP在Successfactors中paylisp越南语乱码问题
  • 爬虫实战:利用代理ip爬取推特网站数据
  • Gin框架开发教程及性能优势分析
  • 力扣-二叉树-226 翻转二叉树
  • css:position
  • 【RK3588嵌入式图形编程】-SDL2-鼠标输入处理
  • Python实现从SMS-Activate平台,自动获取手机号和验证码(进阶版2.0)