当前位置: 首页 > news >正文

STM32入门学习之定时器中断

1.STM32的通用定时器是可编程预分频驱动的16位自动装载计数器。

STM32 的通用定时器可以被用于:测量输入信号的脉冲长度 ( 输入捕获 ) 或者产生输出波
( 输出比较和 PWM) 等。
使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形
周期可以在几个微秒到几个毫秒间调整。 STM32 的每个通用定时器都是完全独立的,没有互相
共享的任何资源。
2.相关寄存器:
(1)控制寄存器TIMx_CR1:本次实验中只使用到了最低位,即计数器使能位。
(2) DMA/ 中断使能寄存器( TIMx_DIER ):本次实验中只使用到了最低位,允许更新中断。

 (3)预分频寄存器(TIMx_PSC):该寄存器用来设置对时钟的分频。

 (4)自动重装载寄存器(TIMx_ARR):

(5) 状态寄存器(TIMx_SR):

3.设计思路:通过设置设置通用定时器的中断,并在定时器中断服务函数中反转LED灯。首先,使能定时器的时钟。然后,配置定时器的相关信息 和中断管理的相关信息。最后,编写定时器中断的中断服务函数。

4.代码:

(1)LED:

#ifndef __LED_H
#define	__LED_H#include "stm32f10x.h"void LED_Init(void);#endif
#include "led.h"void LED_Init(void)
{//¶¨Òå¶Ë¿ÚµÄ½á¹¹Ìå:GPIO_InitTypeDef GPIO_InitStruct;//1.ʹÄÜʱÖÓ£ºRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOA,ENABLE);//2.ÅäÖö˿ڽṹÌåµÄÏà¹ØÐÅÏ¢£º£¨LED1£©GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStruct);//ÅäÖÃLED0£ºGPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;GPIO_Init(GPIOA,&GPIO_InitStruct);//³õʼʱ½«LEDµÄ¶Ë¿Ú¶¼ÖÃΪ1£¬¼´Ï¨ÃðGPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_SetBits(GPIOD,GPIO_Pin_2);
}

(2)TIME:

#ifndef __TIME_H
#define __TIME_H#include "stm32f10x.h"void TIME_Init(u16 arr,u16 psc);#endif
#include "time.h"void TIME_Init(u16 arr,u16 psc)
{//¶¨Ò嶨ʱÆ÷ºÍÖжϽṹÌ壺TIM_TimeBaseInitTypeDef TIM_TimBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;//1.ʹÄܶ¨Ê±Æ÷ʱÖÓ;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//2.³õʼ»¯time3£ºTIM_TimBaseStructure.TIM_Period = arr;						//ÉèÖÃ×Ô¶¯ÖØ×°ÔؼĴæÆ÷µÄÖµTIM_TimBaseStructure.TIM_Prescaler = psc;TIM_TimBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;TIM_TimeBaseInit(TIM3,&TIM_TimBaseStructure);TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);								//ÔÊÐí¸üÐÂÖжÏ//3.ÖжÏÅäÖãºNVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);//4.ʹÄܶ¨Ê±Æ÷£ºTIM_Cmd(TIM3,ENABLE);
}
//ÖØÐ´time3µÄÖжϷþÎñº¯Êý£º
void TIM3_IRQHandler(void)
{static int i = 0;//¼ì²éÊÇ·ñ·¢ÉúÖжϣºif(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET){//Çå³ýtimeµÄ¸üÐÂÖжϱê־λTIM_ClearITPendingBit(TIM3,TIM_IT_Update);if(i){GPIO_SetBits(GPIOA,GPIO_Pin_8);i = !i;}else{GPIO_ResetBits(GPIOA,GPIO_Pin_8);i = !i;}}
}

(3)main:

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "time.h"int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);LED_Init();TIME_Init(4999,7199);while(1){delay_ms(1000);}}

5.运行结果:

 

 6.总结:本次实验是通过STM32的通用定时器反转LED灯。在实验库函数编程的时候,是比较方便的。但是,为了打好基础,应该去大概的了解一下相关寄存器的功能。

http://www.lryc.cn/news/111666.html

相关文章:

  • 基本数据类型与包装数据类型的使用标准
  • 小研究 - 基于 SpringBoot 微服务架构下前后端分离的 MVVM 模型(二)
  • ArmSoM-W3之RK3588安装Qt+opencv+采集摄像头画面
  • 基于长短期神经网络的风速预测,基于LSTM的风速预测
  • Mybatis引出的一系列问题-spring多数据源配置
  • Vue-组件二次封装
  • [C++]02.选择结构与循环结构
  • C语言案例 按序输出多个整数-03
  • 如何获取vivado IP列表
  • 计算机网络的定义和分类
  • 【css】超过文本显示省略号
  • Java 8 中使用 Stream 遍历树形结构
  • 网络安全防火墙体验实验
  • YOLOv5引入FasterNet主干网络,目标检测速度提升明显
  • SpringBoot运行时注入一个Bean
  • Pyspark
  • Spring Boot 项目五维度九层次分层架构实现实践研究——持续更新中
  • stm32常见数据类型
  • mac m1使用docker安装kafka
  • SpringBoot核心配置和注解
  • 第三章 图论 No.3 flody之多源汇最短路,传递闭包,最小环与倍增
  • Leetcode-每日一题【剑指 Offer 17. 打印从1到最大的n位数】
  • 远程调试MySQL内核
  • 前端学习---vue2--选项/数据--data-computed-watch-methods-props
  • UML-构件图
  • uniapp使用视频地址获取视频封面
  • java操作PDF:转换、合成、切分
  • 递增子序列——力扣491
  • 解密!品牌独立站为何能成为外国消费者的心头爱?
  • 【HDFS】每天一个RPC系列----complete(二):客户端侧