test_timer.c 35 KB

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