目录
1.时钟选择(这里选择高速外部时钟)
编辑
2.调试模式和时基源选择:
3.LED的GPIO配置 这里用板子的红灯PB5
4.工程配置
5.1ms的systick中断实现led闪烁 源码:
6.修改systick的中断频率
7.systick定时原理
SysTick 定时器的工作原理
中断触发机制
HAL_SYSTICK_Config 函数
举个例子
1.时钟选择(这里选择高速外部时钟)
2.调试模式和时基源选择:
这里我用的是SW调试模式,因为只占用两个GPIO,时基源选择systick 系统定时器
3.LED的GPIO配置 这里用板子的红灯PB5
LED原理图
低电平点亮,配置GPIO
4.工程配置
5.1ms的systick中断实现led闪烁 源码:
在原本生成的代码中修改部分
main.c
/* USER CODE BEGIN Includes */
#include "stm32f1xx_it.h"
/* USER CODE END Includes *//* USER CODE BEGIN WHILE */while (1){if(flag==1){HAL_GPIO_TogglePin((GPIO_TypeDef *)GPIOB, (uint16_t) GPIO_PIN_5);flag=0;}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
stm32f1xx_it.h
/* USER CODE BEGIN Includes */
extern volatile int systick,flag;
/* USER CODE END Includes */
stm32f1xx_it.c
/* USER CODE BEGIN Includes */
volatile int systick=0,flag=0;
/* USER CODE END Includes */void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 */if(flag==0){systick++;if(systick>1000){flag=1;systick=0;}}/* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */
}
6.修改systick的中断频率
HAL系统默认的systick的中断频率是1kHZ 也就是1ms中断一次
/* USER CODE BEGIN 2 */// 修改时钟源为 HCLK(8MHz)
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);// 再重新配置重装载值
uint32_t new_load = (8000000 / 1000) - 1; // 1ms中断(7999)
HAL_SYSTICK_Config(new_load);/* USER CODE END 2 */
在while(1)前配置 为1ms中断
7.systick定时原理
SysTick 定时器是一个广泛应用于嵌入式系统中的定时器,常用于周期性中断。它的基本工作原理是基于系统时钟(SystemCoreClock
)来生成一个定时周期,并通过计数器进行倒计时,直到计数器的值为零时触发一个中断。
SysTick 定时器的工作原理
-
系统时钟(
SystemCoreClock
):SysTick
定时器的计数频率由系统时钟决定。系统时钟频率就是每秒钟系统产生的时钟周期数,也可以理解为每秒系统执行的时钟信号的次数。
-
定时器计数器:
- SysTick 是一个 24 位的倒计时计数器,从
ReloadValue
开始倒数。 SysTick
的计数器在每次时钟周期减少 1,直到计数器的值减少到 0 为止。- 当计数器的值为 0 时,
SysTick
会触发一个中断,表示定时周期已到。
- SysTick 是一个 24 位的倒计时计数器,从
-
重载值(
ReloadValue
):ReloadValue
定义了定时器倒计时的起始值,它通过公式与系统时钟频率相关。- 我们通过设置
ReloadValue
来控制定时器的计数周期,从而设置中断的时间间隔。
例如,如果我们希望每 1 毫秒触发一次中断,而系统时钟频率为 8 MHz(即 8,000,000 Hz),则需要将
ReloadValue
设置为:这表示计数器会从 8000 开始倒数,经过 8000 个时钟周期后触发中断,每个时钟周期为 1 微秒,所以总共时间为 1 毫秒。
-
定时器的倒计时与重载:
- 每当计数器倒计时到 0 时,SysTick 会重新加载
ReloadValue
(即 8000),然后继续倒计时,形成一个循环。 - 这一周期性过程确保了每次计数器到 0 时,都会触发一个中断,时间间隔与
SystemCoreClock
和ReloadValue
密切相关。
- 每当计数器倒计时到 0 时,SysTick 会重新加载
中断触发机制
- 每当
SysTick
定时器的计数器从ReloadValue
值递减到 0 时,系统会触发一个中断,通知 MCU 进行特定的任务。 - 这个中断的触发频率与重载值密切相关。例如,设置
ReloadValue
为 8000,且系统时钟为 8 MHz,每经过 8000 个时钟周期就会触发一次中断,时间间隔为 1 毫秒。
HAL_SYSTICK_Config 函数
在 STM32 的 HAL 库中,HAL_SYSTICK_Config
函数用于配置 SysTick
定时器。它的原理如下:
HAL_SYSTICK_Config(SystemCoreClock / 1000);
- 该函数通过将
SystemCoreClock / 1000
作为重载值设置给SysTick
,意味着系统时钟除以 1000,设置定时器的重载值,使得SysTick
每经过 1000 微秒(即 1 毫秒)触发一次中断。 SystemCoreClock / 1000
的结果就是每 1 毫秒触发一次中断,这使得你可以在中断服务程序中执行特定的任务。
举个例子
假设系统时钟为 8 MHz:
- 通过
HAL_SYSTICK_Config(SystemCoreClock / 1000)
,将重载值设置为 8000。 - 每经过 8000 个时钟周期,SysTick 会触发一个中断。
- 8000 个时钟周期表示 1 毫秒,触发频率为 1 毫秒一次。
当中断发生时,你可以在中断处理函数中编写需要定时执行的任务,比如采样数据、更新计数器等。