123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #include "ets_sys.h"
- #include "os_type.h"
- #include "osapi.h"
- #define US_TO_RTC_TIMER_TICKS(t) \
- ((t) ? \
- (((t) > 0x35A) ? \
- (((t)>>2) * ((APB_CLK_FREQ>>4)/250000) + ((t)&0x3) * ((APB_CLK_FREQ>>4)/1000000)) : \
- (((t) *(APB_CLK_FREQ>>4)) / 1000000)) : \
- 0)
- #define FRC1_ENABLE_TIMER BIT7
- #define FRC1_AUTO_LOAD BIT6
- typedef enum {
- DIVDED_BY_1 = 0,
- DIVDED_BY_16 = 4,
- DIVDED_BY_256 = 8,
- } TIMER_PREDIVED_MODE;
- typedef enum {
- TM_LEVEL_INT = 1,
- TM_EDGE_INT = 0,
- } TIMER_INT_MODE;
- typedef enum {
- FRC1_SOURCE = 0,
- NMI_SOURCE = 1,
- } FRC1_TIMER_SOURCE_TYPE;
- void hw_timer_arm(u32 val)
- {
- RTC_REG_WRITE(FRC1_LOAD_ADDRESS, US_TO_RTC_TIMER_TICKS(val));
- }
- static void (* user_hw_timer_cb)(void) = NULL;
- void hw_timer_set_func(void (* user_hw_timer_cb_set)(void))
- {
- user_hw_timer_cb = user_hw_timer_cb_set;
- }
- static void hw_timer_isr_cb(void)
- {
- if (user_hw_timer_cb != NULL) {
- (*(user_hw_timer_cb))();
- }
- }
- void ICACHE_FLASH_ATTR hw_timer_init(FRC1_TIMER_SOURCE_TYPE source_type, u8 req)
- {
- if (req == 1) {
- RTC_REG_WRITE(FRC1_CTRL_ADDRESS,
- FRC1_AUTO_LOAD | DIVDED_BY_16 | FRC1_ENABLE_TIMER | TM_EDGE_INT);
- } else {
- RTC_REG_WRITE(FRC1_CTRL_ADDRESS,
- DIVDED_BY_16 | FRC1_ENABLE_TIMER | TM_EDGE_INT);
- }
- if (source_type == NMI_SOURCE) {
- ETS_FRC_TIMER1_NMI_INTR_ATTACH(hw_timer_isr_cb);
- } else {
- ETS_FRC_TIMER1_INTR_ATTACH(hw_timer_isr_cb, NULL);
- }
- TM1_EDGE_INT_ENABLE();
- ETS_FRC1_INTR_ENABLE();
- }
- #if 0
- void hw_test_timer_cb(void)
- {
- static uint16 j = 0;
- j++;
- if ((WDEV_NOW() - tick_now2) >= 1000000) {
- static u32 idx = 1;
- tick_now2 = WDEV_NOW();
- os_printf("b%u:%d\n", idx++, j);
- j = 0;
- }
-
- }
- void ICACHE_FLASH_ATTR user_init(void)
- {
- hw_timer_init(FRC1_SOURCE, 1);
- hw_timer_set_func(hw_test_timer_cb);
- hw_timer_arm(100);
- }
- #endif
|