原作者:http://www.eeworld.com.cn/mcu/article_2016082828940.html
配置流程:
1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。
2:IO口初始化,包括引脚,速率,输入输出模式等。 3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。 4:TIM3初始化:包括自动重装值,分频值,计数模式,使能TIM中断,使能TIM3外设 5:中断处理函数:注意清除TIMx的中断待处理位 注意: 1:RCC初始化要使能或者失能 APB1 外设时钟。 2:中断处理函数:注意清除TIMx的中断待处理位 TIMx_SR寄存器 3:关于时钟:初始化RCC时使用SystemInit()函数时默认的是AHB不分频,即HCLK等于SYSHCLK,APB2不分频,APB1为HCLK 2分频而定时器3时钟使能在RCC_APB1ENR寄存器中定义,因此TIM3时钟为36M
原程序为:
#include"stm32f10x.h" #include"stm32f10x_tim.h" #define LED0_OFF GPIO_SetBits(GPIOA,GPIO_Pin_8)// LED0关 #define LED0_ON GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0开 u16 i=0; //初始化IO端口 void IO_Configuart(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义 GPIO_InitStructure为 GPIO_InitTypeDef结构体类型 //LED0 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //引脚选择 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50MHz速率 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 } //复位和系统时钟控制 void RCC_Configuare(void) { SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率 RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统 //使能GPIOA,GPIOD端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能或者失能 APB1 外设时钟 // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟 /* 也可以写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE); 更加简洁*/ } //NVIC设置 系统中断管理 void NVIC_Configuare(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位 从优先级4位 //使能TIM3中断 NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F; //先占优先级0位,从优先级4位 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F; // NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } //初始化TIM3 1ms 定时 void TIM3_Configuare(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //TOUT=ARR*(PSC+1)/Tclk ARR=10 PSC=3599 Tclk=36M TOUT=0.001s=1ms TIM_TimeBaseStructure.TIM_Period = 10; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到10为1ms TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值 这里是7200分频 72M=72000000 ; 72000000 /7200=10000; TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE); //使能或者失能指定的 TIM 中断 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设 } int main (void) { RCC_Configuare(); IO_Configuart(); NVIC_Configuare(); TIM3_Configuare(); LED0_OFF; while(1) { } } //TIM3中断处理函数 void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //检查指定的 TIM 中断发生与否 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 i++; if(i==1000) { LED0_ON; } if(i==2000) { LED0_OFF; i=0; } } }