STM32F407系列文章目录
第一章 获取相关组件(注意:下载或安装不要有中文路径)
第二章 新建工程
第三章 GPIO相关配置实验
第四章 串口实验
第五章 外部中断实验
第六章 看门狗实验
第七章 定时器中断实验
前言
本文章采用Keil5及STM32F4(SDK-设计资源)进行STM32F407(ARM芯片)系列学习
- 萌新入坑,如有不对的地方请大佬多多指教,谢谢!->欢迎评论区留言
- 对于萌新来说,学习无非就是多看博文,但是…0.0大佬们的思维大多都有些跳跃,真的很难理解(当然大佬们估计都是为了记录或者提醒自己的工作及学习例程),所以想通过慢慢学习,把每一步都解释出来(保姆版)
第七章 定时器中断实验
1.原理图
-
MCU引脚
-
涉及外设
2. 代码示例
- timer.c
- 库函数版本
#include "timer.h"
//通用定时器3中断初始化
//arr:自动重装值
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟
TIM_TimeBaseInitStructure.TIM_Period = arr; // 自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler = psc; // 定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); // 初始化TIM3
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 允许定时器3更新中断
TIM_Cmd(TIM3, ENABLE); // 使能定时器3
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // 定时器3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; // 抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; // 子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) // 溢出中断
{
;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中断标志位
}
- 寄存器版本
#include "timer.h"
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为42M
//arr:自动重装值
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr, u16 psc)
{
RCC->APB1ENR |= 1 << 1; // TIM3时钟使能
TIM3->ARR = arr; // 设定计数器自动重装值
TIM3->PSC = psc; // 预分频器
TIM3->DIER |= 1 << 0; // 允许更新中断
TIM3->CR1 |= 0x01; // 使能定时器3
MY_NVIC_Init(1, 3, TIM3_IRQn, 2); // 抢占1,子优先级3,组2
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)
{
if (TIM3->SR & 0X0001) // 溢出中断
{
;
}
TIM3->SR &= ~(1 << 0); // 清除中断标志位
}
- timer.h
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void TIM3_Int_Init(u16 arr, u16 psc);
#endif
- main.c
#include "sys.h"
#include "delay.h"
#include "timer.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置系统中断优先级分组2
//Stm32_Clock_Init(336, 8, 2, 7); // 设置时钟,168Mhz
delay_init(168); // 延时初始化
TIM3_Int_Init(5000-1, 8400-1); // 10Khz的计数频率,计数5K次为500ms
while(1)
{
;
}
}
总结
本章为TMS320F280049学习系列文章 第七章:定时器中断实验