写在前面
本实验的目的是通过定时器中断控制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亮一次。
欢迎大家批评指正。