OpenEdv-开源电子网

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

求一个定时器1输入捕获程序范例

[复制链接]

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-7-13
在线时间
12 小时
发表于 2016-9-30 22:20:29 | 显示全部楼层 |阅读模式
1金钱
根据原子板子程序改的TIM1 CH1输入捕获程序,死活进不去中断,改了中断入口是TIM1_CC_IRQn,中断服务程序是TIM1_CC_IRQHandler,仍然进不去中断。看了下论坛貌似很多人都进不去,希望能有大神上传下这个程序作为范例。万分感谢~~

最佳答案

查看完整内容[请看2#楼]

/******************************************************************************************** 函数名: 定时器1配置输入捕获 调 用: TIM1_IRD_StartWork_int(void) 参 数: 无 ********************************************************************************************/ void TIM1_IRD_StartWork_int(void) { RCC->APB2ENR |= 1ARR = 60000; //设定计数器自动重装值 TIM1-> ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-9-30 22:20:30 | 显示全部楼层

/********************************************************************************************
函数名: 定时器1配置输入捕获
调  用: TIM1_IRD_StartWork_int(void)
参  数: 无
********************************************************************************************/
void TIM1_IRD_StartWork_int(void)
     {
     RCC->APB2ENR |= 1<<11; //TIM1时钟使能  
     //RCC->APB2ENR |= 1<<2;               //使能PORTA时钟         
    // GPIOA->CRH &= 0xFFFF0000;   
    // GPIOA->CRH |= 0x0000BBBB;     //PA8,PA9,PA10,PA11 复用功能   
     TIM1->ARR = 60000;              //设定计数器自动重装值  
     TIM1->PSC = 72 ;              //预分频器72,得到1MHZ的计数时钟
             
     BIT_ADM(TIM1->CR1,7) = 1;     
     BIT_ADM(TIM1->CR1,4) = 0;  


             
     BIT_ADM(TIM1->CCMR2,15) = 0;    //IC4F = 0100; N=6 配置输入捕获2滤波   
     BIT_ADM(TIM1->CCMR2,14) = 1;              
     BIT_ADM(TIM1->CCMR2,13) = 0;   
     BIT_ADM(TIM1->CCMR2,12) = 0;         
     BIT_ADM(TIM1->CCMR2,11) = 0;    //IC4PSC = 00;不分频
     BIT_ADM(TIM1->CCMR2,10) = 0;
     BIT_ADM(TIM1->CCMR2, 9) = 0;    //CC4S = 10;选择输入端口IC4映谢到 TI3上
     BIT_ADM(TIM1->CCMR2, 8) = 1;         
     BIT_ADM(TIM1->CCER, 12) = 1;   //OC4 输入捕获使能
     BIT_ADM(TIM1->CCER, 13) = 0;   //高电平有效P =0;   
     BIT_ADM(TIM1->DIER,  4) = 1;   //充许捕获4中断     
     BIT_ADM(TIM1->DIER,  0) = 1;   //定时器更新中断使能            
    // BIT_ADM(TIM1->DIER,  6) = 1;   //充许触发中断(定时器1需要开这个中断才能使用)   
     MY_NVIC_Init(6,0,TIM1_UP_IRQn,4); //抢占3,子优先级0,组4
     BIT_ADM(TIM1->CR1,0)=1;   //使能定时器1          
     }
/********************************************************************************************
函 数 名: TIM1_IRQHandler:  定时器1中断函数
调    用: 无
参    数: 无
返 回 值: 无           
********************************************************************************************/
void TIM1_UP_IRQHandler(void)  
     {      
     if(BIT_ADM(TIM1->SR ,0) ==1)
       {//溢出中断
       BIT_ADM(TIM1->SR ,0) = 0;    //清溢出中断标志位      
       if((STATUS & 0x0f)< 14) STATUS ++;
       else{ //输入脉冲变有变化时间太长了
           STATUS = 0;
           MOTOR_SHOULUN = 0;      
           }               
       }     
     if(BIT_ADM(TIM1->SR ,4)==1)
       {//CC4IE中断
       BIT_ADM(TIM1->SR ,4) = 0;     //清捕获中断标志位   
       if(STATUS & 0x80)
         {//已置下降沿捕获标志计算输入脉冲时间
         MOTOR_SHOULUN = TIM1->CCR4; //读取CCR2也可以清CC1IF标志位                 
         TIM1->CNT = 10;              //清空定时器值
         }                 
       else{
           STATUS |= 0x80;           //初始化捕获标志位
           TIM1->CNT = 10;            //清空定时器值         
           }
       }
   //  TIM1->SR = 0; //清除所有中断标志      
     }
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-7-13
在线时间
12 小时
 楼主| 发表于 2016-10-1 11:23:02 | 显示全部楼层
likunxue 发表于 2016-9-30 22:42
/********************************************************************************************
函 ...

BIT_ADM() 的宏定义什么的能发一下么?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-1 16:53:44 | 显示全部楼层
威 发表于 2016-10-1 11:23
BIT_ADM() 的宏定义什么的能发一下么?

BIT_ADM,明显是设置寄存器的某个位为某个值,自己实现一下也不难啊,一定要要送到西??
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-10-1 20:42:31 | 显示全部楼层
正点原子 发表于 2016-10-1 16:53
BIT_ADM,明显是设置寄存器的某个位为某个值,自己实现一下也不难啊,一定要要送到西??

//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
#define BIT_ADM(addr,bitnum)     MEM_ADDR(BITBAND(((u32)&(addr)),(bitnum)))   
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-7-13
在线时间
12 小时
 楼主| 发表于 2016-10-1 20:54:09 | 显示全部楼层
正点原子 发表于 2016-10-1 16:53
BIT_ADM,明显是设置寄存器的某个位为某个值,自己实现一下也不难啊,一定要要送到西??

写了一个 但还是没有用(实际上是别的地方有问题) 怕是自己写的错的,所以想求一个
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-7-13
在线时间
12 小时
 楼主| 发表于 2016-10-1 20:54:21 | 显示全部楼层
likunxue 发表于 2016-10-1 20:42
//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考第五章(87页~92页).
//IO口操作宏定义

谢谢~~
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 19:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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