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