【鸿蒙开发】Hi3861学习笔记- 定时器中断

news2025/3/18 11:04:20

00. 目录

文章目录

    • 00. 目录
    • 01. 概述
    • 02. 定时器相关API
      • 2.1 hi_timer_create
      • 2.2 hi_timer_start
      • 2.3 hi_timer_stop
      • 2.4 hi_timer_delete
    • 03. 硬件设计
    • 04. 软件设计
    • 05. 实验现象
    • 06. 附录

01. 概述

定时器,顾名思义就是用来计时的,我们常常会设定计时或闹钟,然后时间到了就告诉我们要做什么。Hi3861 也是这样,通过定时器可

以完成各种预设好的任务。定时器到达指定时间后也会产生中断,然后在回调函数内执行所需功能,这个和外部中断类似。

02. 定时器相关API

2.1 hi_timer_create

/**
* @ingroup  iot_systimer
* @brief  Creates the system timer.CNcomment:获取定时器句柄。CNend
*
* @par 描述:
*           Creates the system timer.CNcomment:获取高精定时器句柄。CNend
*
* @attention None
* @param  timer_handle [OUT] type #hi_u32*,handle.CNcomment:获取到的句柄。CNend
*
* @retval #0           Success.
* @retval #Other       Failure. For details, see hi_errno.h.
*
* @par 依赖:
*          @li hi_timer.h:Describes the timer APIs.CNcomment:文件用于描述定时器相关接口。CNend
* @see  hi_timer_delete。
*/
hi_u32 hi_timer_create(hi_u32 *timer_handle);
功能:
	创建系统定时器
参数:
	timer_handle:获取创建好的定时器句柄
返回值:
	0 成功,1 失败;

2.2 hi_timer_start

/**
* @ingroup  iot_systimer
* @brief  Starts the system timer.CNcomment:启动系统定时器。CNend
*
* @par 描述:
*            This API is used in the following scenarios:CNcomment:本API接口使用分为以下几个场景:CNend
*            @li If no timer is created, create and start a timer.
CNcomment:如果未启动定时器,则直接启动。CNend
*            @li If the timer expires and is called again, start the timer directly.
CNcomment:如果该定时器到期后调用,则直接启动定时器。CNend
*            @li If the timer does not expire, stop and restart the timer.
CNcomment:如果定时器没有到期,则停止该定时器,重新启动定时器。CNend
*
* @attention This timer callback function is executed in the interrupt context. Therefore, the callback function should
*            be as simple as possible and the functions such as sleep and wait semaphores that trigger scheduling
*            cannot be used.CNcomment:本定时器回调函数执行于中断上下文,回调函数尽量简单,不能使用睡眠、
等待信号量等引起调度的函数。CNend
*
* @param  timer_handle  [IN]  type #hi_u32,handle.CNcomment:句柄。CNend
* @param  type          [IN]   type #hi_timer_type,timer type.CNcomment:定时器类型。CNend
* @param  expire        [IN]   type #hi_u32,timeout period of the timer (unit: ms). If this parameter is set to 0,
*                       the default value is 10 ms.CNcomment:定时器超时时间(单位:ms)。配置为0时,默认为10ms。CNend
* @param  timer_func    [IN]   type #timer_proc_func,timer callback function.CNcomment:定时器回调函数。CNend
* @param  data          [IN]   type #hi_u32,callback input parameter.CNcomment:回调函数传参。CNend
*
* @retval #0           Success.
* @retval #Other       Failure. For details, see hi_errno.h.
*
* @par 依赖:
*          @li hi_timer.h:Describes the timer APIs.CNcomment:文件用于描述定时器相关接口。CNend
* @see hi_timer_stop
*/
hi_u32 hi_timer_start(hi_u32 timer_handle, hi_timer_type type, hi_u32 expire,
                      hi_timer_callback_f timer_func, hi_u32 data);
功能:
	启动系统定时器
参数:
	timer_handle:定时器句柄
	Type:用于设置所创建的定时器类型
	expire:定时时间,单位 ms。如果参数设置值为 0,则默认为 10ms。
	timer_func:定时器定时时间到达,回调函数。
	data:回调函数参数。不传递参数则为 NULL。
返回值:
	0 成功,1 失败;        

2.3 hi_timer_stop

