基于STM32F103C8T6的通用定时器中断控制LED的闪烁

#一、项目所需外设
#二、项目代码

一、项目所需外设

1、通用定时器

1.通用定时器位于ABP1低速总线上
2.16位向下,向上/向下(中心对齐模式)计数模式,自动重装载计数器(TIMx_CNT)
3.16位可编程(可以实现修改)预分频器(TIMx_PSC),计数器时钟频率的分频系为1-65535任意数值
4.四个独立通道(TIMx_CH1~4),通道用来支持
1)输入捕获
2)输入比较
3)PWM生成
4)单脉冲模式输出

5.可使用外部信号(TIM_ETR)控制定时器和定时器互联的同步电路

2、通用定时器中断/事件产生:(六个独立的IRQ/DMA请求生成器)

1.更新:计数器向上/向下溢出,计数器初始化(软件或者外部/内部触发)
2.触发事件:计数器的启动,停止,初始化或者由内部/外部触发计数
3.输入捕获
4.输出比较

STM32通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获),或者产生输入波形(输出比较和PWM)等

3、通用定时器计数模式:

STM32通用定时器可以向上向下向上或者向下双向计数模式

1.向上计数模式:计数值从0计数到自动加载值(TIM_ARR),产生一个计数溢出事件,然后重新从0开始计数
2.向下计数模式:计数器从自动装入的值(TIM_ARR)开始向下计数到0,产生一个计数溢出事件,然后从计数装入值重新开始
3.中央对齐模式:计数器从0开始到(自动装入值-1)产生计数溢出事件,然后向下计数到1,产生定时器溢出事件,然后从0开始计数

4、通用定时器工作模式:

1.时钟部分:(时钟来源)
1)内部时钟APB1倍频器
2)外部引脚(通用定时器2,3,4)
3) 其他定时器
4)外部通道

2.时基单元:
1)预分频(除法)
2)计数器时钟
3)自动重装载值

3.输入部分:
1)输入引脚
2)边沿检测

4.输出部分:
1)输出比较寄存器
2)周期——重装载值
3)占空比——比较值

二、项目代码

main.c

#include "stm32f10x.h"
#include "main.h"
#include "LED.h"
#include "usart.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"
#include "tim.h"

void delay(uint16_t time)//延迟函数
{
		uint16_t i=0;
	  while(time--)
		{
				i=12000;
			  while(i--);
		}
}



int  main()
{
	 usart_init();//串口初始化
	 tim_config();//定时器初始化
	 LED_Init();//LED初始化
	
	 while(1)
	 {
       
		  
	 }
	
}

//配置中断服务函数
void TIM2_IRQHandler(void)
{
	  static uint16_t temp; //定义静态变量
			
		if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//判断是否发生中断
		{
			 	if(temp++%2==1)//实现灯的一秒闪烁
				{
						GPIO_ResetBits(GPIOA,GPIO_Pin_1);//开灯
				
				}
				else
				{
						GPIO_SetBits(GPIOA,GPIO_Pin_1);//关灯
				
				}
				
		}
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位

}



	




tim.c

#include "stm32f10x.h"
#include "tim.h"


void tim_config(void)
{
	
	    TIM_TimeBaseInitTypeDef TIMinitstruct;//定时器结构体初始化
	    NVIC_InitTypeDef nvicinstruct;
	
	    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置中断优先组为1
	  //1.使能定时器时钟
	    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//配置定时器时钟
	
	  //2.开启定时器中断,配置中断结构体
		
	    TIMinitstruct.TIM_ClockDivision  =  TIM_CKD_DIV1;//1分频
	    TIMinitstruct.TIM_CounterMode    =  TIM_CounterMode_Up;//计数模式为向上计数
	    TIMinitstruct.TIM_Period         =  10000-1;//设定重装载值为9999
	    TIMinitstruct.TIM_Prescaler      =  7200-1;//设定分频系数为7199
	
	    TIM_TimeBaseInit(TIM2,&TIMinitstruct);//定时器初始化
	     
			TIM_Cmd(TIM2,ENABLE);//使能定时器
	
	    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能定时器中断,允许定时器更新
	    
	    nvicinstruct.NVIC_IRQChannel    = TIM2_IRQn;//配置通道
	    nvicinstruct.NVIC_IRQChannelCmd =	ENABLE;//使能通道
      nvicinstruct.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级为1
      nvicinstruct.NVIC_IRQChannelSubPriority        =	1;//子优先级为1
			
			NVIC_Init(&nvicinstruct);//初始化中断控制器
			
	    
}


tim.h

#include "stm32f10x.h"

void tim_config(void);



led.c

#include "LED.h"
#include "stm32f10x.h"

void LED_Init(void)
{
	
	GPIO_InitTypeDef LED_Init;
	//1.使能ABP2的时钟GPIOA
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//2.结构体配置
	LED_Init.GPIO_Mode  = GPIO_Mode_Out_PP;
	LED_Init.GPIO_Pin   = GPIO_Pin_1;
	LED_Init.GPIO_Speed = GPIO_Speed_10MHz;
	
	GPIO_Init(GPIOA, &LED_Init);

	
	
	
	
	
}


led.h

#include "stm32f10x.h"

void LED_Init(void);

  • 1
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值