1.问题描述
用DZ60的计时器测周期时发现,TPM(计时器)在初始化后,需要等待500多ms才能勉强测到。
TPM产生的波形如下图,蓝色波形上升沿为初始化指令执行完成时间点,用一个IO口输出高电平并延时100ms作为示波器触发源,黄色波形为TPM的PWM方式输出波形。
2.问题分析
在DZ60DATASHEET中文版第313页找到这段话。
大概意思是TPM的通道控制寄存器的更新时机由clksb:clksa控制。而clksb:clksa的功能如表16-3所示。
合起来就是说,对通道控制寄存器的写入,不是直接写到寄存器里面,而是先写到寄存器对应的缓冲器。当TPM计数器关闭时,写入的数据从缓冲器写入完成后立即更新到寄存器;而当TPM有时钟在运行时,写入的数据更新则需要等到,计时器从0xfffe变成0xffff才开始进行。
由此想到,产生问题的TPM初始化是128分频(16MHZ总线时钟下,周期为8us)。16位TPM计数器从0开始计数,则有更新设置需等待时间为65535×8us=524ms。与所见波形符合。
3.问题解决
无论TPM用作输入捕捉,还是PWM或者比较输出,所有TPM控制寄存器初始化时,都要先把时钟关掉,即clksb:clksa=0b00。问题解决后得到波形如下:
4.正确实例
//初始化时必须先关掉时钟,否则以下两个寄存器要到将要溢出即(0xfffe->0xffff)时才会更新。
//--如果设置128分频,则初始化时间需要 16MHz/128*65535=524ms
//关掉时钟初始化,则寄存器在写入完成后立即更新,无需等待。
//TPM2产生中央对齐PWM输出
TPM_CSTR(TPM_NUM_2) =0b00100111;
// |||||||
// ||||||+-----PS0
// |||||+------PS1 ----128倍分频
// ||||+-------PS2/
// |||+--------CLKSA
// ||+---------CLKSB/--关时钟
// |+----------CPWMS---所有通道以中央对齐PWM模式运行
// +-----------TOIE----禁止溢出中断
//TPM1设置为输入捕捉
TPM_CSTR(TPM_NUM_1) =0b00000111;
// |||||||
// ||||||+-----PS0
// |||||+------PS1 ----128倍分频
// ||||+-------PS2/
// |||+--------CLKSA
// ||+---------CLKSB/--关时钟
// |+----------CPWMS---所有通道以输入捕捉运行
// +-----------TOIE----禁止溢出中断
//TPM2通道设置
TPM2_CHSCSTR(TPM_CHNo)=0b00101000;
// |||||
// ||||+-----ELSA
// |||+------ELSB/---High-true 脉冲(清除向上比较输出)
// ||+-------MSA
// |+--------MSB/----CPWMS=1时,此设置无效
// +---------CHIE----禁止中断
tmp = Period * (125) / 2;
TPM2MOD = tmp; //周期Period以ms为单位
TPM2C0V = tmp / 10 * Duty / 10; //占空比Duty为0~100整数
TPM2SC_CLKSB = 0;
TPM2SC_CLKSA = 1; //寄存器设置完成,再打开总线时钟,避免长时间的寄存器更新。
//TPM2通道设置
TPM1SC_CLKSB = 0;
TPM1SC_CLKSA = 1; //寄存器设置完成,再打开总线时钟,避免长时间的寄存器更新。
TPM1SC_TOIE = 1; //使能输入捕捉中断
EnableTPM1ChInt(G_TMUch_Start);
中断程序的写法如下
interrupt void isrT1Ch0In(void)
{
DisableInterrupt(); //禁止总中断
if(TPM1C0SC_CH0F == 1) //判断是否发生输入捕捉中断
{
TPM1C0SC_CH0F = 0; //清除标志位
switch(g_trigged)
{
case 0:
//第一次触发,保存数据
g_start_data = TPM1C0V;
g_trigged++;
//设置第二次触发边沿方式
TPM_CSTR(TPM_NUM_1) =0b00000111;//重新初始化,避免长时间的寄存器更新。
switch(G_Edge_Stop)
{
case POS_EDGE:
TPM1_CHSCSTR(G_TMUch_Stop)=0b00000100;
// |||||
// ||||+-----ELSA
// |||+------ELSB/---上升边沿捕捉
// ||+-------MSA
// |+--------MSB/----输入捕捉模式
// +---------CHIE----禁止通道中断
break;
case NEG_EDGE:
TPM1_CHSCSTR(G_TMUch_Stop)=0b00001000;//下降边沿捕捉
break;
default:
TPM1_CHSCSTR(G_TMUch_Stop)=0b00000100;//默认为上升边沿捕捉
break;
}
//寄存器设置完成,再打开总线时钟,避免长时间的寄存器更新。 TPM1SC_CLKSB = 0; TPM1SC_CLKSA = 1; TPM1SC_TOIE = 1;
EnableTPM1ChInt(G_TMUch_Stop);
break;
case 1:
//第二次触发,保存数据
g_stop_data = TPM1C0V;
g_trigged++;
//时间采集完毕,恢复成IO功能
TPM1_CHSCSTR(G_TMUch_Start)=0b00000000;
TPM1_CHSCSTR(G_TMUch_Stop)=0b00000000; //恢复成IO功能
break;
default:
break;
}
}
EnableInterrupt(); //开放总中断
}
上一篇:飞思卡尔芯片k66单片机溢出_PWM 初试溢出中断
下一篇:mc9s08dz60 BootLoader基于bin文件
推荐阅读
史海拾趣
随着全球化进程的加速推进,Ceratech Corporation公司意识到要想在激烈的国际竞争中立于不败之地,必须实施全球化战略。公司开始积极拓展海外市场,通过建立海外分公司、参加国际展会等方式,加强与国际同行的交流与合作。同时,公司还积极引进国际先进的技术和管理经验,不断提升自身的创新能力和管理水平。通过全球化战略的实施,Ceratech Corporation逐渐成为了国际电子行业中的佼佼者。
为了进一步扩大市场份额,Altmustech积极寻求与行业内外的战略合作。公司与多家知名企业签订了长期合作协议,共同研发新产品,开拓新市场。通过这些合作,Altmustech不仅获得了更多的资源支持,还提高了品牌知名度,进一步巩固了其在电子行业的地位。
在电子行业的快速发展中,EICHHOFF公司始终保持着对技术创新的追求。XX年代,公司成功研发出了一款具有革命性意义的连接器产品,该产品凭借其独特的设计和卓越的性能,迅速在市场上获得了广泛认可。这一创新不仅为EICHHOFF带来了丰厚的利润,也进一步巩固了其在行业中的领先地位。
此后,EICHHOFF公司继续加大研发投入,不断推出具有竞争力的新产品。这些产品不仅在性能上有所提升,还在设计和功能上进行了创新,满足了客户日益增长的需求。
EiKO Global LLC,简称EiKO,成立于XXXX年,由一群热衷于照明科技的先驱者共同创立。公司初期专注于照明产品的研发与生产,致力于为全球用户提供高质量的照明解决方案。EiKO凭借对市场的敏锐洞察力和技术创新,迅速在北美市场崭露头角。
在创立初期,EiKO便确立了以“质量第一、客户至上”为经营理念的方针。通过引进先进的生产设备和技术,严格把控产品质量,EiKO的照明产品逐渐赢得了消费者的信赖。同时,EiKO还积极拓展市场,与多家知名企业和零售商建立了合作关系,产品销售网络遍布全球。
自成立以来,Einfochips公司一直注重技术创新和研发投入。该公司拥有一支高素质的研发团队,致力于嵌入式系统、ASIC设计、硬件设计和验证等领域的技术研究。通过不断的努力,Einfochips在多个领域取得了重要成果,为电子行业的发展做出了积极贡献。同时,公司还积极与各大芯片设计厂商合作,共同推动技术的发展和应用。
以上五个故事,从不同角度展现了Einfochips公司在电子行业中的发展历程和成就。这些故事不仅反映了公司的技术创新能力和市场敏锐度,还展示了其与客户和合作伙伴之间的紧密合作关系。
自成立以来,Einfochips公司一直注重技术创新和研发投入。该公司拥有一支高素质的研发团队,致力于嵌入式系统、ASIC设计、硬件设计和验证等领域的技术研究。通过不断的努力,Einfochips在多个领域取得了重要成果,为电子行业的发展做出了积极贡献。同时,公司还积极与各大芯片设计厂商合作,共同推动技术的发展和应用。
以上五个故事,从不同角度展现了Einfochips公司在电子行业中的发展历程和成就。这些故事不仅反映了公司的技术创新能力和市场敏锐度,还展示了其与客户和合作伙伴之间的紧密合作关系。
恒压/恒流输出式单片开关电源的设计原理 摘要:单片开关电源是国际上90年代才开始流行的新型开关电源芯片,本文阐述恒压/恒流输出式的设计原理。 关键词:单片开关设计原理恒压/恒流输出 恒压/恒流输出式单片开关电源可简称为恒压/恒流源。其特点是 ...… 查看全部问答∨ |
LM3S8962串口模块特点; 1. 支持数据5~8位可配置;最高波特率3.125MHZ; 2. 起始位,停止位宽带可配置; 3. 校验方式可以配置,支持偶 ...… 查看全部问答∨ |
【资料名称】:华为生产计划手册 \'|:S:A\'j$y;`\"d&xmscbsc 移动通信论坛拥有30万通信专业人员,超过50万份GSM/3G等通信技术资料,是国内领先专注于通信技术和通信人生活的社区。;A#K3^9o8R3L%F.{4h#` 【资料作者】:华为移动通信,通信工程师 ...… 查看全部问答∨ |
|
我从总线上捕获的USB信号为:令牌包(省略)EOP KJKJKJKK KKJKJKKK(PID) JKJKJKJK JKJKJK EOP ACK(省略)环境说明:这个包是一个IN包(从device 发往主机的),用的是中断端点我现在不知道为什么PID后面 ...… 查看全部问答∨ |
目前FSMC上面挂4个设备 其中DM90000A的中断接到一个普通GPIO做中断的 能不能用这两个呢?(关键是这两个是不是做这个用的??) 望研究过的人详细解释… 查看全部问答∨ |
用电烙铁拆: 步骤1、用直径0.15mm左右的漆包线从第一排引脚下穿过,一头固定,一头拉在手里。 2、用电烙铁从漆包线动端加热,同时用手将漆包线向下拉,注意手和烙铁的配合。 3、然后用上述方法拆其余三排引脚。OK! 对印制板无任何损伤!… 查看全部问答∨ |
|
sbit sbit_D18B20_DQ = P3^7; bit b_DS18B20_is_reset = 0; int int_temperature = 0; uchar uc_DS18B20_dat_buf[9] = {0}; b_DS18B20_is_reset = 0; sbit_D18B20_DQ = 1; & ...… 查看全部问答∨ |