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