|
void bsp_InitTimer(void)
{
uint8_t i;
/* 清零所有的软件定时器 */
for (i = 0; i < TMR_COUNT; i++)
{
s_tTmr[i].Count = 0;
s_tTmr[i].PreLoad = 0;
s_tTmr[i].Flag = 0;
s_tTmr[i].Mode = TMR_ONCE_MODE; /* 缺省是1次性工作模式 */
}
/*
配置systic中断周期为1ms,并启动systick中断。
SystemCoreClock 是固件中定义的系统内核时钟,对于STM32F4XX,一般为 168MHz
SysTick_Config() 函数的形参表示内核时钟多少个周期后触发一次Systick定时中断.
-- SystemCoreClock / 1000 表示定时频率为 1000Hz, 也就是定时周期为 1ms
-- SystemCoreClock / 500 表示定时频率为 500Hz, 也就是定时周期为 2ms
-- SystemCoreClock / 2000 表示定时频率为 2000Hz, 也就是定时周期为 500us
对于常规的应用,我们一般取定时周期1ms。对于低速CPU或者低功耗应用,可以设置定时周期为 10ms
*/
SysTick_Config(SystemCoreClock / 2000);
bsp_InitHardTimer();
}
#if defined (USE_TIM2) || defined (USE_TIM3) || defined (USE_TIM4) || defined (USE_TIM5)
void bsp_InitHardTimer(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
uint32_t usPeriod;
uint16_t usPrescaler;
uint32_t uiTIMxCLK;
/* 使能TIM时钟 */
RCC_APB1PeriphClockCmd(TIM_HARD_RCC, ENABLE);
/*-----------------------------------------------------------------------
system_stm32f4xx.c 文件中 void SetSysClock(void) 函数对时钟的配置如下:
HCLK = SYSCLK / 1 (AHB1Periph)
PCLK2 = HCLK / 2 (APB2Periph)
PCLK1 = HCLK / 4 (APB1Periph)
因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;
APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13,TIM14
APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
----------------------------------------------------------------------- */
uiTIMxCLK = SystemCoreClock / 2;
usPrescaler = uiTIMxCLK / 1000000 ; /* 分频到周期 1us */
#if defined (USE_TIM2) || defined (USE_TIM5)
usPeriod = 0xFFFFFFFF; /* 407支持32位定时器 */
// usPeriod = 0xFFFF; /* 103支持16位 */
#else
usPeriod = 0xFFFF;
#endif
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = usPeriod;
TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM_HARD, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/* TIMx enable counter */
TIM_Cmd(TIM_HARD, ENABLE);
/* 配置TIM定时中断 (Update) */
{
NVIC_InitTypeDef NVIC_InitStructure; /* 中断结构体在 misc.h 中定义 */
NVIC_InitStructure.NVIC_IRQChannel = TIM_HARD_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4; /* 比串口优先级低 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
}
#endif
#ifdef USE_TIM2
void TIM2_IRQHandler(void)
#endif
#ifdef USE_TIM3
void TIM3_IRQHandler(void)
#endif
#ifdef USE_TIM4
void TIM4_IRQHandler(void)
#endif
#ifdef USE_TIM5
void TIM5_IRQHandler(void)
#endif
void TIM3_IRQHandler(void)
{
flag=1;
}
|
|