• Home
Name Date Size #Lines LOC

..--

BUILD.gnD12-May-2024709 1917

README.mdD12-May-20243.4 KiB12286

timer_example.cD12-May-20241.8 KiB7536

README.md

1# BearPi-HM_Nano开发板OpenHarmony内核编程开发——定时器
2本示例将演示如何在BearPi-HM_Nano开发板上使用cmsis 2.0 接口进行定时器开发。
3
4
5## Timer API分析
6
7
8### osTimerNew()
9
10```c
11osTimerId_t osTimerNew	(osTimerFunc_t func,osTimerType_t type,void *argument,const osTimerAttr_t *attr)
12```
13**描述:**
14
15函数osTimerNew创建一个一次性或周期性计时器,并将其与一个带参数的回调函数相关联。计时器在osTimerStart启动之前一直处于停止状态。可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,但不能在内核初始化 (调用 osKernelInitialize)之前调用该函数。
16> **注意** :不能在中断服务调用该函数。
17
18
19**参数:**
20
21|参数名|描述|
22|:--|:------|
23| func | 函数指针指向回调函数。  |
24| type | 定时器类型,osTimerOnce表示单次定时器,ostimer周期表示周期性定时器。  |
25| argument |定时器回调函数的参数。|
26| attr |计时器属性。|
27
28### osTimerStart()
29
30```c
31osStatus_t osTimerStart	(osTimerId_t timer_id,uint32_t ticks)
32```
33**描述:**
34
35函数osTimerStart启动或重新启动指定参数timer_id的计时器。参数ticks指定计时器的计数值。
36
37> **注意** :不能在中断服务调用该函数。
38
39
40**参数:**
41
42|参数名|描述|
43|:--|:------|
44| timer_id | 由osTimerNew获得的计时器ID。  |
45| ticks | 时间滴答计时器的值。  |
46
47## 软件设计
48
49
50**主要代码分析**
51
52在TimerExample函数中,通过osTimerNew()函数创建了回调函数为Timer1Callback的定时器1,并通过osTimerStart()函数将该定时器设置为100个tick,因为hi3861默认10ms为一个tick,所以100个tick正好为1S钟,1S计时到后会触发Timer1Callback()函数并打印日志。定时器2也同理为3S触发Timer2Callback()函数并打印日志。
53
54```c
55/**
56 * @brief Main Entry of the Timer Example
57 *
58 */
59static void TimerExample(void)
60{
61    osTimerId_t id1, id2;
62    uint32_t timerDelay;
63    osStatus_t status;
64
65    id1 = osTimerNew(Timer1Callback, osTimerPeriodic, NULL, NULL);
66    if (id1 != NULL)
67    {
68
69        // Hi3861 1U=10ms,100U=1S
70        timerDelay = 100U;
71
72        status = osTimerStart(id1, timerDelay);
73        if (status != osOK) {
74            printf("Failed to start Timer1!\n");
75        }
76    }
77
78    id2 = osTimerNew(Timer2Callback, osTimerPeriodic, NULL, NULL);
79    if (id2 != NULL) {
80
81        // Hi3861 1U=10ms,300U=3S
82        timerDelay = 300U;
83
84        status = osTimerStart(id2, timerDelay);
85        if (status != osOK) {
86            printf("Failed to start Timer2!\n");
87        }
88    }
89}
90```
91
92## 编译调试
93
94### 修改 BUILD.gn 文件
95
96修改 `device\bearpi\bearpi_hm_nano\app`路径下 BUILD.gn 文件,指定 `timer_example` 参与编译。
97
98```r
99#"A1_kernal_thread:thread_example",
100"A2_kernel_timer:timer_example",
101#"A3_kernel_event:event_example",
102#"A4_kernel_mutex:mutex_example",
103#"A5_kernel_semaphore:semaphore_example",
104#"A6_kernel_message:message_example",
105```
106
107
108
109### 运行结果
110
111示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,Timer1Callback会1S打印一次数据,Timer2Callback会3S打印一次数据。
112```
113This is BearPi Timer1_Callback!
114This is BearPi Timer1_Callback!
115This is BearPi Timer1_Callback!
116This is BearPi Timer2_Callback!
117This is BearPi Timer1_Callback!
118This is BearPi Timer1_Callback!
119This is BearPi Timer1_Callback!
120This is BearPi Timer2_Callback!
121```
122