/*定时器1ms中断,死等定时器延时*/
/*File Timer.c */
#include "stm32f10x.h"
unsigned int TimeDelay = 0;
void TIM1_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIM1); /*复位TIM1定时器*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); /*开时钟*/
TIM_TimeBaseStructure.TIM_Period = 100; /*时钟滴答的次数,够数中断这里是1ms中断一次*/
TIM_TimeBaseStructure.TIM_Prescaler = 720-1; /* 分频720*/
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*计数方向向上计数*/
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* Clear TIM1 update pending flag 清除TIM1溢出中断标志] */
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; /*溢出中断*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); /* Enable TIM1 Update interrupt TIM1溢出中断允许*/
}
void Timer1Config(void)
{
TIM1_Configuration();
}
void TimeDelayMs(unsigned int Num)
{
TimeDelay = Num;
TIM1->CNT = 0;
TIM1->CR1 |= TIM_CR1_CEN; /*开启Timer1计数*/
while(TimeDelay);
TIM1->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN)); /*关闭Timer1*/
}
/*File stm32f10x_it.c */
/*添加中断处理函数*/
void TIM1_UP_IRQHandler(void)
{
gUINT32 CPUStatus;
G_ENTER_CRITICAL();
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
if(TimeDelay > 0)
{
TimeDelay--;
}
G_EXIT_CRITICAL();
}
/*File startup_stm32f10x_hd.s*/
/*添加中断入口*/
TIM1_UP_IRQHandler PROC
EXPORT TIM1_UP_IRQHandler [WEAK]
B .
ENDP
;//去掉下面代码;
EXPORT TIM1_UP_IRQHandler [WEAK]
;//也去掉这个;
TIM1_UP_IRQHandler
/*File Main.c*/
void main()
{
Timer1Config();
for(;;)
{
// G_DEBUGF(G_DEBUG_ALWAYS,("LED_ON\r\n"));
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
TimeDelayMs(1000);
// G_DEBUGF(G_DEBUG_ALWAYS,("LED_OFF\r\n"));
GPIO_SetBits(GPIOB,GPIO_Pin_4);
TimeDelayMs(1000);
}
}