stm32F103配置SysTick_Handler 使用寄存器版本
时间: 2023-12-12 18:02:50 浏览: 103
STM32F103ZET6 两定时器两通道CH1与CH2,寄存器版本,定时器捕获2路PWM信号
好的,以下是配置SysTick_Handler的寄存器版本代码:
首先,需要在代码中引入stm32f10x.h头文件,然后定义SysTick_Handler函数,如下所示:
```c
#include "stm32f10x.h"
void SysTick_Handler(void) {
// 在此处添加SysTick_Handler中断服务程序的代码
}
```
接着,需要在main函数中进行SysTick定时器的配置。SysTick定时器是一种基于内核时钟的定时器,可以用来产生周期性的中断。SysTick定时器的时钟源是内核时钟,因此在使用SysTick定时器之前,需要先配置内核时钟。假设我们需要将SysTick定时器配置为1ms中断一次,以下是配置代码:
```c
int main(void) {
// 配置内核时钟为72MHz
SystemInit();
// 配置SysTick定时器
SysTick->LOAD = 71999; // 72MHz / 1000 - 1 = 71999,计数器从0开始计数,所以需要减1
SysTick->CTRL = 0x07; // 启用SysTick定时器,选择内核时钟作为时钟源,使能中断
while (1) {
// 在这里添加主程序的代码
}
}
```
在上面的代码中,通过设置SysTick->LOAD寄存器的值,来设置SysTick定时器的计数周期。在我们的例子中,计数周期为71999,即每过71999个时钟周期(1ms)产生一次中断。然后通过设置SysTick->CTRL寄存器的值,来启用SysTick定时器,并使能中断。
在SysTick_Handler中断服务程序中,可以添加需要执行的代码。例如,可以使用一个全局变量来计数,表示已经发生了多少次中断:
```c
#include "stm32f10x.h"
volatile uint32_t count = 0;
void SysTick_Handler(void) {
count++;
}
int main(void) {
SystemInit();
SysTick->LOAD = 71999;
SysTick->CTRL = 0x07;
while (1) {
// 在这里添加主程序的代码
}
}
```
在上面的例子中,每次发生SysTick中断时,count变量的值会加1。我们可以在主程序中使用count变量的值来判断时间是否到达了某个阈值,从而执行一些操作。
另外,需要注意的是,在使用SysTick定时器时,需要禁止SysTick定时器的中断嵌套。可以通过设置NVIC的优先级分组和SysTick中断的优先级来实现。以下是一个例子:
```c
int main(void) {
SystemInit();
// 配置NVIC的优先级分组为2位抢占优先级,2位响应优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// 配置SysTick定时器中断的优先级为最低优先级
NVIC_SetPriority(SysTick_IRQn, 15);
SysTick->LOAD = 71999;
SysTick->CTRL = 0x07;
while (1) {
// 在这里添加主程序的代码
}
}
```
在上面的例子中,通过NVIC_PriorityGroupConfig函数将NVIC的优先级分组设置为2位抢占优先级,2位响应优先级。然后,通过NVIC_SetPriority函数将SysTick中断的优先级设置为最低优先级。这样可以确保SysTick中断不会被其他中断打断,从而保证定时器的准确性。
阅读全文