新手上路
- 积分
- 35
- 金钱
- 35
- 注册时间
- 2015-6-6
- 在线时间
- 0 小时
|
5金钱
问题已解决,就是代码中标红的那部分。。。。。。
+++++++++++++++++++++++可爱的分割线+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
打算用外部计数功能做一个频率计,具体思路是:将TIM5配置为外部计数模式,测量输入的脉冲数,计满溢出后产生中断表示溢出次数的变量overflow ++。将TIM3用作定时中断,1S中断一次,计算这段时间内外部脉冲总量,算出频率。
但是现在的问题是,overflow 的值并不会发生变化,导致TIM5只能计数65535个外部脉冲。
具体程序如下,想问一下问什么overflow的值不会发生变化。
//全局变量
u32 count ; //记录溢出次数
u32 overflow; //记录总脉冲次数
int main(void)
{
//无关内容已省略
TIM5_Excnt_Init(0XFFFF,0); //外部计数,最大值0xffff
TIM3_Int_Init(10000,7199);//10Khz的计数频率,计数到10000为1s
while(1)
{
delay_ms(10);
freq = count;
printf("freq: %8.2lf\r\n",freq);
}
}
//定时器配置,以及中断函数
extern u32 overflow;
extern u32 count;
void TIM5_IRQHandler(void)
{
if(TIM5->SR&0X0001)//溢出中断
{
overflow = overflow +1;
}
TIM5->SR&=~(1<<0);//清除中断标志位
}
void TIM5_Excnt_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<3; //TIM5 时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置
GPIOA->CRL|=0X00000008; //PA0 输入
GPIOA->ODR|=0<<0; //PA0 下拉
TIM5->ARR=arr; //设定计数器自动重装值
TIM5-> SC=psc; //预分频器
TIM5->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上
TIM5->CCMR1|=0<<4; //IC1F=0000 配置输入滤波器 不滤波
TIM5->CCER|=0<<1; //CC1P=0 上升沿计数
TIM5->SMCR|=5<<4; //触发选择:滤波后的定时器输入1(TI1FP1)
TIM5->SMCR|=7<<0; //外部时钟模式1
TIM3->DIER|=1<<0; //允许更新中断
TIM5->CR1|=1<<0; //启动计数器,CEN=1
MY_NVIC_Init(2,2,TIM5_IRQn,2);//抢占2,子优先级3,组2
}
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中断
{
count = overflow*65536 + TIM5->CNT;
overflow = 0;
TIM5->CNT = 0;
TIM5_Excnt_Init(0XFFFF,0);
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
void TIM3_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值
TIM3-> SC=psc; //预分频器设置
TIM3->DIER|=1<<0; //允许更新中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(3,3,TIM3_IRQn,2);//抢占1,子优先级3,组2
}
|
最佳答案
查看完整内容[请看2#楼]
回复【3楼】reborn09:
---------------------------------
看上去配置没问题哦
中断里面,TIM5_Excnt_Init(0XFFFF,0);改为:
TIM5->CNT=0试试吧
|