杰理AC692X-PWM设置

最近在学习杰理AC692X,将收获及遇到的一些问题写成博客,方便以后工作中使用
感谢Jim_天河博主的资料,参考博客杰理AC692X—三路定时器PWM

1、默认的 TIMER 对应的 PWM 输出的 IO 口,
PWM0–TIMER0–PA1
PWM1–TIMER1–PA4
PWM2–TIMER2–PB3
PWM3–TIMER3–PB4
2、由于 TIMER0 作系统时钟,所以最多可以输出 3 路 PWM,而且 3 路 PWM 可以通过 OUTPUTCHANNEL
输出到任意的 IO 口上,项目需要使用PWM输出,控制LED灯,原理图板上选择了PWM3默认IO口PB4输出
占空比 N = (Tx_PWM / Tx_PR)*100%

//初始化
static void pwm3_init(u32 fre, u8 duty)
{
    // SFR(JL_IOMAP->CON1, 8, 4, 15);// IO映射,CON1对应通道0  不使用IO映射
    JL_TIMER3->CON = 0x0000;
    JL_TIMER3->PRD = OSC_Hz / (4 * fre);
    JL_TIMER3->PWM = (JL_TIMER3->PRD * duty) / 100;
    JL_TIMER3->CON = (1 << 4) | (1 << 8) | (1 << 0) | (2 << 2);//(1 << 4) 分频2  (1 << 8) 使能PWM  (1 << 0) 定时器计数模式 (2 << 2)OSC作为时钟源
    JL_PORTB->PU |= BIT(4);   //使用默认IO口
    JL_PORTB->DIR &= ~BIT(4);
}
void pwm3_duty_set(u8 duty)
{
    JL_TIMER3->PWM = (JL_TIMER3->PRD * duty) / 100;
}

如果选择映射到其他IO口(参考博客)

static void set_timer3_pwm(u32 fre, u8 duty)
{
SFR(JL_IOMAP->CON1, 8, 4, 15);// CHANNEL0, 对应输出 IO 口的 OUT:0,DIE:0    //通道0
//SFR(JL_IOMAP->CON3, 20, 4, 3);//CHANNEL1, 对应输出 IO 口的 OUT:0,DIE:1   //通道1
//SFR(JL_IOMAP->CON3, 24, 4, 14);//CHANNEL2,对应输出 IO 口的 OUT:1,DIE:0   //通道2
JL_TIMER3->CON = 0x0000;
JL_TIMER3->PRD = OSC_Hz / (4 * fre);
JL_TIMER3->PWM = (JL_TIMER3->PRD * duty) / 100;
JL_TIMER3->CON = (1 << 4) | (1 << 8) | (1 << 0) | (2 << 2);
JL_PORTA->PU |= BIT(13);    //映射的IO口 要注意OUT:0,DIE:0的配置 
JL_PORTA->PD |= BIT(13);
JL_PORTA->DIR &= ~BIT(13);
JL_PORTA->OUT &= ~BIT(13);
JL_PORTA->DIE &= ~BIT(13);
}
————————————————
版权声明:本文为CSDN博主「Jim_天河」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JaLLs/article/details/87971260

3、寄存器说明
对应的寄存器 对应的 IO 口的 OUT 和 DIE
OUTPUTCHANNLE0 IOMC1 的 8~11 位 00
OUTPUTCHANNLE1 IOMC3 的 20~23 位 01
OUTPUTCHANNLE2 IOMC3 的 24~27 位 10
OUTPUTCHANNLE3 IOMC3 的 28~31 位 11
4、配置好后下载到开发板上还是不能输出PWM,查找一段时间之后发现,SDK在timer.c文件下默认启动了timer3,屏蔽之后就可以

void timer_init(void (*isr_fun)(void))
{
    printf("timer_init\n");    
    sys_timer_var_init() ;  //major use in bluetooth
    timer0_init();
    //timer3_init();
}

5、测试demo

void led_test(void)
{
    static u8 duty = 50;
    u8 test = 0;
    printf("led_test\n");  
    extern void close_wdt(void);
    close_wdt();
    extern void delay(u32 d);
    printf("LED_INIT_EN();\n");  
    set_timer3_pwm(500L, 50);
    // LED_INIT_EN();
    while (1) {  
      //printf("PWM_Duty = %d\n",duty);  
       led_pwm3_set(duty); 
       delay(500000);
       if (test){
          duty--;
          if (0 == duty) test = 0;
       } else {
          duty++;
          if (99 == duty) test = 1;
       }
    }
}

你可能感兴趣的:(杰理AC692x学习)