STM32学习|定时器让LED闪烁

main.c

#include "config.h"
#include "led.h"
#include "timer.h"




int main(void)
{	
	/* LED 端口初始化 */
	LED_GPIO_Config();	
  //定时器初始化	
 time6_init(10000,7200);
  
	while (1);
	
}

timer.c

#include "timer.h"

/* TIM6中断优先级配置函数 */
void NVIC_TIM6Enable(void)
{
    NVIC_InitTypeDef NVIC_initstructure;

    NVIC_initstructure.NVIC_IRQChannel = TIM6_IRQn;           //选择TIM6中断通道
    NVIC_initstructure.NVIC_IRQChannelCmd = ENABLE;           //使能中断通道
    NVIC_initstructure.NVIC_IRQChannelPreemptionPriority = 0; //设定抢占优先级为0
    NVIC_initstructure.NVIC_IRQChannelSubPriority = 0;        //设定响应优先级为0
    NVIC_Init(&NVIC_initstructure);
}

/* 定时器6初始化函数,period-计数周期,Prescaler-预分频值 */
void time6_init(u16 per,u16 pre)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);        //使能TIM6时钟
    TIM_TimeBaseStructure.TIM_Period = per-1;                   //设定自动重装载计数值
    TIM_TimeBaseStructure.TIM_Prescaler = pre-1;                //设定预分频系数
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                //基本定时器没有时钟分频功能,此项会被忽略
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置向上计数模式
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);             //初始化TIM6
    NVIC_TIM6Enable();                                          //初始化TIM6中断优先级
    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);                 //清除中断标志位,否则启动中断会先进中断服务函数
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE );                 //使能TIM6中断
    TIM_Cmd(TIM6, ENABLE);                                      //使能TIM6定时器
}

timer.h

#ifndef _TIMER_H
#define _TIMER_H

#include "config.h"

void time6_init(u16 per,u16 pre);

#endif

定时器中断函数放stm32f10x_it.c这个文件里,代码如下

void TIM6_IRQHandler(void)
{
    static int flag = 0; //定义LED状态标志位,初始状态为0

    if (TIM_GetITStatus(TIM6, TIM_FLAG_Update) == SET) //检测是否为定时器溢出中断
    {
        TIM_ClearITPendingBit(TIM6, TIM_FLAG_Update);  //清除中断标志位
        flag = !flag;
        if (flag == 0)
        {
           LED1_OFF;
        }
        else
        {
           LED1_ON;
        }
    }
}

config.c

#include"config.h"



void delay_us(u16 us)
{
	u8 i;	
	while (us--)
	{
		for(i=8;i>0;i--);		
	}
}


void delay_ms(u16 nms)
{ 	
	while (nms--)
	{
		delay_us(960);
	}            
}

void Delay(u32 nCount)	 //简单的延时函数
{
	for(; nCount != 0; nCount--);
}


/* 1/4微秒延时函数(含函数调用及返回时间共计耗时约1/4微妙@72MHz主频) */
void delay_qus(void)
{
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
	__ASM ("nop");
}

config.h


#ifndef _CONFIG_H
#define _CONFIG_H
#include "stm32f10x.h"

/**************************************????*********************************************/
//?????
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 


#define GPIOA_ODR_Addr    (GPIOA_BASE+12) 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12)  
#define GPIOC_ODR_Addr    (GPIOC_BASE+12)  
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12)   
#define GPIOG_ODR_Addr    (GPIOG_BASE+12)     

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8)  
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8)  
 

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)   
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n) 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)   

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n) 

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)   
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  


void delay_us(uint16_t us);
void delay_ms(uint16_t nms);

void Delay(u32 nCount);
void delay_qus(void);





#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白q_5793545

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值