/**
* @ingroup  iot_systimer
* @brief  Stops the system timer.CNcomment:停止系统定时器。CNend
*
* @par 描述:
*          Stops the system timer.CNcomment:停止系统定时器。CNend
*
* @attention This API only stops the timer and does not delete the timer.CNcomment:本接口仅停止定时器,
并不删除该定时器。CNend
* @param  timer_handle [IN] type #hi_u32,handle.CNcomment:句柄。CNend
*
* @retval #0           Success.
* @retval #Other       Failure. For details, see hi_errno.h.
*
* @par 依赖:
*          @li hi_timer.h:Describes the timer APIs.CNcomment:文件用于描述定时器相关接口。CNend
* @see hi_timer_start | hi_timer_delete
*/
hi_u32 hi_timer_stop(hi_u32 timer_handle)
功能:
	停止系统定时器
参数:
	timer_handle:定时器句柄
返回值:
	0 成功 1 失败     

2.4 hi_timer_delete

/**
* @ingroup  iot_systimer
* @brief  Deletes the timer.CNcomment:删除定时器。CNend
*
* @par 描述:
*           Deletes the timer.CNcomment:删除定时器。CNend
*
* @attention
*            @li If the timer does not expire, stop the timer before deleting it.
CNcomment:如果定时器未到期,则先停止该定时器再删除。CNend
*
* @param  timer_handle [IN] type #hi_u32,handle.CNcomment:句柄。CNend
*
* @retval #0           Success.
* @retval #Other       Failure. For details, see hi_errno.h.
*
* @par 依赖:
*          @li hi_timer.h:Describes the timer APIs.CNcomment:文件用于描述定时器相关接口。CNend
* @see hi_timer_start | hi_timer_stop
*/
hi_u32 hi_timer_delete(hi_u32 timer_handle)
功能:
	删除系统定时器。如果定时器未到期,则先停止该定时器再删除
参数:
	timer_handle:定时器句柄
返回值:
	0 成功,1 失败

03. 硬件设计

在这里插入图片描述

从网络标号可知,LED 与芯片的 IO2 管脚连接,当该引脚输出高电平时,LED点亮,输出低电平时,LED 熄灭。

04. 软件设计

bsp_time.h

#ifndef BSP_TIME_H
#define BSP_TIME_H

#include "cmsis_os2.h"
#include "hi_io.h"
#include "hi_gpio.h"



//函数声明
void time_init(uint16_t times);
void time_onoff(uint8_t sta);

#endif

bsp_time.c

#include "bsp_time.h"
#include <unistd.h>
#include "bsp_led.h"
#include "hi_timer.h"


hi_u32 timer_handle;
uint16_t g_times=0;

//定时器回调函数
void time_isr_fun(void)
{
    static uint8_t i=0;
    i=!i; 
    LED(i);
}

//定时器初始化
//times:定时时间,ms
void time_init(uint16_t times)
{
    hi_u32 ret;
    g_times=times; 
    ret = hi_timer_create(&timer_handle);
    if(ret!=HI_ERR_SUCCESS)
    {
        printf("Timer_Create failed\r\n");
    }
    hi_timer_start(timer_handle,HI_TIMER_TYPE_PERIOD,times,(hi_timer_callback_f)time_isr_fun,NULL);
}

//定时器开关
void time_onoff(uint8_t sta)
{
    if(sta==0)hi_timer_stop(timer_handle);
    else hi_timer_start(timer_handle,HI_TIMER_TYPE_PERIOD,g_times,(hi_timer_callback_f)time_isr_fun,NULL);
}


template.c

/**
 ****************************************************************************************************
 * @file        template.c
 ****************************************************************************************************
 * 实验现象:间隔1S,LED指示灯亮灭
 *
 ****************************************************************************************************
 */

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"

#include "bsp_time.h"
#include "bsp_led.h"



//控制任务
osThreadId_t TIME_Task_ID; //任务ID

