#include "t21_t8.h" #include "led.h" volatile unsigned char timer_cnt; extern volatile int motor_jerk_state; int32_t wait_send_to_motor_time1s=0; int32_t recv_motor_data_time=0; int32_t recv_lcd_data_time=0; int32_t inquire_error_time=0; volatile uint32_t g_ticket100us = 0;//一直再记录过去的时间 /** * @brief 32M的情况下初始化时钟1作为ticket源 * */ void init_timer1_as_ticketustimer_in32M() { // T11M /** * @brief * 设定时钟为1ms一次中断 * T11CM = 0x0f 16分频 = 2MHZ * T11CH = 0 后分频0 * T11PH T11PL = 200 //100us * T11PH = 0x07 * T11PL = 0xD0 */ T11CL = 0x00; //定时器模式 T11CM = 0x0F; //预分频1:16 //最大1:16 T11CH = 0x00; //后分频次数0+1 static_assert(configTicketUs <= 10000 && configTicketUs >= 100); uint16_t count = 2000 / 1000 * configTicketUs; T11PH = count >> 8; //周期值高8位 T11PL = count & 0xFF; // 200 T11VIE = 1; //打开T11溢出中断 T11VIF = 0; //清标志位 T11EN = 1; //使能T11 } int32_t clear_time() { if(wait_send_to_motor_time1s>=UINT32_MAX) { wait_send_to_motor_time1s=0; } if(recv_motor_data_time>=UINT32_MAX) { recv_motor_data_time=0; } if(g_ticket100us>=UINT32_MAX) { g_ticket100us=0; } if(recv_lcd_data_time>=UINT32_MAX) { recv_lcd_data_time=0; } if(inquire_error_time>=UINT32_MAX) { inquire_error_time=0; } } uint32_t hal_has_passed_ticket(uint32_t lastticket) { uint32_t now = g_ticket100us; if (now >= lastticket) { return now - lastticket; } else { return UINT32_MAX - lastticket + now; } } uint32_t hal_has_passedms(uint32_t lastticket) { /** * 根据ticket的数值进行修改. */ static_assert(configTicketUs == 1000); return hal_has_passed_ticket(lastticket); } int32_t hal_get_ticket() { return g_ticket100us; } int32_t hal_get_irqticket() { return g_ticket100us; } int32_t sleep_ms(int32_t time) { /** * @brief ms级的延时 * */ int32_t tickstart = hal_get_ticket(); int32_t wait =time; while(hal_get_ticket()-tickstart