定时器:
功能从高到低:
TIM1和TIM8 高级控制定时器:输出能力更强,刹车控制、死区时间。
TIMx 通用定时器:可以输出PWM方波
TIM6和TIM7 基本定时器:只能计时
系统定时器
系统定时器(SysTick系统)是属于CM3内核,内嵌在NVIC中。
它可以通过快速执行可以让两个while循环函数同时执行(假的)
SysTick相关寄存器
Core peripherals 核心外设
STK_CTRL 控制和状态寄存器:
异常请求使能
时钟源选择
计数标志位
STK_LOAD 重装载寄存器
LOAD抄到VAL中 (不变)
STK_VAL 当前寄存器
VAL进行减1然后触发中断,然后继续LOAD搬到VAL中进行-1触发中断。(减1)
STK_CALIB 用来校准的(一般不用)
系统中断案例 LED闪烁
通过系统定时器的中断,每隔1s让LED1灯闪烁一次
首先systick定时器不够1s,所以只能自己建立一个外部的标志位,用来定时。
内核中断没有明确中断标志位,所以没有清零操作
core_cm3.h里面有初始化函数
SysTick_Config(72000);
systick.c
cs
#include "systick.h"
void Systick_Init(void){
// //1.时钟源选择72MHz
// SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
// //2.
// SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
// //3.因为重装载要发生多次需要写成n-1,如果只触发1次那么不需要-1
// SysTick->LOAD = 72000-1;
// SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
// NVIC_SetPriorityGrouping(3);
// NVIC_SetPriority(SysTick_IRQn,4);
// // NVIC_SetPendingIRQ(SysTick_IRQn);
SysTick_Config(72000);
}
uint16_t count = 0;
//向量从中断向量表中寻找
void SysTick_Handler (void){
count ++;
if (count == 1000){
count = 0;
LED_Toggle(LED1);
}
}
systick.h
cs
#ifndef __SYSTICK_H__
#define __SYSTICK_H__
#include "stm32f10x.h"
#include "led.h"
void Systick_Init(void);
#endif /* __SYSTICK_H__ */
main.c
cs
#include "usart1.h"
#include "string.h"
#include <stdio.h>
#include "m24c02.h"
#include "i2c.h"
#include "led.h"
#include "systick.h"
#include "tim6.h"
int main(void){
Usart1_Init();
LED_Init();
Systick_Init();
while (1)
{
}
}
Hal库操作
整个初始化逻辑在HAL_InitTick(TICK_INT_PRIORITY);