在线时间162 小时
UID2030867
注册时间2013-8-4
NXP金币0
TA的每日心情 | 奋斗 2016-11-29 19:14 |
---|
签到天数: 4 天 连续签到: 1 天 [LV.2]偶尔看看I
金牌会员
 
- 积分
- 1529
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2015-11-2 20:15:53
|
显示全部楼层
本帖最后由 blue_blue 于 2015-11-2 22:33 编辑
谢谢你的帮助!我之前是这样想的,使用TPM延时,并没有必要在输出的TPM端口输出电平,那就使用Software compare呗!但是不能实现功能!然后我按你说的也改过了通过输出比较的方式,也加上了一些必要的设置,比如你说的ELSnB ELSnA位以及IO端口的功能选择!但是我发现TPM还是无法实现功能,无法延时!然后我在while中,while之前,以及清除标志位后,都将TPM0_C0SC打印出来,查看CHF位,接着就知道原因了!CHF位一直是被置位的(为1),那为什么,我无法擦除标志位了?然后我又换了一下TPM_STATUS_CH0F,在擦除前后对这一位进行查看,但是还是一样没有擦除!那问题出在哪儿了!难道是初始化错了!或者说擦除的方式错了!或是更新TPM0_C0V 的方式有问题!但是我清楚的记得,向标志位写1就可以清除标志位的!void tpmInit (void)
{
SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK | SIM_SOPT2_TPMSRC(1); /* MCGPLLCLK/2 = 24M */
SIM_SCGC6 |= SIM_SCGC6_TPM0_MASK; //tpm0 clock enable
SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK;
PORTE_PCR24 |= PORT_PCR_MUX(3); /* TPM0_CH0*/
TPM0_CNT = 0; // 24M/18750/128 = 10 hz
TPM0_MOD = 0X493e; // 18750
TPM0_C0SC = TPM_CnSC_MSA_MASK|TPM_CnSC_ELSA_MASK;
TPM0_SC |= TPM_SC_PS(7); //prescaler= 128
TPM0_SC |= TPM_SC_CMOD(1); //start
printf("%x 00000\r\n",TPM0_C0SC);
}
void tpm_delay (void)
{
TPM0_SC = TPM_SC_CMOD(0); //stop tpm0,then refresh TPM0_C0V
TPM0_C0V = TPM0_CNT + 1000;
TPM0_SC = TPM_SC_PS(7)|TPM_SC_CMOD(1); //start
printf("%x 111\r\n",TPM0_C0SC);
while((TPM0_C0SC&((uint32_t)TPM_CnSC_CHF_MASK)) != (uint32_t)TPM_CnSC_CHF_MASK)
{
printf("%x 222\r\n",TPM0_C0SC);
}
TPM0_C0SC = TPM0_C0SC&(uint32_t)0xff;
printf("%x 333\r\n",TPM0_C0SC);
}
除此之外,不在tpm_delay 中更新TPM0_C0V 的值,而在tpmInit 中初始化,这样尝试之后,TPM0_C0SC 的CHF位是可以擦除的,但是延时的时间有出问题了,不管我在tpmInit 中初始化 TPM0_C0V = TPM0_CNT + 1000;或 TPM0_C0V = TPM0_CNT + 5000;延时的时间都比较短。while中打印的数字222的次数都是一样的!然后我尝试使用PIT Module进行延时,PIT模块能准确的延时!但是KL26得PIT资源是有限的,在PIT的资源用完的情况下!我觉得有必要使用TPM进行延时,我不知道到底我的设置除了什么问题!谢谢!
|
|