STM32定时器中断

写在前面

本实验的目的是通过定时器中断控制LED灯的亮灭。

笔者所用IDE为IAR,采用标准库(3.5固件库),通过定时器产生中断来控制LED。

led.h文件

#ifndef __LED_H
#define __LED_H

#include "stm32f10x_gpio.h"
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"

void TIM3_Config(void);

#endif

led.c文件 

#include "led.h"

void TIM3_IRQHandler(void)//定时器中断服务函数
{
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除溢出中断标志
   
    if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0))//读GPIO_Pin_0电平,如果为1,置为0;如果为0,置为1;
        GPIO_ResetBits(GPIOA,GPIO_Pin_0);
    else
        GPIO_SetBits(GPIOA,GPIO_Pin_0); 
}

void TIM3_Config(void)//定时器中断配置
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  //自定义结构体
    GPIO_InitTypeDef GPIO_InitStructure;   //自定义结构体
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//打开相应时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开时钟
        
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//LED   选择引脚0  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50MHz
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //带上拉电阻输出
    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA
        
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置为1组
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //定时器3中断配置
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级1级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级1级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure); //初始化 
    
    TIM_TimeBaseStructure.TIM_Period = 10000-1;    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 
    TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; //设置用来作为TIMx时钟频率除数的预分频值  10KHz  1秒产生10000个脉冲 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
   
    TIM_ITConfig(TIM3,TIM_IT_Update ,ENABLE);//TIM3中断使能
    TIM_Cmd(TIM3,ENABLE);   //开启定时器3  
}

 主函数main.c

#include "led.h"

int main()
{
    TIM3_Config();//函数调用
    while(1)
    {
    ;
    }
}

程序编译下载后,可以看到LED每隔1s亮一次。

欢迎大家批评指正。

 

 

 

发布了16 篇原创文章 · 获赞 9 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览