| 
 
新手上路 
 
	积分21金钱21 注册时间2019-12-26在线时间4 小时 | 
 
1金钱 
| STM32F103ZET6精英版用到了2个定时器 分别是TIM3,TIM5 ,当按键控制定时器3进入中断后,按键无法控制定时器4进入中断并失去作用 
 定时器函数
 #include "timer.h"
 #include "led.h"
 #include "delay.h"
 //////////////////////////////////////////////////////////////////////////////////
 //本程序只供学习使用,未经作者许可,不得用于其它任何用途
 //ALIENTEK STM32F103开发板
 //定时器中断驱动代码
 //正点原子@ALIENTEK
 //技术论坛:www.openedv.com
 //创建日期:2019/9/17
 //版本:V1.0
 //版权所有,盗版必究。
 //Copyright(C) 广州市星翼电子科技有限公司 2014-2024
 //All rights reserved
 //////////////////////////////////////////////////////////////////////////////////
 
 TIM_HandleTypeDef TIM3_Handler;      //定时器句柄
 TIM_HandleTypeDef TIM4_Handler;      //定时器句柄
 //通用定时器3中断初始化
 //arr:自动重装值。
 //psc:时钟预分频数
 //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
 //Ft=定时器工作频率,单位:Mhz
 //这里使用的是定时器3!
 void TIM3_Init(u16 arr,u16 psc)
 {
 TIM3_Handler.Instance=TIM3;                          //通用定时器3
 TIM3_Handler.Init.Prescaler=psc;                     //分频系数
 TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
 TIM3_Handler.Init.Period=arr;                        //自动装载值
 TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
 //          TIM3_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//使能自动重载
 HAL_TIM_Base_Init(&TIM3_Handler);
 HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE
 }
 
 void TIM4_Init(u16 arr,u16 psc)
 {
 TIM4_Handler.Instance=TIM4;                          //通用定时器3
 TIM4_Handler.Init.Prescaler=psc;                     //分频系数
 TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
 TIM4_Handler.Init.Period=arr;                        //自动装载值
 TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
 //          TIM4_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//使能自动重载
 HAL_TIM_Base_Init(&TIM4_Handler);
 HAL_TIM_Base_Start_IT(&TIM4_Handler); //使能定时器4和定时器4更新中断:TIM_IT_UPDATE
 }
 //定时器底册驱动,开启时钟,设置中断优先级
 //此函数会被HAL_TIM_Base_Init()函数调用
 void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
 {
 if(htim->Instance==TIM3)
 {
 __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
 HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
 HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断
 }
 if(htim->Instance==TIM4)
 {
 __HAL_RCC_TIM4_CLK_ENABLE();            //使能TIM3时钟
 HAL_NVIC_SetPriority(TIM4_IRQn,1,2);    //设置中断优先级,抢占优先级1,子优先级3
 HAL_NVIC_EnableIRQ(TIM4_IRQn);          //开启ITM3中断
 }
 }
 
 //定时器3中断服务函数
 void TIM3_IRQHandler(void)
 {
 HAL_TIM_IRQHandler(&TIM3_Handler);
 }
 
 void TIM4_IRQHandler(void)
 {
 HAL_TIM_IRQHandler(&TIM4_Handler);
 }
 //回调函数,定时器中断服务函数调用
 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 {
 if(htim==(&TIM3_Handler))
 {
 LED0=!LED0;
 delay_ms(500);//LED0反转
 }
 if(htim==(&TIM4_Handler))
 {
 LED1=!LED1;
 delay_ms(200);//LED1反转
 }
 }
 
 主函数:
 #include "sys.h"
 #include "delay.h"
 #include "usart.h"
 #include "led.h"
 #include "key.h"
 #include "timer.h"
 /************************************************
 ALIENTEK 精英STM32F103开发板 实验8
 定时器中断实验-HAL库函数版
 技术支持:www.openedv.com
 淘宝店铺: http://eboard.taobao.com
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司
 作者:正点原子 @ALIENTEK
 ************************************************/
 
 int main(void)
 {
 u8 key;
 HAL_Init();                                     //初始化HAL库
 Stm32_Clock_Init(RCC_PLL_MUL9);           //设置时钟,72M
 delay_init(72);                               //初始化延时函数
 uart_init(115200);                                        //初始化串口
 LED_Init();                                                        //初始化LED
 KEY_Init();                                                        //初始化按键
 while(1)
 {
 key=KEY_Scan(0);
 if(key==1)
 {
 __HAL_RCC_TIM4_CLK_DISABLE();
 __HAL_RCC_TIM3_CLK_ENABLE();
 TIM3_Init(5000-1,7200-1);                         //LED0翻转
 }
 if(key==2)
 {
 __HAL_RCC_TIM3_CLK_DISABLE();
 __HAL_RCC_TIM4_CLK_ENABLE();
 TIM4_Init(10000-1,7200-1);                         //LED0翻转
 }
 delay_ms(20);                              //延时20ms
 }
 }
 
 
 
 
 
 
 
 | 
 |