123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #include "include.h"
- #if 0
- ///软件timer capture示例
- #define TMR3_RCLK (1000*cfg_bt_tws_tick_freq)
- //timer3 capture
- AT(.com_text.tmr.isr)
- void timer3_isr(void)
- {
- u32 tmrcnt;
- if (TMR3CON & BIT(10)) { //timer3 capture interrupt
- TMR3CNT = TMR3CNT - TMR3CPT;
- tmrcnt = TMR3CPT; //capture value
- TMR3CPND = BIT(10);
- tmrcnt /= TMR3_RCLK; //convert to ms
- } else if (TMR3CON & BIT(9)) { //timer3 overflow interrupt
- TMR3CPND = BIT(9);
- tmrcnt = 110; //110ms overflow
- } else {
- return;
- }
- // irrx_sw_isr(tmrcnt);
- }
- #define IR_CAPTURE_PORT() {GPIOEDE |= BIT(4); GPIOEPU |= BIT(4); GPIOEDIR |= BIT(4);}
- #define TMR3CAP_MAPPING TMR3MAP_PE4
- AT(.text.tmr.init)
- void timer3_init(void)
- {
- IR_CAPTURE_PORT();
- FUNCMCON2 = TMR3CAP_MAPPING;
- sys_irq_init(IRQ_TMR3_VECTOR, 0, timer3_isr);
- TMR3CNT = 0;
- TMR3PR = TMR3_RCLK*110 - 1; //110ms Timer overflow interrupt
- TMR3CON = BIT(8) | BIT(7) | BIT(5) | BIT(3)| BIT(2) | BIT(1) | BIT(0); //capture & overflow interrupt enable, falling edge, Capture Mode
- }
- #endif
- //软件timer timer-mode示例:timer3 time-mode
- //AT(.com_rodata.isr)
- //const char str_t3[] = " -------------- T3 --------------\n";
- //
- //AT(.com_text.isr)
- //void timer3_isr(void) //timer3中断函数
- //{
- // if (TMR3CON & BIT(9)) { //overflow Pending
- // TMR3CPND = BIT(9);
- // my_printf(str_t3);
- // }
- //}
- //
- ///*****************************************************************************
- // * 功能 : 配置timer3计时模式
- // * 注意 : TMRCON3 bit[6:4]为分频系数, 001:div2, 010:div4,..., 110:div64 至少配1;
- // TMRCON3 bit7:计数模式, 触发计数中断; bit8:捕捉模式,触发捕捉中断;
- // 中断触发函数timer3_isr, 整个函数都要放在公共区;
- // * 返回 : 无
- // *****************************************************************************/
- //void timer3_init(void)
- //{
- // CLKGAT0 |= BIT(3); //timer3 clkgat 要放在最前面
- // asm("nop");asm("nop");
- // asm("nop");asm("nop");
- //
- // u8 div_sel = 2; //对应BIT4
- // u32 tim3pr_1s = 24000000 / div_sel - 1; //1s对应的CNT
- // TMR3CON = 0;
- // TMR3CON |= BIT(4) | BIT(2); //BIT2:Timer clk select xosc24mhz; BIT(4):prepare clk div2
- //
- // TMR3CNT = 0;
- // TMR3PR = tim3pr_1s / 2; //示例500ms
- // TMR3CON |= BIT(7); //Timer works in Timer Mode,Timer overflow interrupt enable
- // TMR3CON |= BIT(0); //Timer enable
- // sys_irq_init(IRQ_TMR3_VECTOR, 0, timer3_isr);
- //}
- ///PWM 呼吸灯示例
- //void timer5_pwm2_g2_pb4(void)
- //{
- // printf("timer5_pwm2_g2_pb4\n");
- // //初始化io
- // GPIOBDIR &= ~BIT(4);
- // GPIOBDE |= BIT(4);
- // GPIOBFEN |= BIT(4);
- // //选择功能映射io
- // FUNCMCON1 = (2 << 16);
- //
- // //开启时钟源
- // CLKGAT0 |= BIT(5);
- // asm("nop");asm("nop");
- // asm("nop");asm("nop");
- // TMR5CON = BIT(20);
- // TMR5CON |= (1 << 4) | BIT(2);
- //
- // //填写timer的pr值;此示例选择的是24mhz时钟源,即1s内 timer_cnt会自增 23999999次;
- // //当timer_cnt自增值达到pr时,则timer_cnt会重新置1,再继续自增;
- // //当pr填 24000000 / 500 - 1,意味着timer_cnt 自增到该pr值,则恢复1,即1s内会进行500次循环 =>500hz
- // u32 tim5pr = 24000000 / 500 - 1;
- // TMR5PR = tim5pr/2; //500hz
- // TMR5CNT = 1;
- // //开启timer和pwm2,1s内,500次去读占空比和推出占空比的高电平
- // TMR5CON |= BIT(0);
- // //初始化占空比为0,在5ms中断里,会继续修改此占空比
- //// TMR5DUTY2 = 0;
- // TMR5DUTY2 = tim5pr/4; //示例:50%占空比
- //}
- //
- //#define DUTY_STEP (48000 /200) //调整呼吸灯步进,分子固定 (24000000 / 500),增大分母,占空比则步进增大
- //AT(.com_text.timer)
- //void breath_led_scan(void) //调整呼吸灯频率,放到5ms中断就跑的更快,20ms中断就慢一些,和步进配合决定效果
- //{
- // static bool dir_up = true; //判断呼还是吸
- // static u32 duty = 0; //当前输出高平的带宽
- //
- // if (dir_up) { //开始吸
- // duty += DUTY_STEP;
- // if (duty > 48000) {
- // dir_up = false;
- // duty = 48000;
- // }
- // } else {
- // if (duty > DUTY_STEP) { //开始呼
- // duty -= DUTY_STEP;
- // } else {
- // duty = 0;
- // dir_up = true;
- // }
- // }
- // TMR5DUTY2 = duty;
- //}
|