#include "board.h" #include "hpm_gptmr_drv.h" // #include "soft_time.h" #include "hard_system_timer.h" #include "test.h" // 后续要设置定时器分频 一个定时器可以配置4个通道,每个通道的计数重装载值可以不同 由于定时器太多了 就不用同一个了 // 共享同一个硬件模块、时钟源、中断向量 每个通道的配置、计数器、比较值、工作模式都是独立的 #define SYSTEM_TIMER_1 HPM_GPTMR1 #define SYSTEM_TIMER_1_CLK_NAME clock_gptmr1 #define SYSTEM_TIMER_1_CH 0 #define SYSTEM_TIMER_1_IRQ IRQn_GPTMR1 #define SYSTEM_TIMER_1_TICK_US (1) #define SYSTEM_TIMER_1_RELOAD 2500 void system_timer_init(void) { uint32_t gptmr_freq; gptmr_channel_config_t config; clock_set_source_divider(SYSTEM_TIMER_1_CLK_NAME, clk_src_osc24m, 24); // 1Mhz clock_add_to_group(SYSTEM_TIMER_1_CLK_NAME, 0); // 添加到组 gptmr_freq = clock_get_frequency(SYSTEM_TIMER_1_CLK_NAME); printf("timer1 fre: %d\r\n", gptmr_freq); gptmr_channel_get_default_config(SYSTEM_TIMER_1, &config); config.reload = SYSTEM_TIMER_1_RELOAD; // 32bit timer1 2.5ms gptmr_channel_config(SYSTEM_TIMER_1, SYSTEM_TIMER_1_CH, &config, false); gptmr_start_counter(SYSTEM_TIMER_1, SYSTEM_TIMER_1_CH); gptmr_enable_irq(SYSTEM_TIMER_1, GPTMR_CH_RLD_IRQ_MASK(SYSTEM_TIMER_1_CH)); intc_m_enable_irq_with_priority(SYSTEM_TIMER_1_IRQ, 1); } extern void timer_hookfunction(void); static uint32_t s_count = 0; SDK_DECLARE_EXT_ISR_M(SYSTEM_TIMER_1_IRQ, timer1_250us_isr) void timer1_250us_isr(void) { if (gptmr_check_status(SYSTEM_TIMER_1, GPTMR_CH_RLD_STAT_MASK(SYSTEM_TIMER_1_CH))) { gptmr_clear_status(SYSTEM_TIMER_1, GPTMR_CH_RLD_STAT_MASK(SYSTEM_TIMER_1_CH)); // timer_hookfunction(); s_count++; } } /*timer1 test 2026/3/14 测试通过*/ #ifdef TIMER1_TEST #include "bsp_V8M_YY_led.h" void timer1_test(void) { system_timer_init(); v8m_yy_led_init(); // 注:如果while(1)轮询太快可能导致401中断触发变灯 然后下一次中断没触发呢 又扫过来了再次进入应用 也就是1个周期触发两次 // 实际while(1)的运行一次的时间要大于中断1次的时间最好 也就是2.5ms while(1) { if(s_count % 400 == 1) { board_delay_ms(3); v8m_yy_led_toggle(V8M_YY_LED_R); printf("s_count %d\r\n", s_count); printf("1000ms \r\n"); } } } /* 异常 s_count 7201 1000ms s_count 7201 1000ms 正常 s_count 17602 1000ms */ #endif