
#include "stm32f4xx.h"
/******************************************************************\
** 文 件 名: mian.c ***********************************************
** 库 版 本: STM32F4xx_DSP_StdPeriph_Lib_V1.0.1 ******************
** 工作环境: RealView MDK-ARM 4.23 ******************************
** 作 者: 曾有根 **********************************************
** 生成日期: 2012-08-03 *******************************************
** 功 能: TIM定时器,正常情况下是PE7所在的led灯亮,当计时 **
** 到后就让PE8所在的led灯闪烁一次 *********************
\\*******************************************************************/
extern void led_init(void);
extern void delay(unsigned int dl);
extern void NVIC_Config(void);
extern void Timer_Config(void);
//extern void RCC_Configuration(void);
int main()
{
SystemInit();
led_init();
NVIC_Config();
Timer_Config();
while(1)
{
GPIO_SetBits(GPIOE, GPIO_Pin_7 ) //LED1灯闪烁,表示数据发送完成
delay(2000);
GPIO_ResetBits(GPIOE, GPIO_Pin_7 );
delay(2000);
}
}
相关配置systick_config.c文件如下:
#include "stm32f4xx.h"
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO_LED Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8; //led IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //模式:输出
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //本实验板屏蔽是因为硬件上自带了上拉电阻
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M翻转
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
void delay(unsigned int dl)
{
unsigned int i,y;
for(i = 0; i < 5000; i++)
{
for(y = 0; y < dl; y++);
}
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void Timer_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 基础设置*/
TIM_TimeBaseStructure.TIM_Period = 25000; //计数值
TIM_TimeBaseStructure.TIM_Prescaler = 33600-1; //预分频,此值+1为分频的除数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!= RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);
GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED2灯闪烁,表示数据接收成功且发送完成
delay(2000);
GPIO_ResetBits(GPIOE, GPIO_Pin_8 );
}
}
说明:本例程已经经本人下载至STM32F4的开发板上成功调试,LED能够正常的翻转!可供广大奋斗在前线的机油们参考,重点讲解一下定时器配置的关键语句:
TIM_TimeBaseStructure.TIM_Period = 25000; //计数值 ①
TIM_TimeBaseStructure.TIM_Prescaler = 33600-1; //预分频,此值+1为分频的除数! ②
①假设频率为168M(具体多少根据芯片而定),则168 000 000 ÷ 33 600 = 5 000 ;此数(5000)表示定时器1s的时间可以计数到5000 ,计数值为2 5000,则计数器要经过5s(2 5000 ÷ 5 000 = 5)的时间才能计数到25000,所以此配置为5s的定时!
