原子老师:
经您的指导,我在用定时器计数模式做一个频率计。设置一个定时器中断,用定时器定时1s钟。同时设置定时器计数模式的溢出中断,每次溢出时统计溢出次数,最后得到总的外部脉冲计数。但现在的问题是:单独使用定时器中断可以定时1s,单独使用定时器计数模式也可以进入溢出中断,但如果两者一起,就只能进入溢出中断,进入不了定时器中断。中断的优先级也没有问题,请原子老师指教。
呃,马上就要考试周了,还没怎么复习。今天这个大实验再做不出就只能放弃了。。。呜呜。。。
下面是我的程序:
主程序:
u16 COUNT=0;
u32 FRE=0;
int main(void)
{
//u32 oldcnt=0;
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600); //串口初始化为9600
delay_init(72); //延时初始化
Timerx_Init(10000,7199);//10Khz的计数频率,计数到10000为1s
TIM2_Excnt_Init(0XFFFF,0); //外部计数,最大值0xffff
while(1)
{
delay_ms(10);
}
}
定时器计数外部脉冲配置:
extern u16 COUNT;
extern u32 FRE;
//TIM2,外部计数模式
void TIM2_Excnt_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->  SC=psc; //预分频器
TIM2->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上
TIM2->CCMR1|=0<<4; //IC1F=0000 配置输入滤波器 不滤波
TIM2->CCER|=0<<1; //CC1P=0 上升沿计数
TIM2->SMCR|=5<<4; //触发选择:滤波后的定时器输入1(TI1FP1)
TIM2->SMCR|=7<<0; //外部时钟模式1
TIM2->DIER|=1<<0; //允许更新中断
TIM2->DIER|=1<<6; //允许触发中断
TIM2->CR1|=1<<0; //启动计数器,CEN=1
MY_NVIC_Init(2,1,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
}
////计数溢出中断服务程序
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0001)//溢出中断 UIF,位0:更新中断标志位置位
{
COUNT++;
printf("COUNT=%d\r\n",COUNT);
}
TIM2->SR&=~(1<<0);//清除中断标志位
}
定时器定时1s配置:
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->  SC=psc; //预分频器7200,得到10Khz的计数时钟 计数器时钟频率=fosc/(预分频+1)
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //允许触发中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(2,0,TIM3_IRQChannel,2);//抢占1,子优先级1,组2
}
////定时器3中断服务程序
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中断 UIF,位0:更新中断标志位置位
{
FRE = COUNT*65535;
FRE = FRE + TIM2->CNT;
COUNT = 0;
//printf("TIM2->CNT=%d\r\n",TIM2->CNT);
printf("FRE=%d\r\n",FRE);
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
|