在线问答
直播中

dvd1478

11年用户 586经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表 嵌入式技术 制造/封装 模拟技术 连接器 EMC/EMI设计 光电显示 存储技术 EDA/IC设计 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注

【OK210试用体验】裸奔TIMER&PWM&蜂鸣器

S5PV210_UM_REV1.1.pdf
section 07_timer
1 PULSE WIDTH MODULATION TIMER
S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。
1.jpg
S5PV210的PWM定时器的相关I/O:
2.png
3.png 4.jpg
      对于定时器,当然需要对时钟的配置,具体的配置可看帖子或者看datasheet的system章的CLOCK节。在S5PV210的PWM TIMER中有介绍到时钟的相关情况还有计算等: 5.jpg 6.jpeg
程序编写思路
配置PWM TIMER,新增timer_init部分,对于interrupt部分的作用还是很重要,是根基。 7.jpeg
      配置思路:
            1. 计算定时器的输入时钟:Timer Input Clock Frequency = PCLK / ( {prescaler value + 1} ) / {divider value}
            2. 设置预分频系数
            3. 设置TCON
            4. 装载TCNTB、TCMPB0
            5. 使能中断 TINT_CSTAT
2) OK210 硬件
8.png
9.png
3)代码如下:
void init_clock(void)
{
     CLK_SRC0 = 0x0;// close PLL
     APLL_LOCK= 0x0000FFFF;
     MPLL_LOCK = 0x0000FFFF;   
     // set PLL
     APLL_CON0 =APLL_VAL;//FOUT= MDIV * FIN / (PDIV*2^(SDIV-1)) = 1000 MHz
     MPLL_CON = MPLL_VAL;// FOUT = MDIV*FIN/(PDIV*2^SDIV)=667 MHz
     CLK_SRC0= 0x10001111;// FOUT = MDIV*FIN/(PDIV*2^SDIV)=667 MHz
}
void init_timer(unsigned long tcntb,unsigned long tcmpb)
{
TCON = 0;
TCFG0= (TCFG0 & ~0xff00ff)|0x41;//设置预分频系数65
TCFG1 =(TCFG1 & ~(0xf<<0))|0x04;// 16分频  输入时钟= PCLK /(prescaler+ 1) /divider =62500hz
TCNTB0 = tcntb;
TCMPB0 = tcmpb;
TCON |= 1<<1;// 更新TCNTB0 TCMPB0
TCON &= ~(1<<1);// 清手动更新位
TCON |= (1<<0)|(1<<3);// 选择自动加载并启动timer0
//TINT_CSTAT |= 1;
}
static void Delay(long count)
{
     volatile int i, j = 0;
     volatile static int loop = 800000000/10000;
     for(;count > 0;count--)
         for(i=0;i < loop; i++) { j++; }
}
void main(void)
{
    GPD0CON = (GPD0CON & ~(0xF << 0))|0x2;
    MP0_4CON= (MP0_4CON & ~0xFFFF0000) | 0x11110000;
    MP0_4DAT|= 0xF0;
    init_clock();//初始化时钟
    init_timer(62500,40000);//初始wttimer                                 
    while(1)
    {
    }
    //TCON = 0;
}

更多回帖

发帖
×
20
完善资料,
赚取积分