void TIME_Task(void)
{
    led_init();//LED初始化
    time_init(500);//定时器初始化,定时时间500ms
    
    while (1) 
    {
        usleep(10*1000);
    }
}
//任务创建
void time_task_create(void)
{
    osThreadAttr_t taskOptions;
    taskOptions.name = "timeTask";       // 任务的名字
    taskOptions.attr_bits = 0;               // 属性位
    taskOptions.cb_mem = NULL;               // 堆空间地址
    taskOptions.cb_size = 0;                 // 堆空间大小
    taskOptions.stack_mem = NULL;            // 栈空间地址
    taskOptions.stack_size = 1024;           // 栈空间大小 单位:字节
    taskOptions.priority = osPriorityNormal; // 任务的优先级

    TIME_Task_ID = osThreadNew((osThreadFunc_t)TIME_Task, NULL, &taskOptions); // 创建任务
    if (TIME_Task_ID != NULL)
    {
        printf("ID = %d, Task Create OK!\n", TIME_Task_ID);
    }
}

/**
 * @description: 初始化并创建任务
 * @param {*}
 * @return {*}
 */
static void template_demo(void)
{
    printf("-Hi3861开发板--定时器中断实验\r\n");
    time_task_create();//任务创建
}
SYS_RUN(template_demo);

05. 实验现象

实验现象: LED 周期性每秒闪烁 1 次。

06. 附录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Power Apps 技术分享:画布应用使用表单控件

前言 表单控件&#xff0c;是画布应用里一个非常好用的控件&#xff0c;我们今天简单介绍下&#xff0c;如何使用这个控件。 正文 1.首先&#xff0c;我们需要有一个数据源&#xff0c;我们这里用上一篇博客新建的数据源&#xff0c;如下图&#xff1a; 2.新建一个页面&#xf…

【数据库】Data Model(数据模型)数据模型分析

理解图片中的 Data Model&#xff08;数据模型&#xff09;是学习数据库设计和应用程序开发的重要一步。作为初学者&#xff0c;你可以通过比喻和简单的解释来理解这些概念以及它们之间的联系。以下是对图片中数据模型的详细分析&#xff0c;以及如何理解它们之间的关系。 1. 数…

【Unity】 HTFramework框架(六十二)Agent编辑器通用智能体(AI Agent)

更新日期&#xff1a;2025年3月14日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 编辑器通用智能体AIAgent类Friday&#xff08;星期五&#xff09;启用智能体设置智能体类型开放智能体权限智能体交互资源优化批处理运行代码联网搜索休闲…

学习笔记:黑马程序员JavaWeb开发教程(2025.3.17)

11.5 案例-文件上传-阿里云OSS-入门 出现报错&#xff1a;Process exited with an error: 1 (Exit value: 1)&#xff0c;点击exec那一行&#xff0c;出现错误原因&#xff1a;Command execution failed. 在CSDN上找到了解决方法&#xff1a; 之后出现新的报错&…

仿最美博客POETIZE(简易版)

写在前面 本文章参考于两个开源项目分别为&#xff1a;POETIZE-最美博客&#xff0c;拾壹博客 如有侵权&#xff0c;请联系删除 正题 此页面为拾壹博客修改而成&#xff0c;采用了POETIZE的布局以及背景图片&#xff0c;技术栈:SpringbootVue&#xff0c;主要涉及页面为网站…

STM32——独立看门狗(IWDG)

IWDG 简介 独立看门狗本质上是一个 定时器 &#xff0c;这个定时器有一个输出端&#xff0c;可以输出复位信号。该定时器是一个 12 位的递减计数器 &#xff0c;当计数器的值减到 0 的时候&#xff0c;就会产生一个复位信号。如果 在计 数没减到 0 之前&#xff0c;重置计…

C++11智能指针简述

一、实现原理 在智能指针对象中有一个裸指针&#xff0c;此指针存储的是动态创建对象的地址&#xff0c;用于生存期控制&#xff0c;能够确保智能指针对象离开所在作用域时&#xff0c;自动正确地销毁动态创建的对象&#xff0c;防止内存泄漏。 使用裸指针存在的问题&#xff…

Linux操作系统实验报告单(3)文本编辑器vi/vim

一、实验目的 掌握vi/vim编辑器的进入和退出方式了解vi/vim的三种模式熟练vi/vim的操作命令 二、实验内容 1.在家目录下新建一个名为“vitest_name”&#xff08;“name”为学生姓名拼音&#xff09;的目录。 ●创建用户目录命令&#xff1a;sudo mkdir /home/vitest_lw3613 …

Centos固定IP配置

虚拟机安装 安装vmware 网盘链接 安装centos7.5 网盘链接 安装教程自行查找 固定IP配置 对安装好的VMware进行网络配置&#xff0c;方便虚拟机连接网络&#xff0c;本次设置建议选择NAT模式&#xff0c;需要宿主机的Windows和虚拟机的Linux能够进行网络连接&#xff0c;…

