在线时间57 小时
UID3095278
注册时间2015-8-6
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 355
- 最后登录
- 2019-1-28
|
大家好,我现在想用LPTMR模块设计成一个精确的延时函数,我对LPTMR的相关寄存器做了如下配置:
void time_delay_ms(unsigned int count_val)
{
SIM_SCGC5 |= SIM_SCGC5_LPTIMER_MASK; //打开LPTMR的门控时钟
LPTMR0_CSR = 0x00; //先关闭LPT,自动清计数器的值
MCG_C1 |= MCG_C1_IRCLKEN_MASK; //使能内部参考时钟供给MCGIRCLK,MCGIRCLK时钟活跃
MCG_C2 |= MCG_C2_IRCS_MASK; //使能内部快速参考时钟(2MHz),若MCG_C2[IRCS]=0表示使能内部慢速参考时钟(32K)
LPTMR0_CMR = LPTMR_CMR_COMPARE(count_val); //设置LPTMR比较寄存器的数值
LPTMR0_PSR |= (LPTMR_PSR_PCS(0) | LPTMR_PSR_PBYP_MASK); //分频器时钟选择0,表示时钟源为MCGIRCLK,分频参数0x8表示512分频
//LPTMR_PSR_PCS(0):MCGIRCLK作为分频器的时钟源
//LPTMR_PSR_PCS(1):LPO(1KHz)作为分频器的时钟源
//LPTMR_PSR_PCS(2):ERCLK32K作为分频器时钟源
//LPTMR_PSR_PCS(3):OSCERCLK作为分频器的时钟源
LPTMR0_CSR &= ~LPTMR_CSR_TMS_MASK; //LPTMR工作在定时器计数模式
LPTMR0_CSR |= LPTMR_CSR_TEN_MASK; //LPTMR使能
while(!(LPTMR0_CSR & LPTMR_CSR_TCF_MASK)){;} //等待计数器达到比较值
LPTMR0_CSR &= ~LPTMR_CSR_TEN_MASK; //LPTMR禁止
return;
}
通过如上配置,lptmr的时钟为2MHZ,再根据定时计算公式,
可得,当调用time_delay_ms(1);函数时为延时1us,我在主函数中这样写:
while(1)
{
DrvGPIO_Open(PORTD, 15, GPIO_OUTPUT, 0);
time_delay_ms(1);
DrvGPIO_Open(PORTD, 15, GPIO_OUTPUT, 1);
time_delay_ms(1);
}
但是,我用示波器却抓不到波形,单步调试了下,发现程序死在这一句
while(!(LPTMR0_CSR & LPTMR_CSR_TCF_MASK)){;} //等待计数器达到比较值
找了一天,也没找出原因,希望大家给指点一下,多谢!
|
|