test_timer.c 36 KB

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