You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
#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<wait) { } } void hal_ticket_inc() { g_ticket100us++; wait_send_to_motor_time1s++; recv_motor_data_time++; recv_lcd_data_time++; inquire_error_time++; }
void system_module_process_interrupt() { /**
* @brief 定时器中断11中断处理 */ if (T11VIE == 1 && T11VIF == 1) //定时器溢出中断
{ hal_ticket_inc(); T11VIF = 0; //清标志位
} }
|