完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用一个外部中断(用于按键检测)、两个定时器做了一个简易门铃,但是程序好像有点跑飞,不晓得是什么原因,请大虾们指点一下,程序如下:
#include <STM32f10x_lib.h> #include "menling.h" #include "led.h" #include "delay.h" u8 k=0,m=0,key_num=0; u16 time=0; /*==============================以下为定时器3程序部分=================================*/ /*定时器3中断服务函数*/ void TIM3_IRQHandler(void) { if(TIM3->SR&0X0001)//溢出中断 { Auto=!Auto; } TIM3->SR&=0<<0;//清除中断标志位 } /*定时器2中断服务函数*/ void TIM2_IRQHandler(void) { if(TIM2->SR&0X0001)//溢出中断 { time++; } TIM2->SR&=0<<0;//清除中断标志位 } /************************************************************ 函数名称:Timer3_Init 函数功能:通用定时器3中断初始化 入口函数:arr(自动重装值) psc(时钟预分频数) 返回参数:无 备 注:时钟为2倍APB1(36M) 溢出时间(MS)=(arr*(psc+1))/输入时钟频率(10KHZ) ************************************************************/ void Timer3_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<1;//使能TIM3时钟 TIM3->ARR=arr;//设置计数器自动重装值(0.1ms) TIM3->SC=psc;//预分频器7200,刚好10khz TIM3->DIER|=1<<0; //允许更新中断 TIM3->DIER|=1<<6; //允许触发中断 TIM3->CR1|=0X01; //使能定时器3 MY_NVIC_Init(1,1,TIM3_IRQChannel,2);// 抢占1,子优先级1,组2 } void Timer2_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<0;//使能TIM2时钟 TIM2->ARR=arr;//设置计数器自动重装值(0.1ms) TIM2->SC=psc;//预分频器7200,刚好10khz TIM2->DIER|=1<<0; //允许更新中断 TIM2->DIER|=1<<6; //允许触发中断 //TIM2->CR1|=0X01; //使能定时器2 MY_NVIC_Init(1,2,TIM2_IRQChannel,2);// 抢占1,子优先级2,组2 } //////////////////////////////////////////////////////////////////////////////////// /******************************** 函数名称:外部中断端口初始化函数 入口参数:无 返回参数:无 备注:初始化PA13/PA15为中断输入 ********************************/ void EXTI0_Init(void) { RCC->APB2ENR|=1<<2; //使能PORTA时钟 JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入 GPIOA->CRH|=0X80800000; GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉 GPIOA->ODR|=1<<15; //PA15上拉 Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发 MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2 } /*门铃控制*/ void Menling_Control(void) { u8 i; if(key_num==3&&time>60) { key_num=0; k=10; time=0; LED0=!LED0; } for(i=k;i>0;i--) { //TIM3->CR1|=0X01; //使能定时器3 Timer3_Init(9,7199);//90khz () delay_ms(70); Timer3_Init(6,7199);//60khz () delay_ms(70); } k=0; Auto=0; TIM3->CR1|=0X00; //关闭定时器3 } /*门铃控制*/ void Menling_Control1(void) { Timer3_Init(5,7199);//50khz () //TIM3->CR1|=0X01; //使能定时器3 delay_ms(140); Auto=0; TIM3->CR1|=0X00; //关闭定时器3 } /*外部中断15~10服务程序*/ void EXTI15_10_IRQHandler(void) { delay_ms(10); //消抖 if(KEY0==0) //按键0 { time=0; TIM2->CR1|=0X01; //使能定时器2 Menling_Control1(); key_num++; while(!KEY0); } TIM2->CR1|=0X00; //关闭定时器2 EXTI->R = 1<<13; //清除line13上的中断标志位 } void Menling_Init(void) { RCC->APB2ENR|=1<<3; //使能PORTB时钟 GPIOB->CRL&=0XFFFFFFF0; GPIOB->CRL|=0X00000003;//PB0 推挽输出 GPIOB->ODR|=1<<0; EXTI0_Init(); Timer2_Init(5,7199) ; } |
|
相关推荐
1个回答
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1383 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1375 浏览 1 评论
798 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
573 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1414 浏览 2 评论
1764浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
497浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
432浏览 3评论
420浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
397浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-2 22:51 , Processed in 0.845937 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号