中级会员
 
- 积分
- 427
- 金钱
- 427
- 注册时间
- 2012-7-21
- 在线时间
- 0 小时
|

楼主 |
发表于 2012-9-4 22:59:50
|
显示全部楼层
回复【20楼】a546924171:
---------------------------------
这是我的配置程序
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);//延时函数初始化
uart_init(72,9600);
Capture_Init(0xffff,0); //设2,三分频,65535溢出。可以测370HZ以上。
LED_Init();
while(1)
{
// Frequency = 24000000/(IC1Value+OV_count*65535);
DutyCycle = (IC2Value*100)/IC1Value;//占空比=(IC2Value/IC1Value)*100;
printf("Frequency = %d\r\n",Frequency);
// printf("DutyCycle = %d\r\n",DutyCycle);
}
}
void Capture_Init(u16 arr,u16 psc)
{
//此部分需手动修改 IO口设置
RCC->APB2ENR|=1<<0; //
RCC->APB1ENR|=1<<0; //TIM2 时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
TIM2->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM2-> SC=psc; //预分频器,
GPIOA->CRL&=0XFFFFFFF0;//PA0 输出
GPIOA->CRL|=0X00000004;//复用功能输出
GPIOA->ODR|=1<<0;//PA0 上拉
// TIM2->SMCR|=0x0040;
TIM2->CCMR1|=1<<0;//CC1S=01 选择输入端
TIM2->CCER|=0<<1; //CC1P=0 选择有效转换边沿 上升沿有效
TIM2->CCMR1|=0<<2; //IC1PS=00 配置输入分频 无预分频器,捕获输入口上检测到的每一个边沿都触发一次捕获
TIM2->CCMR1|=0<<4; //IC1F=0011配置输入滤波器
TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM2->DIER|=1<<1; //允许更新捕获中断
TIM3->DIER|=1<<0; //允许更新中断
// TIM3->DIER|=1<<6; //允许触发中断
TIM2->CR1|=0x01; //使能定时器2
MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
}
u32 OV_count=0;
u32 cap_count;
u32 old_cap=0;
u32 new_cap=0;
u32 cap_diff=0;
//定时器2中断服务程序
void TIM2_IRQHandler(void)
{
//捕获处理
if(TIM2->SR&0X0002)
{
TIM2->SR&=~(1<<1);//清除中断标志位
if(1==cap_count) //捕获频率
{
OV_count=0;
old_cap=TIM2->CCR1;
}
else if(cap_count>10)
{
new_cap=TIM2->CCR1;
cap_diff=new_cap-old_cap+65535*OV_count;
Frequency=720000000/cap_diff;//这里72000000*10是对10次捕获求平均值
cap_count=0;
OV_count=0;
}
cap_count++;
}
if(TIM2->SR&0X0001)//溢出中断
{
OV_count++;
TIM2->SR&=~(1<<0);//清除中断标志位
}
}
|
|