新手上路
- 积分
- 38
- 金钱
- 38
- 注册时间
- 2016-6-29
- 在线时间
- 17 小时
|
20金钱
我现在做了一个模块,用的原子开发板,用的寄存器配置。我想用timer2的PA1口作为输入捕获,测量交流电压的频率,但是为什么测不出来。刚开始学习STM32,想用寄存器配置熟悉内设,我用的是原子哥的例子改的,希望原子哥指点下。
#include "timer2.h"
void TIM2_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR |=1<< 0;//使能定时器2,TIM2
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL &= 0XFFFFFF0F;//PA1清零
GPIOA->CRL |= 0X00000080;//输入
GPIOA->ODR|=0<<1; //PA1 下拉
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频
TIM2->CCMR1|=1<<8; //CC2S=10 选择输入端 IC2映射到TI2上
TIM2->CCMR1|=0<<12; //IC2F=0001 配置输入滤波器 不滤波
TIM2->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频
TIM2->CCER|=0<<5; //CC2P=0 上升沿捕获
TIM2->CCER|=1<<4; //CC2E=1 允许捕获计数器的值到捕获寄存器中
TIM2->DIER|=1<<2; //允许捕获中断CC2IE=1
TIM2->DIER|=1<<0; //允许更新中断UIE=1
TIM2->CR1|=0x01; //使能定时器2
MY_NVIC_Init(2,0,TIM2_IRQn,2);//抢占2,子优先级0,组2
}
u8 TIM2CH2_CAPTURE_STA=0; //输入捕获状态
u16 TIM2CH2_CAPTURE_VAL; //输入捕获值
//定时器5中断服务程序
void TIM2_IRQHandler(void)
{
u16 tsr;
tsr=TIM2->SR;
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++;
}
}
if(tsr&0x02)//捕获1发生捕获事件
{
if(TIM2CH2_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM2CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM2CH2_CAPTURE_VAL=TIM2->CCR2; //获取当前的捕获值.
TIM2->CCER|=0<<5; //CC2P=0 设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM2CH2_CAPTURE_STA=0; //清空
TIM2CH2_CAPTURE_VAL=0;
TIM2CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM2->CNT=0; //计数器清空
TIM2->CCER|=0<<5; //CC1P=0 设置为上升沿捕获
}
}
}
TIM2->SR=0;//清除中断标志位
}
|
|