三只蓝鲸STM32F103-----系统时间中断

Timer.c

#include "Timer.h"
#include "Led.h"

void tst_TIMER_Pulse_Init(void)
{   
    //定时器
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitData;
    //NVIC中断控制器
    NVIC_InitTypeDef NVIC_InitData;

	//开启定时器时钟, 即内部时钟 CK_INT=72M
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    //Configures the TIM2 internal Clock
    TIM_InternalClockConfig(TIM2);
    
	/*Config TIM2*/
    //时钟分频因子 ,基本定时器没有
    TIM_TimeBaseInitData.TIM_ClockDivision = TIM_CKD_DIV1;
    //配置模式为向上计数模式
    TIM_TimeBaseInitData.TIM_CounterMode = TIM_CounterMode_Up;

    /*Prescaler, Period is uint16_t, Be careful!
	 * Tout = 36000 * 2000 / 72000000 = 1s
	 * 
	 */  
    TIM_TimeBaseInitData.TIM_Prescaler = 36000 - 1;
    //自动重装载寄存器周的值 (计数值)
    TIM_TimeBaseInitData.TIM_Period = 2000 - 1;
	// 重复计数器的值,基本定时器没有
    TIM_TimeBaseInitData.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitData);
    
    // 清除计数器中断标志位
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    // 开启计数器中断
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    
	/*Config INTE*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    

    NVIC_InitData.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitData.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitData.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitData.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitData);
    
	/*START*/
    TIM_Cmd(TIM2, ENABLE);
}

//定时器中断服务函数
void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    {
        //Clear flag
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
		
		//
		tst_LED_Toggle();
    }
}

Timer.h

#ifndef _TIMER_H
#define _TIMER_H

//
#include "main.h"

//
void tst_TIMER_Pulse_Init(void);

void tst_TIMER_PWM_Init(void);


//
#endif

PWM.c

#include "PWM.h"

//PWM GPIO PA6,PA7,PB0,PB1
void tst_TIMER_PWM_Init(void)
{
    GPIO_InitTypeDef GPIO_InitData;
	//TIM基本定时器
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseData;
    //TIMinit_struct
	TIM_OCInitTypeDef  TIM_OCInitData;
	
	uint16_t CCR1_Val = 500;
	uint16_t CCR2_Val = 400;
	uint16_t CCR3_Val = 300;
	uint16_t CCR4_Val = 200;
	uint16_t PrescalerValue = 0;
	
	/* TIM3 clock enable */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

	/* GPIOA and GPIOB clock enable */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
	
	/* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */
	GPIO_InitData.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitData.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitData.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init(GPIOA, &GPIO_InitData);

	GPIO_InitData.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_Init(GPIOB, &GPIO_InitData);
	
	/* Compute the prescaler value */
	/*    - Prescaler = (TIM3CLK / TIM3 counter clock) - 1 */
	//PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
	
	/*
	  The TIM3 is running at 36 KHz: 
	  TIM3 Frequency = TIM3 counter clock/(ARR + 1)
                     = 24 MHz / 666 = 36 KHz
	*/
	TIM_TimeBaseData.TIM_Period = 2000-1;
	TIM_TimeBaseData.TIM_Prescaler = 72-1;
	
	TIM_TimeBaseData.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseData.TIM_CounterMode = TIM_CounterMode_Up;

	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseData);

	/* PWM1 Mode configuration: Channel1 */
	/*
	   The TIM3 CCR1 register value is equal to 333, 
	   so the TIM3 Channel 1 generates a PWM signal with a frequency
	   equal to 36 KHz and a duty cycle equal to 50%:
	   TIM3_ARR = 665;
	   TIM3 Channel1 duty cycle = (TIM3_CCR1/ (TIM3_ARR + 1))* 100 = 50%
	*/
	
	TIM_OCStructInit(&TIM_OCInitData);
	
	/* PWM1 Mode configuration: Channel1 */
    //Specifies the TIM mode.
	TIM_OCInitData.TIM_OCMode = TIM_OCMode_PWM1;
    //Specifies the TIM Output Compare state.
	TIM_OCInitData.TIM_OutputState = TIM_OutputState_Enable;
    //Specifies the output polarity.
	TIM_OCInitData.TIM_OCPolarity = TIM_OCPolarity_High;
    //Specifies the pulse value to be loaded into the Capture Compare Register.
	TIM_OCInitData.TIM_Pulse = CCR1_Val;
    //Initializes the TIMx Channel1 according to the specified
	TIM_OC1Init(TIM3, &TIM_OCInitData);
    //Enables or disables the TIMx peripheral Preload register on CCR1.
	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
	
	/* PWM1 Mode configuration: Channel2 */
	TIM_OCInitData.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitData.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitData.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitData.TIM_Pulse = CCR2_Val;

	TIM_OC2Init(TIM3, &TIM_OCInitData);
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
	
	/* PWM1 Mode configuration: Channel3 */
	TIM_OCInitData.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitData.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitData.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitData.TIM_Pulse = CCR3_Val;

	TIM_OC3Init(TIM3, &TIM_OCInitData);
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
	
	/* PWM1 Mode configuration: Channel4 */
	TIM_OCInitData.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitData.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitData.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitData.TIM_Pulse = CCR4_Val;

	TIM_OC4Init(TIM3, &TIM_OCInitData);
	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
	
	//TIM_ARRPreloadConfig(TIM3, ENABLE);
	
	//TIM_CtrlPWMOutputs(TIM3,ENABLE);
	
	/* TIM3 enable counter */
	TIM_Cmd(TIM3, ENABLE);
}

PWM.h

#ifndef _PWM_H_
#define _PWM_H_

#include "main.h"

void tst_TIMER_PWM_Init(void);

#endif

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值