53 lines
1.5 KiB
C
53 lines
1.5 KiB
C
static void timer_cfg(u32 freq, u32 us)
|
||
{
|
||
JL_TIMER_TypeDef *TMR = JL_TIMER4;//选择定时器4
|
||
u8 timer_irq = IRQ_TIMER4_IDX;//选择定时器4
|
||
const u8 timer_index[16] = {0, 4, 1, 5, 2, 6, 3, 7, 8, 12, 9, 13, 10, 14, 11, 15};
|
||
const u32 timer_table[16] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768};
|
||
u32 clock = clk_get("timer");
|
||
u8 psc = 0;
|
||
u8 tmp = 0;
|
||
u32 prd = 0;
|
||
u32 ts = us / (1000 * 1000);//计算秒
|
||
u32 tu = us % (1000 * 1000);//计算秒剩余us
|
||
u8 i;
|
||
float tp = 0;
|
||
|
||
if (freq >= clock) {
|
||
freq = clock;
|
||
} else if (freq <= 1) {
|
||
freq = 1;
|
||
if (ts) {
|
||
tp = (float)tu / (1000 * 1000);
|
||
}
|
||
}
|
||
/*求prd值*/
|
||
prd = clock / freq;
|
||
if (prd > 65535) {
|
||
for (psc = 0; psc < 16; psc++) {
|
||
prd = (u32)(clock / (timer_table[psc]) / freq);
|
||
if (prd <= 65535) {
|
||
break;
|
||
} else if (psc == 15) {
|
||
prd = 65535;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
prd = ts ? (prd * ts + tp * prd) : prd;
|
||
psc = timer_index[psc];
|
||
TMR->CON = 0;
|
||
TMR->CNT = 0;
|
||
TMR->CON |= BIT(14);
|
||
TMR->PRD = prd;
|
||
TMR->CON |= psc << 4; //lsb_clk分频
|
||
TMR->CON |= BIT(0);
|
||
while (!(TMR->CON & BIT(15)));
|
||
TMR->CON |= BIT(14);
|
||
TMR->CON = 0;
|
||
}
|
||
void time_delay(u32 us)//设置时间
|
||
{
|
||
u32 freq = 1000000 / us;
|
||
timer_cfg(freq, us);//传参:当只需要设置频率,则us = 0
|
||
} |