OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7772|回复: 5

请教一下STM8定时器1的外部时钟模式2使用方法

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-7-24
在线时间
0 小时
发表于 2013-7-24 15:48:56 | 显示全部楼层 |阅读模式
 我现在打算用STM8S105S4的TIM1的外部时钟模式2,计算一个脉冲频率。但我参照STM8的参考手册方式写出来后,仿真时怎样也读不到外部的脉冲信号。
程序如下:
void TIM1_init(void)
{
TIM1_ETR=0x40;  //0x40=0100 0000,脉冲高电平有效、使能外部时钟2模式、预分频关闭、以fMASTER取样
TIM1_ARRH=0x00; //随便打的
TIM1_ARRL=0xAA;//随便打的
TIM1_IER=0x01;  //开中断
TIM1_CR1;//开始计数
}

#pragma vector=TIM1_OVR_UIF_vector
__imterrupt void TIM1_OVR_UIF(void)
{ TIM1_SR1=0;}

1、我在仿真时查询TIM1_CNTRH、TIM1_CNTRL时怎样都为0,且不出中断。请问具体是我的软件编写还是外部输入电路有问题呢?我已将信号发生器接到PB3(18脚上)
2、我试了一下将“TIM1_ETR=0x40;”这段删了他后就能有计数(删了后应该默认使用内部时钟来计数吧)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165047
金钱
165047
注册时间
2010-12-1
在线时间
2102 小时
发表于 2013-7-24 16:33:43 | 显示全部楼层
回复【楼主位】地主斌:
---------------------------------
PB3 IO怎么设置的?
设置的什么模式?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-7-24
在线时间
0 小时
 楼主| 发表于 2013-7-24 16:41:07 | 显示全部楼层

主程序:
#include <iostm8s105S4.h>
#include<ram.h>    //自建的RAM区定义

//==================主程序==========================================================================
void main ()
{ init_devices();  //系统上电初始化

  while (1)
  {
    if(PB_IDR_IDR3==0)  {Y2=1;} //我在这专门做了个输出位,可以读到PB3口已经是有信号输入了
    else {Y2=0;}
  }
}
//========================================================================================================
void init_devices(void)  //上电初始化
{
  asm("sim");  //关全局中断
  CLK_init();  //系统时间配置
  GPIO_init(); //端口功能配置
  TIM1_init(); //定时器1配置
  TIM2_init();
  asm("rim");  // 开全局中断
}
//======================================================================================================
void CLK_init(void)    //系统时间配置
{
  CLK_CKDIVR = 0x08;        //08 16M内部RC经2分频后系统时钟为8M
}
//=======================================================================================================
void GPIO_init(void)   //端口功能配置
{
  PD_DDR = 0xAF;  //配置PD端口的方向寄存器,PD6串口输入,其余输出 10111111,10101111=AFPD4输入
  PD_CR1 = 0xef;  //设置PD为推挽输出11101111=EF
  PD_ODR=0xFF;
 
  PE_DDR = 0x27;  //配置PE端口的方向寄存器-输出
  PE_CR1 = 0xff;  //设置PE为推挽输出
 
  PC_DDR = 0xff;
  PC_CR1 = 0xff;
 
  PG_DDR = 0xff;
  PG_CR1 = 0xff;
 
  PB_DDR = 0x00;
  PB_CR1 = 0xf7;
  PB_CR2 = 0x00;
}
//==============================================
void TIM1_init(void)   //定时器1配置
{
  CLK_PCKENR1=0xff;
  TIM1_ETR=0xC0;   //C0反相输入,40不反相输入
  TIM1_SMCR=0x00;
  TIM1_ARRH = 0x00;  
  TIM1_ARRL = 0xAA;
  TIM1_RCR=0x00;
  TIM1_CR1=0x04;
  ///TIM1_CNTRH=0x00;
  ///TIM1_CNTRL=0xAA;
  TIM1_IER = 0x01;
  TIM1_CR1=0x01;
}
//===========================================================================
void TIM2_init(void)   //定时器2配置定时模式
{
  TIM2_PSCR=0x00;   //定时器2分频,o分频
  TIM2_ARRH=0x0F;   //0FA0=4000
  TIM2_ARRL=0xA0;
  TIM2_CNTRH=0x0F;
  TIM2_CNTRL=0xA0;
  TIM2_CR1 = 0x81;    // 计数器使能,开始计数
  TIM2_IER=0x01;
}
//=================================================================================
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
  Y1=~Y1;
  TIM1_SR1 = 0;  // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序
}
//===============================================================================