二叉树算法题实战:从遍历到子树判断

目录 一、引言 二、判断两棵二叉树是否相同 思路 代码实现 注意点 三、二叉树的中序遍历 思路 代码实现 注意点 四、判断一棵树是否为另一棵树的子树 思路 代码实现 注意点 ​编辑 五、补充 一、引言 作者主页&#xff1a;共享家9527-CSDN博客 作者代码仓库&am…

学习threejs,使用MeshFaceMaterial面材质容器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshFaceMaterial 二…

Git 实战指南:本地客户端连接 Gitee 全流程

本文将以 Gitee(码云)、系统Windows 11 为例,详细介绍从本地仓库初始化到远程协作的全流程操作 目录 1. 前期准备1.1 注册与配置 Gitee1.2 下载、安装、配置客户端1.3 配置公钥到 Gitee2. 本地仓库操作(PowerShell/Git Bash)2.1 初始化本地仓库2.2 关联 Gitee 远程仓库3. …

Spring Cloud 中的服务注册与发现: Eureka详解

1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时&#xff0c;URL 是写死的&#xff0c;例如&#xff1a; String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时&#xff0c;这个 URL 就需要相应地变…

通过 SVG 使用 AI 生成理想图片:技术实现与实践指南

文章目录 1. SVG 与 AI 的结合&#xff1a;技术价值2. 技术原理&#xff1a;AI 如何生成 SVG&#xff1f;3. 实现步骤&#xff1a;从需求到图形3.1 定义需求3.2 使用 AI 生成 SVG3.3 验证与调整 4. 代码解析&#xff1a;实现科技感的关键4.1 渐变背景4.2 网格线条4.3 发光六边形…

【AI学习从零至壹】Pytorch神经⽹络

Pytorch神经⽹络 神经网络简介神经元激活函数 神经网络神经⽹络的⼯作过程前向传播(forward) 反向传播(backward)训练神经⽹络 Pytorch搭建并训练神经⽹络神经⽹络构建和训练过程数据预处理构建模型优化器&提取训练数据训练样本 神经网络简介 神经元 在深度学习中&#x…

设计模式-对象创建

对象创建 前言1. Factory Method1.1 模式介绍1.2 模式代码1.2.1 问题代码1.2.2 重构代码 1.3 模式类图1.4 要点总结 2. Abstract Factory2.1 模式介绍2.2 模式代码2.2.1 问题代码2.2.2 重构代码 2.3 模式类图2.4 要点总结 3. Prototype3.1 模式介绍3.2 模式代码3.3 模式类图3.4…

【AVRCP】Notification PDUs 深入解析与应用

目录 一、Notification PDUs 概述 二、GetPlayStatus:同步查询播放状态 2.1 命令功能与应用场景 2.2 请求格式(CT → TG) 2.3 响应格式(TG → CT) 2.4 注意事项 2.5 协议实现示例(伪代码) 三、RegisterNotification:异步事件订阅 3.1 命令概述 3.2 命令格式 …

MATLAB 控制系统设计与仿真 - 27

状态空间的标准型 传递函数和状态空间可以相互转换&#xff0c;接下来会举例如何有传递函数转成状态空间标准型。 对角标准型 当 G(s)可以写成&#xff1a; 即&#xff1a; 根据上图可知&#xff1a; 约当标准型 当 G(s)可以写成&#xff1a; 即&#xff1a; 根据上图…

linux 命令 cp

cp 是 Linux 中用于复制文件和目录的命令&#xff0c;基本功能是将源文件或目录复制到目标位置 基本语法 cp [选项] 源文件 目标文件 cp [选项] 源文件1 源文件2 ... 目标目录 常用选项 选项说明-i交互模式&#xff08;覆盖前询问确认&#xff09;-r 或 -R递归复制目录&#…

蓝桥杯高频考点——进制转换

进制转换 二进制转十进制代码演示 十六进制转十进制代码演示 十进制转K进制代码演示 任意进制之间的转换代码演示 二进制转十进制 代码演示 // 定义函数 calc&#xff0c;用于将字符转换为对应的数值 int calc(char c) {// 若字符 c 大于等于 9&#xff08;注&#xff1a;此处…