test_timer.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042
  1. /*
  2. * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stdio.h>
  7. #include "freertos/FreeRTOS.h"
  8. #include "freertos/task.h"
  9. #include "freertos/queue.h"
  10. #include "esp_system.h"
  11. #include "unity.h"
  12. #include "nvs_flash.h"
  13. #include "driver/timer.h"
  14. #include "soc/rtc.h"
  15. #include "soc/soc_caps.h"
  16. #include "esp_rom_sys.h"
  17. #define TIMER_DIVIDER 16
  18. #define TIMER_SCALE (TIMER_BASE_CLK / TIMER_DIVIDER) /*!< used to calculate counter value */
  19. #define TIMER_DELTA 0.001
  20. static bool alarm_flag;
  21. static xQueueHandle timer_queue;
  22. typedef struct {
  23. timer_group_t timer_group;
  24. timer_idx_t timer_idx;
  25. } timer_info_t;
  26. typedef struct {
  27. timer_autoreload_t type; // the type of timer's event
  28. timer_group_t timer_group;
  29. timer_idx_t timer_idx;
  30. uint64_t timer_counter_value;
  31. } timer_event_t;
  32. #define TIMER_INFO_INIT(TG, TID) {.timer_group = (TG), .timer_idx = (TID),}
  33. static timer_info_t timer_info[] = {
  34. #if !CONFIG_IDF_TARGET_ESP32C3
  35. TIMER_INFO_INIT(TIMER_GROUP_0, TIMER_0),
  36. TIMER_INFO_INIT(TIMER_GROUP_0, TIMER_1),
  37. TIMER_INFO_INIT(TIMER_GROUP_1, TIMER_0),
  38. TIMER_INFO_INIT(TIMER_GROUP_1, TIMER_1),
  39. #else
  40. TIMER_INFO_INIT(TIMER_GROUP_0, TIMER_0),
  41. TIMER_INFO_INIT(TIMER_GROUP_1, TIMER_0),
  42. #endif
  43. };
  44. static intr_handle_t timer_isr_handles[SOC_TIMER_GROUP_TOTAL_TIMERS];
  45. #define GET_TIMER_INFO(TG, TID) (&timer_info[(TG)*SOC_TIMER_GROUP_TIMERS_PER_GROUP+(TID)])
  46. // timer group interruption handle callback
  47. static bool test_timer_group_isr_cb(void *arg)
  48. {
  49. bool is_awoken = false;
  50. timer_info_t *info = (timer_info_t *) arg;
  51. const timer_group_t timer_group = info->timer_group;
  52. const timer_idx_t timer_idx = info->timer_idx;
  53. uint64_t timer_val;
  54. double time;
  55. uint64_t alarm_value;
  56. timer_event_t evt;
  57. alarm_flag = true;
  58. if (timer_group_get_auto_reload_in_isr(timer_group, timer_idx)) { // For autoreload mode, the counter value has been cleared
  59. timer_group_clr_intr_status_in_isr(timer_group, timer_idx);
  60. esp_rom_printf("This is TG%d timer[%d] reload-timer alarm!\n", timer_group, timer_idx);
  61. timer_get_counter_value(timer_group, timer_idx, &timer_val);
  62. timer_get_counter_time_sec(timer_group, timer_idx, &time);
  63. evt.type = TIMER_AUTORELOAD_EN;
  64. } else {
  65. timer_group_clr_intr_status_in_isr(timer_group, timer_idx);
  66. esp_rom_printf("This is TG%d timer[%d] count-up-timer alarm!\n", timer_group, timer_idx);
  67. timer_get_counter_value(timer_group, timer_idx, &timer_val);
  68. timer_get_counter_time_sec(timer_group, timer_idx, &time);
  69. timer_get_alarm_value(timer_group, timer_idx, &alarm_value);
  70. timer_set_counter_value(timer_group, timer_idx, 0);
  71. evt.type = TIMER_AUTORELOAD_DIS;
  72. }
  73. evt.timer_group = timer_group;
  74. evt.timer_idx = timer_idx;
  75. evt.timer_counter_value = timer_val;
  76. if (timer_queue != NULL) {
  77. BaseType_t awoken = pdFALSE;
  78. BaseType_t ret = xQueueSendFromISR(timer_queue, &evt, &awoken);
  79. TEST_ASSERT_EQUAL(pdTRUE, ret);
  80. if (awoken) {
  81. is_awoken = true;
  82. }
  83. }
  84. return is_awoken;
  85. }
  86. // timer group interruption handle
  87. static void test_timer_group_isr(void *arg)
  88. {
  89. if (test_timer_group_isr_cb(arg)) {
  90. portYIELD_FROM_ISR();
  91. }
  92. }
  93. // initialize all timer
  94. static void all_timer_init(timer_config_t *config, bool expect_init)
  95. {
  96. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  97. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  98. TEST_ASSERT_EQUAL((expect_init ? ESP_OK : ESP_ERR_INVALID_ARG), timer_init(tg_idx, timer_idx, config));
  99. }
  100. }
  101. if (timer_queue == NULL) {
  102. timer_queue = xQueueCreate(10, sizeof(timer_event_t));
  103. }
  104. }
  105. // deinitialize all timer
  106. static void all_timer_deinit(void)
  107. {
  108. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  109. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  110. TEST_ESP_OK(timer_deinit(tg_idx, timer_idx));
  111. }
  112. }
  113. if (timer_queue != NULL) {
  114. vQueueDelete(timer_queue);
  115. timer_queue = NULL;
  116. }
  117. }
  118. // start all of timer
  119. static void all_timer_start(void)
  120. {
  121. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  122. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  123. TEST_ESP_OK(timer_start(tg_idx, timer_idx));
  124. }
  125. }
  126. }
  127. static void all_timer_set_counter_value(uint64_t set_cnt_val)
  128. {
  129. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  130. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  131. TEST_ESP_OK(timer_set_counter_value(tg_idx, timer_idx, set_cnt_val));
  132. }
  133. }
  134. }
  135. static void all_timer_pause(void)
  136. {
  137. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  138. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  139. TEST_ESP_OK(timer_pause(tg_idx, timer_idx));
  140. }
  141. }
  142. }
  143. static void all_timer_get_counter_value(uint64_t set_cnt_val, bool expect_equal_set_val,
  144. uint64_t *actual_cnt_val)
  145. {
  146. uint64_t current_cnt_val;
  147. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  148. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  149. TEST_ESP_OK(timer_get_counter_value(tg_idx, timer_idx, &current_cnt_val));
  150. if (expect_equal_set_val) {
  151. TEST_ASSERT_EQUAL(set_cnt_val, current_cnt_val);
  152. } else {
  153. TEST_ASSERT_NOT_EQUAL(set_cnt_val, current_cnt_val);
  154. if (actual_cnt_val != NULL) {
  155. actual_cnt_val[tg_idx * SOC_TIMER_GROUP_TIMERS_PER_GROUP + timer_idx] = current_cnt_val;
  156. }
  157. }
  158. }
  159. }
  160. }
  161. static void all_timer_get_counter_time_sec(int expect_time)
  162. {
  163. double time;
  164. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  165. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  166. TEST_ESP_OK(timer_get_counter_time_sec(tg_idx, timer_idx, &time));
  167. TEST_ASSERT_FLOAT_WITHIN(TIMER_DELTA, expect_time, time);
  168. }
  169. }
  170. }
  171. static void all_timer_set_counter_mode(timer_count_dir_t counter_dir)
  172. {
  173. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  174. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  175. TEST_ESP_OK(timer_set_counter_mode(tg_idx, timer_idx, counter_dir));
  176. }
  177. }
  178. }
  179. static void all_timer_set_divider(uint32_t divider)
  180. {
  181. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  182. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  183. TEST_ESP_OK(timer_set_divider(tg_idx, timer_idx, divider));
  184. }
  185. }
  186. }
  187. static void all_timer_set_alarm_value(uint64_t alarm_cnt_val)
  188. {
  189. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  190. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  191. TEST_ESP_OK(timer_set_alarm_value(tg_idx, timer_idx, alarm_cnt_val));
  192. }
  193. }
  194. }
  195. static void all_timer_get_alarm_value(uint64_t *alarm_vals)
  196. {
  197. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  198. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  199. TEST_ESP_OK(timer_get_alarm_value(tg_idx, timer_idx, &alarm_vals[tg_idx * SOC_TIMER_GROUP_TIMERS_PER_GROUP + timer_idx]));
  200. }
  201. }
  202. }
  203. static void all_timer_isr_reg(void)
  204. {
  205. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  206. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  207. TEST_ESP_OK(timer_isr_register(tg_idx, timer_idx, test_timer_group_isr,
  208. GET_TIMER_INFO(tg_idx, timer_idx), ESP_INTR_FLAG_LOWMED, &timer_isr_handles[tg_idx * SOC_TIMER_GROUP_TIMERS_PER_GROUP + timer_idx]));
  209. }
  210. }
  211. }
  212. static void all_timer_isr_unreg(void)
  213. {
  214. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  215. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  216. TEST_ESP_OK(esp_intr_free(timer_isr_handles[tg_idx * SOC_TIMER_GROUP_TIMERS_PER_GROUP + timer_idx]));
  217. }
  218. }
  219. }
  220. // enable interrupt and start timer
  221. static void timer_intr_enable_and_start(int timer_group, int timer_idx, double alarm_time)
  222. {
  223. TEST_ESP_OK(timer_pause(timer_group, timer_idx));
  224. TEST_ESP_OK(timer_set_counter_value(timer_group, timer_idx, 0x0));
  225. TEST_ESP_OK(timer_set_alarm_value(timer_group, timer_idx, alarm_time * TIMER_SCALE));
  226. TEST_ESP_OK(timer_set_alarm(timer_group, timer_idx, TIMER_ALARM_EN));
  227. TEST_ESP_OK(timer_enable_intr(timer_group, timer_idx));
  228. TEST_ESP_OK(timer_start(timer_group, timer_idx));
  229. }
  230. static void timer_isr_check(timer_group_t group_num, timer_idx_t timer_num, timer_autoreload_t autoreload, uint64_t alarm_cnt_val)
  231. {
  232. timer_event_t evt;
  233. TEST_ASSERT_EQUAL(pdTRUE, xQueueReceive(timer_queue, &evt, 3000 / portTICK_PERIOD_MS));
  234. TEST_ASSERT_EQUAL(autoreload, evt.type);
  235. TEST_ASSERT_EQUAL(group_num, evt.timer_group);
  236. TEST_ASSERT_EQUAL(timer_num, evt.timer_idx);
  237. TEST_ASSERT_EQUAL((uint32_t)(alarm_cnt_val >> 32), (uint32_t)(evt.timer_counter_value >> 32));
  238. TEST_ASSERT_UINT32_WITHIN(1000, (uint32_t)(alarm_cnt_val), (uint32_t)(evt.timer_counter_value));
  239. }
  240. static void timer_intr_enable_disable_test(timer_group_t group_num, timer_idx_t timer_num, uint64_t alarm_cnt_val)
  241. {
  242. alarm_flag = false;
  243. TEST_ESP_OK(timer_set_counter_value(group_num, timer_num, 0));
  244. TEST_ESP_OK(timer_set_alarm(group_num, timer_num, TIMER_ALARM_EN));
  245. TEST_ESP_OK(timer_enable_intr(group_num, timer_num));
  246. TEST_ESP_OK(timer_start(group_num, timer_num));
  247. timer_isr_check(group_num, timer_num, TIMER_AUTORELOAD_DIS, alarm_cnt_val);
  248. TEST_ASSERT_EQUAL(true, alarm_flag);
  249. // disable interrupt of tg0_timer0
  250. alarm_flag = false;
  251. TEST_ESP_OK(timer_pause(group_num, timer_num));
  252. TEST_ESP_OK(timer_set_counter_value(group_num, timer_num, 0));
  253. TEST_ESP_OK(timer_disable_intr(group_num, timer_num));
  254. TEST_ESP_OK(timer_start(group_num, timer_num));
  255. vTaskDelay(2000 / portTICK_PERIOD_MS);
  256. TEST_ASSERT_EQUAL(false, alarm_flag);
  257. }
  258. TEST_CASE("Timer init", "[hw_timer]")
  259. {
  260. // Test init 1:config parameter
  261. // empty parameter
  262. timer_config_t config0 = { };
  263. all_timer_init(&config0, false);
  264. // only one parameter
  265. timer_config_t config1 = {
  266. .auto_reload = TIMER_AUTORELOAD_EN
  267. };
  268. all_timer_init(&config1, false);
  269. // lack one parameter
  270. timer_config_t config2 = {
  271. .auto_reload = TIMER_AUTORELOAD_EN,
  272. .counter_dir = TIMER_COUNT_UP,
  273. .divider = TIMER_DIVIDER,
  274. .counter_en = TIMER_START,
  275. .intr_type = TIMER_INTR_LEVEL
  276. };
  277. all_timer_init(&config2, true);
  278. config2.counter_en = TIMER_PAUSE;
  279. all_timer_init(&config2, true);
  280. // error config parameter
  281. timer_config_t config3 = {
  282. .alarm_en = 3, //error parameter
  283. .auto_reload = TIMER_AUTORELOAD_EN,
  284. .counter_dir = TIMER_COUNT_UP,
  285. .divider = TIMER_DIVIDER,
  286. .counter_en = TIMER_START,
  287. .intr_type = TIMER_INTR_LEVEL
  288. };
  289. all_timer_init(&config3, true);
  290. timer_config_t get_config;
  291. TEST_ESP_OK(timer_get_config(TIMER_GROUP_1, TIMER_0, &get_config));
  292. printf("Error config alarm_en is %d\n", get_config.alarm_en);
  293. TEST_ASSERT_NOT_EQUAL(config3.alarm_en, get_config.alarm_en);
  294. // Test init 2: init
  295. uint64_t set_timer_val = 0x0;
  296. timer_config_t config = {
  297. .alarm_en = TIMER_ALARM_DIS,
  298. .auto_reload = TIMER_AUTORELOAD_EN,
  299. .counter_dir = TIMER_COUNT_UP,
  300. .divider = TIMER_DIVIDER,
  301. .counter_en = TIMER_START,
  302. .intr_type = TIMER_INTR_LEVEL
  303. };
  304. // judge get config parameters
  305. TEST_ESP_OK(timer_init(TIMER_GROUP_0, TIMER_0, &config));
  306. TEST_ESP_OK(timer_get_config(TIMER_GROUP_0, TIMER_0, &get_config));
  307. TEST_ASSERT_EQUAL(config.alarm_en, get_config.alarm_en);
  308. TEST_ASSERT_EQUAL(config.auto_reload, get_config.auto_reload);
  309. TEST_ASSERT_EQUAL(config.counter_dir, get_config.counter_dir);
  310. TEST_ASSERT_EQUAL(config.counter_en, get_config.counter_en);
  311. TEST_ASSERT_EQUAL(config.intr_type, get_config.intr_type);
  312. TEST_ASSERT_EQUAL(config.divider, get_config.divider);
  313. all_timer_init(&config, true);
  314. all_timer_pause();
  315. all_timer_set_counter_value(set_timer_val);
  316. all_timer_start();
  317. all_timer_get_counter_value(set_timer_val, false, NULL);
  318. // Test init 3: wrong parameter
  319. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_init(-1, TIMER_0, &config));
  320. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_init(TIMER_GROUP_1, 2, &config));
  321. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_init(TIMER_GROUP_1, -1, &config));
  322. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_init(2, TIMER_0, &config));
  323. all_timer_deinit();
  324. }
  325. /**
  326. * read count case:
  327. * 1. start timer compare value
  328. * 2. pause timer compare value
  329. * 3. delay some time */
  330. TEST_CASE("Timer read counter value", "[hw_timer]")
  331. {
  332. timer_config_t config = {
  333. .alarm_en = TIMER_ALARM_EN,
  334. .auto_reload = TIMER_AUTORELOAD_EN,
  335. .counter_dir = TIMER_COUNT_UP,
  336. .divider = TIMER_DIVIDER,
  337. .counter_en = TIMER_START,
  338. .intr_type = TIMER_INTR_LEVEL
  339. };
  340. uint64_t set_timer_val = 0x0;
  341. all_timer_init(&config, true);
  342. // Test read value 1: start timer get counter value
  343. all_timer_set_counter_value(set_timer_val);
  344. all_timer_start();
  345. all_timer_get_counter_value(set_timer_val, false, NULL);
  346. // Test read value 2: pause timer get counter value
  347. all_timer_pause();
  348. set_timer_val = 0x30405000ULL;
  349. all_timer_set_counter_value(set_timer_val);
  350. all_timer_get_counter_value(set_timer_val, true, NULL);
  351. // Test read value 3:delay 1s get counter value
  352. set_timer_val = 0x0;
  353. all_timer_set_counter_value(set_timer_val);
  354. all_timer_start();
  355. vTaskDelay(1000 / portTICK_PERIOD_MS);
  356. all_timer_get_counter_time_sec(1);
  357. all_timer_deinit();
  358. }
  359. /**
  360. * start timer case:
  361. * 1. normal start
  362. * 2. error start parameter
  363. * */
  364. TEST_CASE("Timer start", "[hw_timer]")
  365. {
  366. timer_config_t config = {
  367. .alarm_en = TIMER_ALARM_EN,
  368. .auto_reload = TIMER_AUTORELOAD_EN,
  369. .counter_dir = TIMER_COUNT_UP,
  370. .divider = TIMER_DIVIDER,
  371. .counter_en = TIMER_START,
  372. .intr_type = TIMER_INTR_LEVEL
  373. };
  374. uint64_t set_timer_val = 0x0;
  375. all_timer_init(&config, true);
  376. //Test start 1: normal start
  377. all_timer_start();
  378. all_timer_set_counter_value(set_timer_val);
  379. all_timer_get_counter_value(set_timer_val, false, NULL);
  380. //Test start 2:wrong parameter
  381. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_start(2, TIMER_0));
  382. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_start(-1, TIMER_0));
  383. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_start(TIMER_GROUP_1, 2));
  384. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_start(TIMER_GROUP_1, -1));
  385. all_timer_deinit();
  386. }
  387. /**
  388. * pause timer case:
  389. * 1. normal pause, read value
  390. * 2. error pause error
  391. */
  392. TEST_CASE("Timer pause", "[hw_timer]")
  393. {
  394. timer_config_t config = {
  395. .alarm_en = TIMER_ALARM_EN,
  396. .auto_reload = TIMER_AUTORELOAD_EN,
  397. .counter_dir = TIMER_COUNT_UP,
  398. .divider = TIMER_DIVIDER,
  399. .counter_en = TIMER_START,
  400. .intr_type = TIMER_INTR_LEVEL
  401. };
  402. uint64_t set_timer_val = 0x0;
  403. all_timer_init(&config, true);
  404. //Test pause 1: right parameter
  405. all_timer_pause();
  406. all_timer_set_counter_value(set_timer_val);
  407. all_timer_get_counter_value(set_timer_val, true, NULL);
  408. //Test pause 2: wrong parameter
  409. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_pause(-1, TIMER_0));
  410. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_pause(TIMER_GROUP_0, -1));
  411. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_pause(2, TIMER_0));
  412. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_pause(TIMER_GROUP_1, 2));
  413. all_timer_deinit();
  414. }
  415. // positive mode and negative mode
  416. TEST_CASE("Timer counter mode (up / down)", "[hw_timer]")
  417. {
  418. timer_config_t config = {
  419. .alarm_en = TIMER_ALARM_EN,
  420. .auto_reload = TIMER_AUTORELOAD_EN,
  421. .counter_dir = TIMER_COUNT_UP,
  422. .divider = TIMER_DIVIDER,
  423. .counter_en = TIMER_START,
  424. .intr_type = TIMER_INTR_LEVEL
  425. };
  426. uint64_t set_timer_val = 0x0;
  427. all_timer_init(&config, true);
  428. all_timer_pause();
  429. // Test counter mode 1: TIMER_COUNT_UP
  430. all_timer_set_counter_mode(TIMER_COUNT_UP);
  431. all_timer_set_counter_value(set_timer_val);
  432. all_timer_start();
  433. vTaskDelay(1000 / portTICK_PERIOD_MS);
  434. all_timer_get_counter_time_sec(1);
  435. // Test counter mode 2: TIMER_COUNT_DOWN
  436. all_timer_pause();
  437. set_timer_val = 0x00E4E1C0ULL; // 3s clock counter value
  438. all_timer_set_counter_mode(TIMER_COUNT_DOWN);
  439. all_timer_set_counter_value(set_timer_val);
  440. all_timer_start();
  441. vTaskDelay(1000 / portTICK_PERIOD_MS);
  442. all_timer_get_counter_time_sec(2);
  443. // Test counter mode 3 : wrong parameter
  444. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_set_counter_mode(TIMER_GROUP_0, TIMER_0, -1));
  445. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_set_counter_mode(TIMER_GROUP_0, TIMER_0, 2));
  446. all_timer_deinit();
  447. }
  448. /**
  449. * divider case:
  450. * 1. different divider, read value
  451. * Note: divide 0 = divide max, divide 1 = divide 2
  452. * 2. error parameter
  453. *
  454. * the frequency(timer counts in one sec):
  455. * 80M/divider = 800*100000
  456. * max divider value is 65536, its frequency is 1220 (nearly about 1KHz)
  457. */
  458. TEST_CASE("Timer divider", "[hw_timer]")
  459. {
  460. int i;
  461. timer_config_t config = {
  462. .alarm_en = TIMER_ALARM_EN,
  463. .auto_reload = TIMER_AUTORELOAD_EN,
  464. .counter_dir = TIMER_COUNT_UP,
  465. .divider = TIMER_DIVIDER,
  466. .counter_en = TIMER_START,
  467. .intr_type = TIMER_INTR_LEVEL
  468. };
  469. uint64_t set_timer_val = 0;
  470. uint64_t time_val[TIMER_GROUP_MAX * TIMER_MAX];
  471. uint64_t comp_time_val[TIMER_GROUP_MAX * TIMER_MAX];
  472. all_timer_init(&config, true);
  473. all_timer_pause();
  474. all_timer_set_counter_value(set_timer_val);
  475. all_timer_start();
  476. vTaskDelay(1000 / portTICK_PERIOD_MS);
  477. all_timer_get_counter_value(set_timer_val, false, time_val);
  478. // compare divider 16 and 8, value should be double
  479. all_timer_pause();
  480. all_timer_set_divider(8);
  481. all_timer_set_counter_value(set_timer_val);
  482. all_timer_start();
  483. vTaskDelay(1000 / portTICK_PERIOD_MS); //delay the same time
  484. all_timer_get_counter_value(set_timer_val, false, comp_time_val);
  485. for (i = 0; i < TIMER_GROUP_MAX * TIMER_MAX; i++) {
  486. TEST_ASSERT_INT_WITHIN(5000, 5000000, time_val[i]);
  487. TEST_ASSERT_INT_WITHIN(10000, 10000000, comp_time_val[i]);
  488. }
  489. // divider is 256, value should be 2^4
  490. all_timer_pause();
  491. all_timer_set_divider(256);
  492. all_timer_set_counter_value(set_timer_val);
  493. all_timer_start();
  494. vTaskDelay(1000 / portTICK_PERIOD_MS); //delay the same time
  495. all_timer_get_counter_value(set_timer_val, false, comp_time_val);
  496. for (i = 0; i < TIMER_GROUP_MAX * TIMER_MAX; i++) {
  497. TEST_ASSERT_INT_WITHIN(5000, 5000000, time_val[i]);
  498. TEST_ASSERT_INT_WITHIN(3126, 312500, comp_time_val[i]);
  499. }
  500. // extrem value test
  501. all_timer_pause();
  502. all_timer_set_divider(2);
  503. all_timer_set_counter_value(set_timer_val);
  504. all_timer_start();
  505. vTaskDelay(1000 / portTICK_PERIOD_MS);
  506. all_timer_get_counter_value(set_timer_val, false, comp_time_val);
  507. for (i = 0; i < TIMER_GROUP_MAX * TIMER_MAX; i++) {
  508. TEST_ASSERT_INT_WITHIN(5000, 5000000, time_val[i]);
  509. TEST_ASSERT_INT_WITHIN(40000, 40000000, comp_time_val[i]);
  510. }
  511. all_timer_pause();
  512. all_timer_set_divider(65536);
  513. all_timer_set_counter_value(set_timer_val);
  514. all_timer_start();
  515. vTaskDelay(1000 / portTICK_PERIOD_MS); //delay the same time
  516. all_timer_get_counter_value(set_timer_val, false, comp_time_val);
  517. for (i = 0; i < TIMER_GROUP_MAX * TIMER_MAX; i++) {
  518. TEST_ASSERT_INT_WITHIN(5000, 5000000, time_val[i]);
  519. TEST_ASSERT_INT_WITHIN(2, 1220, comp_time_val[i]);
  520. }
  521. // divider is 1 should be equal with 2
  522. all_timer_pause();
  523. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_set_divider(TIMER_GROUP_0, TIMER_0, 1));
  524. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_set_divider(TIMER_GROUP_1, TIMER_0, 1));
  525. all_timer_pause();
  526. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_set_divider(TIMER_GROUP_0, TIMER_0, 65537));
  527. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, timer_set_divider(TIMER_GROUP_1, TIMER_0, 65537));
  528. all_timer_deinit();
  529. }
  530. /**
  531. * enable alarm case:
  532. * 1. enable alarm ,set alarm value and get value
  533. * 2. disable alarm ,set alarm value and get value
  534. */
  535. TEST_CASE("Timer enable alarm", "[hw_timer]")
  536. {
  537. timer_config_t config_test = {
  538. .alarm_en = TIMER_ALARM_DIS,
  539. .auto_reload = TIMER_AUTORELOAD_DIS,
  540. .counter_dir = TIMER_COUNT_UP,
  541. .divider = TIMER_DIVIDER,
  542. .counter_en = TIMER_PAUSE,
  543. .intr_type = TIMER_INTR_LEVEL
  544. };
  545. all_timer_init(&config_test, true);
  546. all_timer_isr_reg();
  547. // enable alarm of tg0_timer1
  548. alarm_flag = false;
  549. TEST_ESP_OK(timer_set_alarm(TIMER_GROUP_0, TIMER_0, TIMER_ALARM_EN));
  550. timer_intr_enable_and_start(TIMER_GROUP_0, TIMER_0, 1.2);
  551. timer_isr_check(TIMER_GROUP_0, TIMER_0, TIMER_AUTORELOAD_DIS, 1.2 * TIMER_SCALE);
  552. TEST_ASSERT_EQUAL(true, alarm_flag);
  553. // disable alarm of tg0_timer1
  554. alarm_flag = false;
  555. timer_intr_enable_and_start(TIMER_GROUP_0, TIMER_0, 1.2);
  556. TEST_ESP_OK(timer_set_alarm(TIMER_GROUP_0, TIMER_0, TIMER_ALARM_DIS));
  557. vTaskDelay(2000 / portTICK_PERIOD_MS);
  558. TEST_ASSERT_EQUAL(false, alarm_flag);
  559. // enable alarm of tg1_timer0
  560. alarm_flag = false;
  561. TEST_ESP_OK(timer_set_alarm(TIMER_GROUP_1, TIMER_0, TIMER_ALARM_EN));
  562. timer_intr_enable_and_start(TIMER_GROUP_1, TIMER_0, 1.2);
  563. timer_isr_check(TIMER_GROUP_1, TIMER_0, TIMER_AUTORELOAD_DIS, 1.2 * TIMER_SCALE);
  564. TEST_ASSERT_EQUAL(true, alarm_flag);
  565. // disable alarm of tg1_timer0
  566. alarm_flag = false;
  567. timer_intr_enable_and_start(TIMER_GROUP_1, TIMER_0, 1.2);
  568. TEST_ESP_OK(timer_set_alarm(TIMER_GROUP_1, TIMER_0, TIMER_ALARM_DIS));
  569. vTaskDelay(2000 / portTICK_PERIOD_MS);
  570. TEST_ASSERT_EQUAL(false, alarm_flag);
  571. all_timer_isr_unreg();
  572. all_timer_deinit();
  573. }
  574. /**
  575. * alarm value case:
  576. * 1. set alarm value and get value
  577. * 2. interrupt test time
  578. */
  579. TEST_CASE("Timer set alarm value", "[hw_timer]")
  580. {
  581. uint64_t alarm_val[SOC_TIMER_GROUP_TOTAL_TIMERS];
  582. timer_config_t config = {
  583. .alarm_en = TIMER_ALARM_EN,
  584. .auto_reload = TIMER_AUTORELOAD_DIS,
  585. .counter_dir = TIMER_COUNT_UP,
  586. .divider = TIMER_DIVIDER,
  587. .counter_en = TIMER_PAUSE,
  588. .intr_type = TIMER_INTR_LEVEL
  589. };
  590. all_timer_init(&config, true);
  591. all_timer_isr_reg();
  592. // set and get alarm value
  593. all_timer_set_alarm_value(3 * TIMER_SCALE);
  594. all_timer_get_alarm_value(alarm_val);
  595. for (int i = 0; i < SOC_TIMER_GROUP_TOTAL_TIMERS; i++) {
  596. TEST_ASSERT_EQUAL_UINT32(3 * TIMER_SCALE, (uint32_t)alarm_val[i]);
  597. }
  598. // set interrupt read alarm value
  599. timer_intr_enable_and_start(TIMER_GROUP_0, TIMER_0, 2.4);
  600. timer_isr_check(TIMER_GROUP_0, TIMER_0, TIMER_AUTORELOAD_DIS, 2.4 * TIMER_SCALE);
  601. timer_intr_enable_and_start(TIMER_GROUP_1, TIMER_0, 1.4);
  602. timer_isr_check(TIMER_GROUP_1, TIMER_0, TIMER_AUTORELOAD_DIS, 1.4 * TIMER_SCALE);
  603. all_timer_isr_unreg();
  604. all_timer_deinit();
  605. }
  606. /**
  607. * auto reload case:
  608. * 1. no reload
  609. * 2. auto reload
  610. */
  611. TEST_CASE("Timer auto reload", "[hw_timer]")
  612. {
  613. timer_config_t config = {
  614. .alarm_en = TIMER_ALARM_EN,
  615. .auto_reload = TIMER_AUTORELOAD_DIS,
  616. .counter_dir = TIMER_COUNT_UP,
  617. .divider = TIMER_DIVIDER,
  618. .counter_en = TIMER_PAUSE,
  619. .intr_type = TIMER_INTR_LEVEL
  620. };
  621. all_timer_init(&config, true);
  622. all_timer_isr_reg();
  623. // test disable auto_reload
  624. timer_intr_enable_and_start(TIMER_GROUP_0, TIMER_0, 1.14);
  625. timer_isr_check(TIMER_GROUP_0, TIMER_0, TIMER_AUTORELOAD_DIS, 1.14 * TIMER_SCALE);
  626. timer_intr_enable_and_start(TIMER_GROUP_1, TIMER_0, 1.14);
  627. timer_isr_check(TIMER_GROUP_1, TIMER_0, TIMER_AUTORELOAD_DIS, 1.14 * TIMER_SCALE);
  628. //test enable auto_reload
  629. TEST_ESP_OK(timer_set_auto_reload(TIMER_GROUP_0, TIMER_0, TIMER_AUTORELOAD_EN));
  630. timer_intr_enable_and_start(TIMER_GROUP_0, TIMER_0, 1.4);
  631. timer_isr_check(TIMER_GROUP_0, TIMER_0, TIMER_AUTORELOAD_EN, 0);
  632. TEST_ESP_OK(timer_set_auto_reload(TIMER_GROUP_1, TIMER_0, TIMER_AUTORELOAD_EN));
  633. timer_intr_enable_and_start(TIMER_GROUP_1, TIMER_0, 1.4);
  634. timer_isr_check(TIMER_GROUP_1, TIMER_0, TIMER_AUTORELOAD_EN, 0);
  635. all_timer_isr_unreg();
  636. all_timer_deinit();
  637. }
  638. /**
  639. * timer_enable_intr case:
  640. * 1. enable timer_intr
  641. * 2. disable timer_intr
  642. */
  643. TEST_CASE("Timer enable timer interrupt", "[hw_timer]")
  644. {
  645. timer_config_t config = {
  646. .alarm_en = TIMER_ALARM_DIS,
  647. .counter_dir = TIMER_COUNT_UP,
  648. .auto_reload = TIMER_AUTORELOAD_DIS,
  649. .divider = TIMER_DIVIDER,
  650. .counter_en = TIMER_PAUSE,
  651. .intr_type = TIMER_INTR_LEVEL
  652. };
  653. all_timer_init(&config, true);
  654. all_timer_pause();
  655. all_timer_set_alarm_value(1.2 * TIMER_SCALE);
  656. all_timer_set_counter_value(0);
  657. all_timer_isr_reg();
  658. timer_intr_enable_disable_test(TIMER_GROUP_0, TIMER_0, 1.2 * TIMER_SCALE);
  659. timer_intr_enable_disable_test(TIMER_GROUP_1, TIMER_0, 1.2 * TIMER_SCALE);
  660. // enable interrupt of tg1_timer0 again
  661. alarm_flag = false;
  662. TEST_ESP_OK(timer_pause(TIMER_GROUP_1, TIMER_0));
  663. TEST_ESP_OK(timer_set_counter_value(TIMER_GROUP_1, TIMER_0, 0));
  664. TEST_ESP_OK(timer_set_alarm(TIMER_GROUP_1, TIMER_0, TIMER_ALARM_EN));
  665. TEST_ESP_OK(timer_enable_intr(TIMER_GROUP_1, TIMER_0));
  666. TEST_ESP_OK(timer_start(TIMER_GROUP_1, TIMER_0));
  667. timer_isr_check(TIMER_GROUP_1, TIMER_0, TIMER_AUTORELOAD_DIS, 1.2 * TIMER_SCALE);
  668. TEST_ASSERT_EQUAL(true, alarm_flag);
  669. all_timer_isr_unreg();
  670. all_timer_deinit();
  671. }
  672. /**
  673. * enable timer group case:
  674. * 1. enable timer group
  675. * 2. disable timer group
  676. */
  677. TEST_CASE("Timer enable timer group interrupt", "[hw_timer][ignore]")
  678. {
  679. intr_handle_t isr_handle = NULL;
  680. alarm_flag = false;
  681. timer_config_t config = {
  682. .alarm_en = TIMER_ALARM_EN,
  683. .auto_reload = TIMER_AUTORELOAD_DIS,
  684. .counter_dir = TIMER_COUNT_UP,
  685. .divider = TIMER_DIVIDER,
  686. .counter_en = TIMER_PAUSE,
  687. .intr_type = TIMER_INTR_LEVEL
  688. };
  689. uint64_t set_timer_val = 0x0;
  690. all_timer_init(&config, true);
  691. all_timer_pause();
  692. all_timer_set_counter_value(set_timer_val);
  693. all_timer_set_alarm_value(1.2 * TIMER_SCALE);
  694. // enable interrupt of tg0_timer0
  695. TEST_ESP_OK(timer_group_intr_enable(TIMER_GROUP_0, TIMER_INTR_T0));
  696. TEST_ESP_OK(timer_isr_register(TIMER_GROUP_0, TIMER_0, test_timer_group_isr,
  697. GET_TIMER_INFO(TIMER_GROUP_0, TIMER_0), ESP_INTR_FLAG_LOWMED, &isr_handle));
  698. TEST_ESP_OK(timer_start(TIMER_GROUP_0, TIMER_0));
  699. timer_isr_check(TIMER_GROUP_0, TIMER_0, TIMER_AUTORELOAD_DIS, 1.2 * TIMER_SCALE);
  700. TEST_ASSERT_EQUAL(true, alarm_flag);
  701. // disable interrupt of tg0_timer0
  702. alarm_flag = false;
  703. TEST_ESP_OK(timer_set_counter_value(TIMER_GROUP_0, TIMER_0, set_timer_val));
  704. TEST_ESP_OK(timer_group_intr_disable(TIMER_GROUP_0, TIMER_INTR_T0));
  705. TEST_ESP_OK(timer_start(TIMER_GROUP_0, TIMER_0));
  706. vTaskDelay(2000 / portTICK_PERIOD_MS);
  707. TEST_ASSERT_EQUAL(false, alarm_flag);
  708. esp_intr_free(isr_handle);
  709. }
  710. /**
  711. * isr_register case:
  712. * Cycle register 15 times, compare the heap size to ensure no memory leaks
  713. */
  714. TEST_CASE("Timer interrupt register", "[hw_timer]")
  715. {
  716. timer_config_t config = {
  717. .alarm_en = TIMER_ALARM_DIS,
  718. .auto_reload = TIMER_AUTORELOAD_DIS,
  719. .counter_dir = TIMER_COUNT_UP,
  720. .divider = TIMER_DIVIDER,
  721. .counter_en = TIMER_PAUSE,
  722. .intr_type = TIMER_INTR_LEVEL
  723. };
  724. for (int i = 0; i < 15; i++) {
  725. all_timer_init(&config, true);
  726. timer_isr_handle_t timer_isr_handle[TIMER_GROUP_MAX * TIMER_MAX];
  727. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  728. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  729. TEST_ESP_OK(timer_isr_register(tg_idx, timer_idx, test_timer_group_isr,
  730. GET_TIMER_INFO(tg_idx, timer_idx), ESP_INTR_FLAG_LOWMED, &timer_isr_handle[tg_idx * SOC_TIMER_GROUP_TIMERS_PER_GROUP + timer_idx]));
  731. }
  732. }
  733. TEST_ESP_OK(timer_set_alarm(TIMER_GROUP_0, TIMER_0, TIMER_ALARM_EN));
  734. timer_intr_enable_and_start(TIMER_GROUP_0, TIMER_0, 0.54);
  735. TEST_ESP_OK(timer_set_alarm(TIMER_GROUP_1, TIMER_0, TIMER_ALARM_EN));
  736. timer_intr_enable_and_start(TIMER_GROUP_1, TIMER_0, 0.34);
  737. TEST_ESP_OK(timer_set_auto_reload(TIMER_GROUP_0, TIMER_0, TIMER_AUTORELOAD_EN));
  738. TEST_ESP_OK(timer_set_alarm(TIMER_GROUP_0, TIMER_0, TIMER_ALARM_EN));
  739. timer_intr_enable_and_start(TIMER_GROUP_0, TIMER_0, 0.4);
  740. TEST_ESP_OK(timer_set_auto_reload(TIMER_GROUP_1, TIMER_0, TIMER_AUTORELOAD_EN));
  741. TEST_ESP_OK(timer_set_alarm(TIMER_GROUP_1, TIMER_0, TIMER_ALARM_EN));
  742. timer_intr_enable_and_start(TIMER_GROUP_1, TIMER_0, 0.6);
  743. vTaskDelay(1000 / portTICK_PERIOD_MS);
  744. // ISR hanlde function should be free before next ISR register.
  745. for (uint32_t tg_idx = 0; tg_idx < TIMER_GROUP_MAX; tg_idx++) {
  746. for (uint32_t timer_idx = 0; timer_idx < TIMER_MAX; timer_idx++) {
  747. TEST_ESP_OK(esp_intr_free(timer_isr_handle[tg_idx * SOC_TIMER_GROUP_TIMERS_PER_GROUP + timer_idx]));
  748. }
  749. }
  750. all_timer_deinit();
  751. }
  752. }
  753. #if SOC_TIMER_GROUP_SUPPORT_XTAL
  754. /**
  755. * Timer clock source:
  756. * 1. configure clock source as APB clock, and enable timer interrupt
  757. * 2. configure clock source as XTAL clock, adn enable timer interrupt
  758. */
  759. TEST_CASE("Timer clock source", "[hw_timer]")
  760. {
  761. // configure clock source as APB clock
  762. uint32_t timer_scale = rtc_clk_apb_freq_get() / TIMER_DIVIDER;
  763. timer_config_t config = {
  764. .alarm_en = TIMER_ALARM_DIS,
  765. .auto_reload = TIMER_AUTORELOAD_DIS,
  766. .counter_dir = TIMER_COUNT_UP,
  767. .divider = TIMER_DIVIDER,
  768. .counter_en = TIMER_PAUSE,
  769. .intr_type = TIMER_INTR_LEVEL,
  770. .clk_src = TIMER_SRC_CLK_APB
  771. };
  772. all_timer_init(&config, true);
  773. all_timer_pause();
  774. all_timer_set_alarm_value(1.2 * timer_scale);
  775. all_timer_set_counter_value(0);
  776. all_timer_isr_reg();
  777. timer_intr_enable_disable_test(TIMER_GROUP_0, TIMER_0, 1.2 * timer_scale);
  778. timer_intr_enable_disable_test(TIMER_GROUP_1, TIMER_0, 1.2 * timer_scale );
  779. // configure clock source as XTAL clock
  780. all_timer_pause();
  781. timer_scale = rtc_clk_xtal_freq_get() * 1000000 / TIMER_DIVIDER;
  782. config.clk_src = TIMER_SRC_CLK_XTAL;
  783. all_timer_init(&config, true);
  784. all_timer_set_alarm_value(1.2 * timer_scale);
  785. timer_intr_enable_disable_test(TIMER_GROUP_0, TIMER_0, 1.2 * timer_scale);
  786. timer_intr_enable_disable_test(TIMER_GROUP_1, TIMER_0, 1.2 * timer_scale );
  787. all_timer_isr_unreg();
  788. all_timer_deinit();
  789. }
  790. #endif
  791. /**
  792. * Timer ISR callback test
  793. */
  794. TEST_CASE("Timer ISR callback", "[hw_timer]")
  795. {
  796. alarm_flag = false;
  797. timer_config_t config = {
  798. .alarm_en = TIMER_ALARM_EN,
  799. .auto_reload = TIMER_AUTORELOAD_DIS,
  800. .counter_dir = TIMER_COUNT_UP,
  801. .divider = TIMER_DIVIDER,
  802. .counter_en = TIMER_PAUSE,
  803. .intr_type = TIMER_INTR_LEVEL,
  804. };
  805. uint32_t timer_scale = rtc_clk_apb_freq_get() / TIMER_DIVIDER;
  806. uint64_t alarm_cnt_val = 1.2 * timer_scale;
  807. uint64_t set_timer_val = 0x0;
  808. all_timer_init(&config, true);
  809. all_timer_pause();
  810. all_timer_set_alarm_value(alarm_cnt_val);
  811. all_timer_set_counter_value(set_timer_val);
  812. // add isr callback for tg0_timer0
  813. TEST_ESP_OK(timer_isr_callback_add(TIMER_GROUP_0, TIMER_0, test_timer_group_isr_cb,
  814. GET_TIMER_INFO(TIMER_GROUP_0, TIMER_0), ESP_INTR_FLAG_LOWMED));
  815. TEST_ESP_OK(timer_set_counter_value(TIMER_GROUP_0, TIMER_0, set_timer_val));
  816. TEST_ESP_OK(timer_start(TIMER_GROUP_0, TIMER_0));
  817. timer_isr_check(TIMER_GROUP_0, TIMER_0, TIMER_AUTORELOAD_DIS, alarm_cnt_val);
  818. TEST_ASSERT_EQUAL(true, alarm_flag);
  819. // remove isr callback for tg0_timer0
  820. TEST_ESP_OK(timer_pause(TIMER_GROUP_0, TIMER_0));
  821. TEST_ESP_OK(timer_isr_callback_remove(TIMER_GROUP_0, TIMER_0));
  822. alarm_flag = false;
  823. TEST_ESP_OK(timer_set_counter_value(TIMER_GROUP_0, TIMER_0, set_timer_val));
  824. TEST_ESP_OK(timer_start(TIMER_GROUP_0, TIMER_0));
  825. vTaskDelay(2000 / portTICK_PERIOD_MS);
  826. TEST_ASSERT_EQUAL(false, alarm_flag);
  827. // add isr callback for tg1_timer0
  828. TEST_ESP_OK(timer_pause(TIMER_GROUP_1, TIMER_0));
  829. TEST_ESP_OK(timer_isr_callback_add(TIMER_GROUP_1, TIMER_0, test_timer_group_isr_cb,
  830. GET_TIMER_INFO(TIMER_GROUP_1, TIMER_0), ESP_INTR_FLAG_LOWMED));
  831. TEST_ESP_OK(timer_set_counter_value(TIMER_GROUP_1, TIMER_0, set_timer_val));
  832. TEST_ESP_OK(timer_start(TIMER_GROUP_1, TIMER_0));
  833. timer_isr_check(TIMER_GROUP_1, TIMER_0, TIMER_AUTORELOAD_DIS, alarm_cnt_val);
  834. TEST_ASSERT_EQUAL(true, alarm_flag);
  835. // remove isr callback for tg1_timer0
  836. TEST_ESP_OK(timer_pause(TIMER_GROUP_1, TIMER_0));
  837. TEST_ESP_OK(timer_isr_callback_remove(TIMER_GROUP_1, TIMER_0));
  838. alarm_flag = false;
  839. TEST_ESP_OK(timer_set_counter_value(TIMER_GROUP_1, TIMER_0, set_timer_val));
  840. TEST_ESP_OK(timer_start(TIMER_GROUP_1, TIMER_0));
  841. vTaskDelay(2000 / portTICK_PERIOD_MS);
  842. TEST_ASSERT_EQUAL(false, alarm_flag);
  843. all_timer_deinit();
  844. }
  845. /**
  846. * Timer memory test
  847. */
  848. TEST_CASE("Timer memory test", "[hw_timer]")
  849. {
  850. timer_config_t config = {
  851. .alarm_en = TIMER_ALARM_EN,
  852. .auto_reload = TIMER_AUTORELOAD_EN,
  853. .counter_dir = TIMER_COUNT_UP,
  854. .divider = TIMER_DIVIDER,
  855. .counter_en = TIMER_PAUSE,
  856. .intr_type = TIMER_INTR_LEVEL,
  857. };
  858. for (uint32_t i = 0; i < 100; i++) {
  859. all_timer_init(&config, true);
  860. all_timer_deinit();
  861. }
  862. }
  863. // The following test cases are used to check if the timer_group fix works.
  864. // Some applications use a software reset, at the reset time, timer_group happens to generate an interrupt.
  865. // but software reset does not clear interrupt status, this is not safe for application when enable the interrupt of timer_group.
  866. // This case will check under this fix, whether the interrupt status is cleared after timer_group initialization.
  867. static void timer_group_test_init(void)
  868. {
  869. static const uint32_t time_ms = 100; // Alarm value 100ms.
  870. static const uint16_t timer_div = TIMER_DIVIDER; // Timer prescaler
  871. static const uint32_t ste_val = time_ms * (TIMER_BASE_CLK / timer_div / 1000);
  872. timer_config_t config = {
  873. .divider = timer_div,
  874. .counter_dir = TIMER_COUNT_UP,
  875. .counter_en = TIMER_PAUSE,
  876. .alarm_en = TIMER_ALARM_EN,
  877. .intr_type = TIMER_INTR_LEVEL,
  878. .auto_reload = TIMER_AUTORELOAD_EN,
  879. };
  880. TEST_ESP_OK(timer_init(TIMER_GROUP_0, TIMER_0, &config));
  881. TEST_ESP_OK(timer_set_counter_value(TIMER_GROUP_0, TIMER_0, 0x00000000ULL));
  882. TEST_ESP_OK(timer_set_alarm_value(TIMER_GROUP_0, TIMER_0, ste_val));
  883. //Now the timer is ready.
  884. //We only need to check the interrupt status and don't have to register a interrupt routine.
  885. }
  886. static void timer_group_test_first_stage(void)
  887. {
  888. static uint8_t loop_cnt = 0;
  889. timer_group_test_init();
  890. //Start timer
  891. TEST_ESP_OK(timer_enable_intr(TIMER_GROUP_0, TIMER_0));
  892. TEST_ESP_OK(timer_start(TIMER_GROUP_0, TIMER_0));
  893. //Waiting for timer_group to generate an interrupt
  894. while ( !(timer_group_get_intr_status_in_isr(TIMER_GROUP_0) & TIMER_INTR_T0) &&
  895. loop_cnt++ < 100) {
  896. vTaskDelay(200);
  897. }
  898. TEST_ASSERT_EQUAL(TIMER_INTR_T0, timer_group_get_intr_status_in_isr(TIMER_GROUP_0) & TIMER_INTR_T0);
  899. esp_restart();
  900. }
  901. static void timer_group_test_second_stage(void)
  902. {
  903. TEST_ASSERT_EQUAL(ESP_RST_SW, esp_reset_reason());
  904. timer_group_test_init();
  905. TEST_ASSERT_EQUAL(0, timer_group_get_intr_status_in_isr(TIMER_GROUP_0) & TIMER_INTR_T0);
  906. // After enable the interrupt, timer alarm should not trigger immediately
  907. TEST_ESP_OK(timer_enable_intr(TIMER_GROUP_0, TIMER_0));
  908. //After the timer_group is initialized, TIMERG0.int_raw.t0 should be cleared.
  909. TEST_ASSERT_EQUAL(0, timer_group_get_intr_status_in_isr(TIMER_GROUP_0) & TIMER_INTR_T0);
  910. }
  911. TEST_CASE_MULTIPLE_STAGES("timer_group software reset test",
  912. "[intr_status][intr_status = 0]",
  913. timer_group_test_first_stage,
  914. timer_group_test_second_stage);
  915. //
  916. // Timer check reinitialization sequence
  917. //
  918. TEST_CASE("Timer check reinitialization sequence", "[hw_timer]")
  919. {
  920. // 1. step - install driver
  921. timer_group_test_init();
  922. // 2 - register interrupt and start timer
  923. TEST_ESP_OK(timer_enable_intr(TIMER_GROUP_0, TIMER_0));
  924. TEST_ESP_OK(timer_start(TIMER_GROUP_0, TIMER_0));
  925. // Do some work
  926. vTaskDelay(80 / portTICK_PERIOD_MS);
  927. // 3 - deinit timer driver
  928. TEST_ESP_OK(timer_deinit(TIMER_GROUP_0, TIMER_0));
  929. timer_config_t config = {
  930. .divider = TIMER_DIVIDER,
  931. .counter_dir = TIMER_COUNT_UP,
  932. .counter_en = TIMER_START,
  933. .alarm_en = TIMER_ALARM_EN,
  934. .intr_type = TIMER_INTR_LEVEL,
  935. .auto_reload = TIMER_AUTORELOAD_EN,
  936. };
  937. // 4 - reinstall driver
  938. TEST_ESP_OK(timer_init(TIMER_GROUP_0, TIMER_0, &config));
  939. // 5 - enable interrupt
  940. TEST_ESP_OK(timer_enable_intr(TIMER_GROUP_0, TIMER_0));
  941. vTaskDelay(30 / portTICK_PERIOD_MS);
  942. // The pending timer interrupt should not be triggered
  943. TEST_ASSERT_EQUAL(0, timer_group_get_intr_status_in_isr(TIMER_GROUP_0) & TIMER_INTR_T0);
  944. }