完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我是想通过:tiM_CH4(PA3)引脚进行捕获输入来进行对外部脉冲计数,算出他一秒种的计数,即频率,
我的程序如下: //通用定时器中断初始化 //这里始终选择为APB1的2倍,而APB1为36M,参考时钟树总图 //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void Timer2_Init(u16 arr,u16 psc) { RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0XFFFF0FFF; GPIOA->CRL|=0X00004000;//PA3 浮空输入 // GPIOA->CRL&=0XFFFFFFF0; // GPIOA->CRL|=0X00000004;//PA0 浮空输入 // GPIOA->ODR|=1<<0; //PA3 输出 RCC->APB1ENR|=1<<0;//TIM2时钟使能 TIM2->ARR=arr; //设定计数器自动重装值//刚好0.1ms TIM2->SC=psc; //预分频器7200,得到10Khz的计数时钟 //这两个东东要同时设置才可以使用中断 TIM2->CCER |= 1<<12; //TIM2_CH4捕获使能 TIM2->CCMR2 |= 1<<8; //IC4映射在TI4 TIM2->EGR |= 1<<4; //产生捕获/比较事情4 TIM2->DIER|=1<<0; //允许更新中断 TIM2->DIER|=1<<6; //允许触发中断 TIM2->DIER|=1<<4; //允许捕获比较中断 // TIM2->SMCR&=0x00FF; //选择外部时钟触发模式2 // TIM2->SMCR|=1<<14; TIM2->CNT=0;//计数初始值为0 TIM2->CR1|=0x01; //使能定时器2 MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2 } //定时器2中断服务程序 void TIM2_IRQHandler(void) { if(TIM2->SR&(1<<4))//溢出中断 { COUNT++; TIM2->CCR4=0; // COUNT = TIM2->CCR4; } TIM2->SR&=~((1<<4)&(1<<0));//清除中断标志位 } 定时器3作1秒定时, //定时器3中断服务程序 void TIM3_IRQHandler(void) { if(TIM3->SR&(1<<0))//溢出中断 UIF,位0:更新中断标志位置位 { COUNT2=COUNT; COUNT=0; // BUZZER=!BUZZER;//蜂鸣器鸣响 } TIM3->SR&=~(1<<0);//清除中断标志位 } //通用定时器中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void Timer3_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<1;//TIM3时钟使能 TIM3->ARR=arr; //设定计数器自动重装值//刚好0.1ms TIM3->SC=psc; //预分频器7200,得到10Khz的计数时钟 计数器时钟频率=fosc/(预分频+1) //这两个东东要同时设置才可以使用中断 TIM3->DIER|=1<<0; //允许更新中断 TIM3->DIER|=1<<6; //允许触发中断 TIM3->CR1|=0x01; //使能定时器3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2 } 主函数中 while(1) { printf("%ld ",COUNT2); delay_ms(1000); } 现在遇到的问题是,捕获那边的数值不正确,不知道哪里设置不对,请大侠们帮帮忙, 蓝色字体是小弟自己看着寄存器设置的,不知道错在哪里? |
|
相关推荐
14个回答
|
|
//定时器2中断服务程序
void TIM2_IRQHandler(void) { if(TIM2->SR&(1<<4))//溢出中断 { COUNT++; TIM2->CCR4=0; // COUNT = TIM2->CCR4; } TIM2->SR&=~((1<<4)&(1<<0));//清除中断标志位 } if那里,应该不是溢出中断吧. |
|
|
|
只是注释错了,并不影响的,
|
|
|
|
现在能进中断么?
|
|
|
|
进去了,跳不出来啊
|
|
|
|
进了TIM2_CH4捕获中断后,出不来了啊,原来的TIM3定时中断也不会进去了,好像卡在TIM2_CH4中断里面了,
|
|
|
|
|
|
|
|
//定时器2中断服务程序
void TIM2_IRQHandler(void) { if(TIM2->SR&(1<<4))//捕获中断 { COUNT++; // TIM2->CCR4=0; //COUNT = TIM2->CCR4; } TIM2->SR&=~(1<<4);//清除中断标志位 } //通用定时器中断初始化 //这里始终选择为APB1的2倍,而APB1为36M,参考时钟树总图 //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void Timer2_Init(u16 arr,u16 psc) { RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0XFFFF0FFF; GPIOA->CRL|=0X00004000;//PA3 浮空输入 // GPIOA->CRL&=0XFFFFFFF0; //GPIOA->CRL|=0X00000004;//PA0 浮空输入 // GPIOA->ODR|=1<<0; //PA3 输出 RCC->APB1ENR|=1<<0;//TIM2时钟使能 TIM2->ARR=arr; //设定计数器自动重装值//刚好0.1ms TIM2->SC=psc; //预分频器7200,得到10Khz的计数时钟 //这两个东东要同时设置才可以使用中断 TIM2->CCER |= 1<<12;//TIM2_CH4捕获使能 TIM2->CCMR2 |= 1<<8; //IC4映射在TI4 TIM2->EGR |= 1<<4; //产生捕获/比较事情4 TIM2->DIER|=1<<0; //允许更新中断 //TIM2->DIER|=1<<6; //允许触发中断 TIM2->DIER|=1<<4; //允许捕获比较中断 //TIM2->SMCR&=0x00FF; //选择外部时钟触发模式2 //TIM2->SMCR|=1<<14; TIM2->CNT=0;//计数初始值为0 TIM2->CR1|=0x01; //使能定时器2 MY_NVIC_Init(0,3,TIM2_IRQChannel,2);//抢占0,子优先级3,组2 } 问题就在上面这个函数里面,进入中断后,一直进去,不知道哪里退不出,我在主函娄里串口发送的,不显示, 就在上面两个函数设置问题, |
|
|
|
跳不出来执行主函数了,好像一直进入,因为那个中断也太快了
|
|
|
|
|
|
|
|
还是不行啊,初始化看着手册写的,也不知道正不正确啊,
|
|
|
|
那有可能你输入捕获没设置对了。。。
|
|
|
|
哪位有例子吗?
|
|
|
|
過陣子我弄個.
|
|
|
|
原子,尽量弄啊
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1713 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1600 浏览 1 评论
1038 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
715 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1651 浏览 2 评论
1903浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
694浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
546浏览 3评论
567浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
535浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-12 07:12 , Processed in 2.090000 second(s), Total 101, Slave 86 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号