OpenEdv-开源电子网

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

stm8s103f3p6 定时器1 输入捕获,有木有调通的

[复制链接]

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
发表于 2013-11-6 23:58:35 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-7 09:58:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-11-7 11:45:44 | 显示全部楼层
做过,不过是STM8S207的。不过应该也差不多。
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数
u8  TIM2CH2_CAPTURE_STA=0; //输入捕获状态     
u16 TIM2CH2_CAPTURE_VAL; //输入捕获值
//定时器2捕获中断服务函数
INTERRUPT_HANDLER(TIM2_UPD_OVF_IRQHandler,TIM2_UPD_OVF_VECTOR)

u8 tsr;
static u8 led;
tsr=TIM2->SR1;
  if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(tsr&0X01)//溢出
{     
if(TIM2CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM2CH2_CAPTURE_VAL=0XFFFF;
}else TIM2CH2_CAPTURE_STA++;
}  
}    
  }
LED1_SET(led=!led);
TIM2->SR1&=~(1<<0);//清除溢出中断标志位 
}
//TIM2捕获中断服务函数
INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler,TIM2_CAP_COM_VECTOR)
{
u8 tsr;
tsr=TIM2->SR1;
if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(tsr&0x04)//捕获2发生捕获事件
{
if(TIM2CH2_CAPTURE_STA&0X40) //捕获到一个下降沿 
{   
TIM2CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次低电平脉宽
    TIM2CH2_CAPTURE_VAL=TIM2->CCR2H;//获取当前的捕获值.
TIM2CH2_CAPTURE_VAL<<=8;
TIM2CH2_CAPTURE_VAL+=TIM2->CCR2L;
  TIM2->CCER1|=1<<5;  //CC2P=1 设置为下降沿捕获 
}else   //还未开始,第一次捕获下降沿
{
  TIM2->CNTRH=0; //计数器清空
  TIM2->CNTRL=0; //计数器清空
TIM2CH2_CAPTURE_STA=0; //清空
TIM2CH2_CAPTURE_VAL=0;
TIM2CH2_CAPTURE_STA|=0X40; //标记捕获到了下降沿
  TIM2->CCER1&=~(1<<5); //CC2P=0 设置为上升沿捕获
}     
}
}
TIM2->SR1&=~(1<<2);//清除捕获中断标志位 
}
//定时器2.输入捕获初始化代码
//输入捕获计数频率: Fmaster/(2^psc)
//输入捕获最大值:arr
//psc:分配系数,0~15;分频系数为:2^psc,最大为2^15=32768分频
//arr:自动重装载值,0~65535
void TIM2_CAP_Init(u8 psc,u16 arr)

  CLK->CKENR1|=1<<5; //开启TIM2时钟
GPIOD->DDR&=~(1<<3);//PD3 输入模式
GPIOD->CR1|=1<<3; //PD3,上拉
GPIOD->CR2&=~(1<<3);//PD3,不使用中断

TIM2->SCR=psc; //2^psc次方分频
TIM2->ARRH=arr>>8; //必须先设置ARR的高字节
TIM2->ARRL=arr&0XFF;//再设置低字节

TIM2->CCMR2|=1<<0; //CC2映射在TI2FP2上
TIM2->CCMR2|=0<<2; //无预分频,每个事件一次捕获
TIM2->CCMR2|=0<<4; //无滤波,Fmaster采样.
TIM2->CCER1|=1<<5; //捕获下降沿
TIM2->CCER1|=1<<4; //IC2输入捕获使能,允许捕获计数器的值到捕获寄存器中

TIM2->CR1|=1<<7; //预装载使能
TIM2->IER|=1<<0; //使能更新中断
TIM2->IER|=1<<2; //通道2捕获中断使能
TIM2->CR1|=1<<0; //使能TIM2 
ITC_Set(TIM2_UPD_OVF_VECTOR,3); //优先级3
}
int main( void )
{
u8 t,i; 
u32 temp=0;  
stm8_clock_init(1,0); //用内部HSE作为时钟,不分频,24Mhz
delay_init(24);  //初始化延时函数
uart_init(24,9600);  //9600波特率
BEEP_Init();
  LED_Init();
KEY_Init();
EXIT_Init();
TIM2_CAP_Init(3,0XFFFF);//3Mhz的捕获计数频率
  INT_ENABLE();
printf("OK\r\n");
   while(1) 
{     
if(t==20)

LED0_SET(i=!i);
t=0;  
}
t++;
delay_ms(10);  
  if(TIM2CH2_CAPTURE_STA&0X80)//成功捕获到了一次高电平
{
temp=TIM2CH2_CAPTURE_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM2CH2_CAPTURE_VAL; //得到总的高电平时间
printf("HIGH:%ld us\r\n",temp/3);//打印总的高点平时间
TIM2CH2_CAPTURE_STA=0; //开启下一次捕获
}
}
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-10-18
在线时间
0 小时
发表于 2014-10-18 16:59:13 | 显示全部楼层
楼主,能不能上传一下您的AD电压采集部分的程序啊,我是新手,能不能帮帮忙,谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 22:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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