网站上发布的内容字体多少合适,邯山手机网站建设,国内优秀公司网站,适合前端做项目的网站一、实验目的
掌握STM32定时器#xff08;TIM#xff09;的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范
二、实验原理 定时器基础#xff1a; STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器#x…一、实验目的
掌握STM32定时器TIM的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范
二、实验原理 定时器基础 STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器PSC和自动重载寄存器ARR控制计数周期 时间计算公式 延时时间 (自动重载值 预分频系数 - 1) / (系统时钟频率 × 预分频系数)
三、硬件准备
开发板STM32F103C8T6
四、实验步骤
选择STM32F103C8T6芯片 设置调试接口 启用TIM1定时器 配置TIM1 选择RCC做为时钟信号源
计算TIM需要的参数 如图我们PSC 7,ARR 999,RCR 0同时使用ARR寄存器预加载 设置updata中断 生成项目 代码配置 我们要实现自己的延迟函数首先要自定义一个函数
static void MyDelay(uint32_t Delay){uint32_t expireTime MyGetTick() Delay;while(MyGetTick() expireTime)//等待延迟结束
}
其中MyGetTick是获取当前计时器时间的函数也是我们要自编写的函数之一。Delay是要延迟的毫秒数。
实现MyGetTick函数
static volatile uint32_t currentMiliSeconds 0;
static uint32_t MyGetTick(void){return currentMiliSeconds;
}
我们是通过计时器中断的方法来实现自己的延迟函数的我们要使用先关的库函数要重写库函数完成currentMiliSeconds值的累加。基本原理是启动定时器产生update事件并触发中断并回调重写函数HAL_TIM_PeriodElapsedCallback。 组织代码如下
static volatile uint32_t currentMiliSeconds 0;static void MyDelay(uint32_t Delay){uint32_t expireTime MyGetTick() Delay; while(MyGetTick() expireTime);//等待延迟结束
}static uint32_t MyGetTick(void){return currentMiliSeconds;
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim htim1){currentMiliSeconds; }
}
编写GPIO闪灯代码 while (1){HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);MyDelay(1000);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);MyDelay(1000); }
五、预期现象
LED灯以1Hz频率交替闪烁亮0.5s/灭0.5s使用逻辑分析仪测量TIM1计数周期应为1ms