stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)
2016-07-10 13:29
323 查看
STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0;TIMER3-->PD2;TIMER4-->PE0…
1.TIM2 PA0计数 配置步骤
①开启TIM2时钟,配置PA0输入
APB1外设复位寄存器 (RCC_APB1RSTR)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/1d606343c30dafdece774030c0e88dd3.png)
APB2外设时钟使能寄存器(RCC_APB2ENR)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/1db04648503a3ed6f172f4e93315debe.png)
置1开启。清0关闭。
Eg:RCC->APB1ENR|=1<<0; //使能TIM2时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置。
Eg:GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置
GPIOA->CRL|=0X00000008; //PA0 输入
GPIOA->ODR|=0<<0; //PA0 下拉
②设置TIM2的ARR和PSC
自动重装载寄存器(TIMx_ARR)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/718c96b4e91349c61dcafcd02d43e741.jpg)
预分频器(TIMx_PSC)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/31c2388cc8573e8a94874bac2a9613ed.jpg)
③设置TIM2的CCMR1
TIM2_CCMR1寄存器控制着输入捕获1和2的模式,包括映射关系、滤波和分频等。这里需要设置通道1为输入模式,且IC1映射到TI1(通道1)上,并且不使用滤波(提高响应速度)器。
捕获/比较模式寄存器1(TIMx_CCMR1)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/fcca8e448b99aa45122667cab2a55598.jpg)
输入捕获模式:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/04ec4555791fff6fc5eba27e4fff4c14.jpg)
Eg:TIM2->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上
TIM2->CCMR1|=1<<4; //IC1F=0001 配置输入滤波器 以Fck_int采样,2个事件后有效
TIM2->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频
④设置TIM2的CCER,开启输入捕获,并设置上升沿捕获
TIM2_CCER寄存器是定时器的开关,并且可以设置输入捕获的边沿。
捕获/比较使能寄存器(TIMx_CCER)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/491dcd1081ad22a3f939d6555cad94d4.jpg)
Eg: TIM2->CCER|=0<<1; //CC1P=0 上升沿捕获
TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
⑤设置TIM2的DIER,使能捕获和更新中断,并编写中断服务函数
DMA/中断使能寄存器(TIMx_DIER)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/adc267aae0c2e3cf9ebd47492a416c88.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/15f6a9cb3d2b2abf2eb921293843d98b.jpg)
Eg:TIM2->DIER|=1<<1; //允许捕获中断
TIM2->DIER|=1<<0; //允许更新中断
⑥设置TIM2的CR1使能定时器
最后打开定时器的计数器开关,启动TIM2计数器,开始输入捕获。
控制寄存器1(TIMx_CR1)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/e7d9c70bd7cfa8e501257150a36a29aa.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/77a31d7458d36ab28d3e8098a76f748f.jpg)
2.TIM2 PA0计数应用
//不知为何cnt读数为0.。。
1.TIM2 PA0计数 配置步骤
①开启TIM2时钟,配置PA0输入
APB1外设复位寄存器 (RCC_APB1RSTR)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/1d606343c30dafdece774030c0e88dd3.png)
APB2外设时钟使能寄存器(RCC_APB2ENR)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/1db04648503a3ed6f172f4e93315debe.png)
置1开启。清0关闭。
Eg:RCC->APB1ENR|=1<<0; //使能TIM2时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置。
Eg:GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置
GPIOA->CRL|=0X00000008; //PA0 输入
GPIOA->ODR|=0<<0; //PA0 下拉
②设置TIM2的ARR和PSC
自动重装载寄存器(TIMx_ARR)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/718c96b4e91349c61dcafcd02d43e741.jpg)
预分频器(TIMx_PSC)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/31c2388cc8573e8a94874bac2a9613ed.jpg)
③设置TIM2的CCMR1
TIM2_CCMR1寄存器控制着输入捕获1和2的模式,包括映射关系、滤波和分频等。这里需要设置通道1为输入模式,且IC1映射到TI1(通道1)上,并且不使用滤波(提高响应速度)器。
捕获/比较模式寄存器1(TIMx_CCMR1)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/fcca8e448b99aa45122667cab2a55598.jpg)
输入捕获模式:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/04ec4555791fff6fc5eba27e4fff4c14.jpg)
Eg:TIM2->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上
TIM2->CCMR1|=1<<4; //IC1F=0001 配置输入滤波器 以Fck_int采样,2个事件后有效
TIM2->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频
④设置TIM2的CCER,开启输入捕获,并设置上升沿捕获
TIM2_CCER寄存器是定时器的开关,并且可以设置输入捕获的边沿。
捕获/比较使能寄存器(TIMx_CCER)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/491dcd1081ad22a3f939d6555cad94d4.jpg)
Eg: TIM2->CCER|=0<<1; //CC1P=0 上升沿捕获
TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
⑤设置TIM2的DIER,使能捕获和更新中断,并编写中断服务函数
DMA/中断使能寄存器(TIMx_DIER)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/adc267aae0c2e3cf9ebd47492a416c88.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/15f6a9cb3d2b2abf2eb921293843d98b.jpg)
Eg:TIM2->DIER|=1<<1; //允许捕获中断
TIM2->DIER|=1<<0; //允许更新中断
⑥设置TIM2的CR1使能定时器
最后打开定时器的计数器开关,启动TIM2计数器,开始输入捕获。
控制寄存器1(TIMx_CR1)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/e7d9c70bd7cfa8e501257150a36a29aa.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/77a31d7458d36ab28d3e8098a76f748f.jpg)
2.TIM2 PA0计数应用
//定时器2通道1输入捕获配置 //arr:自动重装值 //psc:时钟预分频数 void TIM2_Cap_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<0; //TIM2 时钟使能 RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置 GPIOA->CRL|=0X00000008; //PA0 输入 GPIOA->ODR|=0<<0; //PA0 下拉 TIM2->ARR=arr; //设定计数器自动重装值 TIM2->PSC=psc; //预分频器 TIM2->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上 TIM2->CCMR1|=1<<4; //IC1F=0001 配置输入滤波器 以Fck_int采样,2个事件后有效 TIM2->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频 TIM2->CCER|=0<<1; //CC1P=0 上升沿捕获 TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中 TIM2->DIER|=1<<1; //允许捕获中断 TIM2->DIER|=1<<0; //允许更新中断 TIM2->CR1|=0x01; //使能定时器2 MY_NVIC_Init(2,0,TIM2_IRQn,2);//抢占2,子优先级0,组2 } //定时器2中断服务程序 void TIM2_IRQHandler(void) { u16 tsr; tsr=TIM2->SR; if(tsr&0x02)//捕获1发生捕获事件 { cishu++; } TIM2->SR=0;//清除中断标志位 }
//测试.c TIM2_Cap_Init(25,0); while(1) { printf("cishu:%d us\r\n",cishu); }
//不知为何cnt读数为0.。。
相关文章推荐
- 如何正確的使用迴圈(使用for_each)
- sql 查询表的所有列信息
- (转)所谓情商高,就是要把别人放在心上
- 16.18
- TabBarController简单介绍
- java单元测试junit
- asp.net中,用Ajax实现客户端调用服务器端的函数(PageMethods)
- 在linux系统中,卸载本机默认安装的jdk
- Java XML解析之SAX解析
- Kakfa揭秘 Day9 KafkaReceiver源码解析
- 张国祥老师应邀在上海为卓越经理人讲授流程建设与优化课程
- 使用CXF框架搭建WebService服务接口
- Codevs 1702 素数判定 2(Fermat定理)
- 寒战2II 观后感
- 关于博客园与CSDN博客同步的说明
- Java中只有按值传递,没有按引用传递
- JSON与JSONP
- 质数因子
- poj 3414 Pots(bfs)
- IOS 一些好的框架和 技术大牛的博客