注册 登录
查看: 251|回复: 2

山外哥,帮看看这个us延时函数放到旧版库有没有问题

[复制链接]
发表于 2014-4-24 01:23:15 | 显示全部楼层 |阅读模式
void time_delay_us(uint16 us)
{
    ASSERT( ( (us * MCG_CLK_MHZ + 16) /  32 )  <= 0xFFFF );    //断言,确保寄存器不溢出
    //us * 晶振频率  /32 <= 0xFFFF
    //除以 32 ,是下面的计数进行了 分频
    //加上 16是为了 四舍五入

    if(us == 0)
    {
        return;
    }
    OSC_CR |= OSC_CR_ERCLKEN_MASK;                              //使能 OSCERCLK
    SIM_SCGC5 |= SIM_SCGC5_LPTIMER_MASK;                        //使能LPT模块时钟

    LPTMR0_CSR = 0x00;                                          //先关了LPT,自动清计数器的值

    LPTMR0_CMR = (us * MCG_CLK_MHZ + 16) / 32;                 //设置比较值,即延时时间

    //选择时钟源
    LPTMR0_PSR  =   ( 0
                      | LPTMR_PSR_PCS(3)          //选择时钟源: 0 为 MCGIRCLK ,1为 LPO(1KHz) ,2为 ERCLK32K ,3为 OSCERCLK
                      //| LPTMR_PSR_PBYP_MASK     //旁路 预分频/干扰滤波器 ,即不用 预分频/干扰滤波器(注释了表示使用预分频/干扰滤波器)
                      | LPTMR_PSR_PRESCALE(4)     //预分频值 = 2^(n+1) ,n = 0~ 0xF
                    );

    //使能 LPT
    LPTMR0_CSR  =  (0
                    //| LPTMR_CSR_TPS(1)        // 选择输入管脚 选择
                    //| LPTMR_CSR_TMS_MASK      // 选择脉冲计数 (注释了表示时间计数模式)
                    //| ( cfg == LPT_Falling ?  LPTMR_CSR_TPP_MASK :   0  )  //脉冲计数器触发方式选择:0为高电平有效,上升沿加1
                    | LPTMR_CSR_TEN_MASK        //使能LPT(注释了表示禁用)
                    //| LPTMR_CSR_TIE_MASK      //中断使能
                    //| LPTMR_CSR_TFC_MASK      //0:计数值等于比较值就复位;1:溢出复位(注释表示0)
                   );

    while (!(LPTMR0_CSR & LPTMR_CSR_TCF_MASK)); //等待比较值与计数值相等,即时间到了

    LPTMR0_CSR &= ~LPTMR_CSR_TEN_MASK;          //清除比较标志位

    return;
}
来自PC客户端 来自PC客户端
回复

使用道具 举报

发表于 2014-4-24 07:36:38 | 显示全部楼层
看不懂,都是寄存器操作。
回复 支持 反对

使用道具 举报

发表于 2014-6-6 21:19:46 | 显示全部楼层
你的US延时搞定了么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部