STM32_Study: STM32_Study (gitee.com)
不逼逼 貼代碼
tim.c
#include "stm32f10x.h"
#include "tim.h"
#include <stdio.h>
uint8_t Num;
/**
* @brief 初始化tim2 內部 普通時鐘
*
*/
void tim2_internal_init_p(uint16_t period, uint16_t prescale)
{
// 1.使能時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 2.使用內部時鐘 //可不寫 system_init(); 中會有設置
TIM_InternalClockConfig(TIM2);
// 3.初始化時基時鐘 設置1s 計數器溢出頻率:CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
TIM_TimeBaseInitTypeDef tim_time_base_init_type_def;
tim_time_base_init_type_def.TIM_ClockDivision = TIM_CKD_DIV1; //分頻
tim_time_base_init_type_def.TIM_CounterMode = TIM_CounterMode_Up; //模式 向上計數
tim_time_base_init_type_def.TIM_Period = 10000 - 1; //周期 ARR 自動重裝器的值 (最大65536)
tim_time_base_init_type_def.TIM_Prescaler = 7200 - 1; // PSC預分頻 (最大65535)
tim_time_base_init_type_def.TIM_RepetitionCounter = 0; //高級定時器的重復計數器的值
TIM_TimeBaseInit(TIM2, &tim_time_base_init_type_def);
// 防止TIM_TimeBaseInit方法最后的語句在系統啟動時調用中斷,如下:
// Generate an update event to reload the Prescaler and the Repetition counter values immediately
// TIMx->EGR = TIM_PSCReloadMode_Immediate;
// 清除標志位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
// 4.使能中斷
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //更新中斷
// 5.NVIC 優先級分組 開啟初始化并開啟中斷
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef nvic_init_type_def;
nvic_init_type_def.NVIC_IRQChannel = TIM2_IRQn; //中斷通道
nvic_init_type_def.NVIC_IRQChannelCmd = ENABLE; //使能
nvic_init_type_def.NVIC_IRQChannelPreemptionPriority = 2; //搶占優先級
nvic_init_type_def.NVIC_IRQChannelSubPriority = 1; //響應優先級
NVIC_Init(&nvic_init_type_def);
// 6.使能定時器
TIM_Cmd(TIM2, ENABLE);
}
void tim2_internal_init(void)
{
tim2_internal_init_p(10000 - 1, 7200 - 1);
}
/**
* @brief 初始化tim2 外部 普通時鐘
*
*/
void tim2_external_init(void)
{
// 1.使能時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 2.gpio 初始化
GPIO_InitTypeDef gpio_init_type_def;
gpio_init_type_def.GPIO_Mode = GPIO_Mode_IPU;
gpio_init_type_def.GPIO_Pin = GPIO_Pin_0;
gpio_init_type_def.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_init_type_def);
// 3.使用外部時鐘
// TIM_InternalClockConfig(TIM2);
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);
// 4.初始化時基時鐘 設置1s 計數器溢出頻率:CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
TIM_TimeBaseInitTypeDef tim_time_base_init_type_def;
tim_time_base_init_type_def.TIM_ClockDivision = TIM_CKD_DIV1; //分頻
tim_time_base_init_type_def.TIM_CounterMode = TIM_CounterMode_Up; //模式 向上計數
tim_time_base_init_type_def.TIM_Period = 10 - 1; //周期 ARR 自動重裝器的值 (最大65536)
tim_time_base_init_type_def.TIM_Prescaler = 1 - 1; // PSC預分頻 (最大65535)
tim_time_base_init_type_def.TIM_RepetitionCounter = 0; //高級定時器的重復計數器的值
TIM_TimeBaseInit(TIM2, &tim_time_base_init_type_def);
// 防止TIM_TimeBaseInit方法最后的語句在系統啟動時調用中斷,如下:
// Generate an update event to reload the Prescaler and the Repetition counter values immediately
// TIMx->EGR = TIM_PSCReloadMode_Immediate;
// 清除標志位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
// 5.使能中斷
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //更新中斷
// 6.NVIC 優先級分組 開啟初始化并開啟中斷
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef nvic_init_type_def;
nvic_init_type_def.NVIC_IRQChannel = TIM2_IRQn; //中斷通道
nvic_init_type_def.NVIC_IRQChannelCmd = ENABLE; //使能
nvic_init_type_def.NVIC_IRQChannelPreemptionPriority = 2; //搶占優先級
nvic_init_type_def.NVIC_IRQChannelSubPriority = 1; //響應優先級
NVIC_Init(&nvic_init_type_def);
// 7.使能定時器
TIM_Cmd(TIM2, ENABLE);
}
/**
* @brief
* 為避免其它文件重定義該函數,注銷該代碼.如使用,請打開.
*
*/
// void TIM2_IRQHandler(void)
// {
// if (TIM_GetITStatus(TIM2, TIM_IT_Update))
// {
// Num++;
// printf("Num:%d", Num);
// TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
// }
// }
tim.h
#include "stm32f10x.h"
#ifndef __TIM_H__
#define __TIM_H__
void tim2_internal_init_p(uint16_t period,uint16_t prescale);
void tim2_internal_init(void);
void tim2_external_init(void);
#endif