#pragma vector=TIM2_OVR_UIF_vector
__interrupt void TIM2_OVR_UIF(void)
{
  Y0=~Y0;
  TIM2_SR1 = 0;  // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序
}
//======================================================================


RAH文件:
#ifndef __ram_H__
#define __ram_H__

#include <iostm8s105S4.h>

#define uchar unsigned char   //定义为无符号字付   ~~typedef unsigned char uchar;
#define uint  unsigned int    //~~typedef unsigned int uint;

#define Y0   PE_ODR_ODR5   //上模升
#define Y1   PC_ODR_ODR1   //上模降
#define Y2   PC_ODR_ODR2   //下模升
#define Y3   PC_ODR_ODR3   //下模降
#define Y4   PC_ODR_ODR5   //热板出
#define Y5   PC_ODR_ODR6   //热板入
#define Y6   PC_ODR_ODR7   //上夹件
#define Y7   PG_ODR_ODR0   //下夹件
#define Y8   PG_ODR_ODR1   //运行指示闪灯
//========这里声明后面要用到的子程序=============================================
void CLK_init(void);   //系统时钟配置
void GPIO_init(void);  //端口用途配置(输入或输出)
void init_devices(void); //上电初始化
void TIM1_init(void);  //定时1配置
void TIM2_init(void);  //定时1配置
//-------------------------------------------

#endif

回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-7-24
在线时间
0 小时
 楼主| 发表于 2013-7-26 10:06:53 | 显示全部楼层
搞了两天都不行。最后换为外部时钟1模式就得了。先用住吧,计算外部频率。

void TIM1_init(void)   //定时器1配置(外部时钟模式1)
{
 // TIM1_CCMR2=0x01;   //定时器1通道2脉冲输入PC2的25脚
 // TIM1_CCER1=0x20;   //定时器1通道2脉冲输入PC2
 // TIM1_SMCR=0x67;    //定时器1通道2脉冲输入PC2
  TIM1_CCMR1=0x9d;    //定时器1通道1脉冲输入PC1的24脚,5d(240K),9d(60K)
  TIM1_CCER1=0x02;    //定时器1通道1脉冲输入PC1,0x02
  TIM1_SMCR=0x57;     //定时器1通道1脉冲输入PC1,0x57
  TIM1_CR1=0x01;      //开始计数,0x01
}


然后用程序里面个时钟定时器,逢100MS读一次当前脉冲数:
if(TS7==100)            //TS7*100=1msX100=0.1s 取样一次温度值
    {
     TS7=0;
     FHz=TIM1_CNTRH;     //先读高8位,默认设置数据左对齐
     FHz=FHz<<8;
     FHz|=TIM1_CNTRL;   // 再读低8位
     FHz=FHz<<1;
     TIM1_CNTRH=TIM1_CNTRL=0; //清当前计数器值
    }    

最后直接在屏上显示FHz出来就行了。
回复 支持 反对

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165047
金钱
165047
注册时间
2010-12-1
在线时间
2102 小时
发表于 2013-7-26 10:23:08 | 显示全部楼层
回复【4楼】地主斌:
---------------------------------
恭喜
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-2-18
在线时间
6 小时
发表于 2016-10-15 19:16:25 | 显示全部楼层
TIM1_ERT 设置的问题, 我肯定能测试到计数功能 或你要求的频率问题。亲测。你可搜 模式2 计数功能 ,我发在电子发烧友论坛上,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-29 05:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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