杰理AC695创建100us的定时器
695最小只有1ms精度的定时器接口,如果要更小的需要自己写
创建定时器
void timer3_100us(void) // 选择LSB的时钟源后, 初始化后系统不能切换频率
{
log_info("%s[%d]", __func__, clk_get("lsb"));
u32 prd_cnt;
/* prd_cnt = clk_get("lsb") / 1000 / 4 / 10 * 1;//需要几倍就改最后1 */
prd_cnt = 24 * 1000000 / 1000 / 4 / 10 * 1;//需要几倍就改最后1
log_info("%s[0x%08x]", __func__, prd_cnt);
request_irq(IRQ_TIME3_IDX, 6, timer3_isr, 0);
/* irq_unmask_set(IRQ_TIME3_IDX, 0); */
//const int CONFIG_CPU_UNMASK_IRQ_ENABLE = 1;
JL_TIMER3->CNT = 0;
JL_TIMER3->PRD = prd_cnt;
/* JL_TIMER3->CON = (1 << 4) | (1 << 0);//lsb clk 4分频 */
JL_TIMER3->CON = (1 << 4) | (0b10 << 2) | (1 << 0);//OSC clk 4分频
timer_idle = 0;
jiffies_timer = 0;
}
定时器中断
/********************************************************
* 下面函数调用的使用函数都必须放在ram,
* 中断频率小于1ms的,
* 都建议加AT_VOLATILE_RAM_CODE,将代码指定到ram
* 建议在100us中断内只赋值变量或者操作gpio,否则会影响蓝牙性能
/********************************************************/
static volatile unsigned long jiffies_timer; // unit: 100us
___interrupt
AT_VOLATILE_RAM_CODE
static void timer3_isr()
{
JL_TIMER3->CON |= BIT(14);
jiffies_timer++;
if(jiffies_timer > 24 * 60 * 60 * 10){
jiffies_timer = 0;
// 超一天计时, 清0
}
static u8 flag = 0;
if(flag){ // 拉IO示波器量波形
flag = 0;
/* gpio_set_output_value(IO_PORTC_02, 0); */
JL_PORTC->OUT &= ~BIT(2);
}else{
flag = 1;
/* gpio_set_output_value(IO_PORTC_02, 1); */
JL_PORTC->OUT |= BIT(2);
}
}