13.2  硬件设计 

本实验用到的硬件资源有: 

1) 指示灯 DS0 和 DS1 

2) 定时器 TIM3 

本章将通过 TIM3的中断来控制 DS1的亮灭,DS1是直接连接到PE5上的,这个前面已经

有介绍了。而TIM3属于 STM32的内部资源,只需要软件设置即可正常工作。  

//tim.h

#ifndef __TIM_H__
#define __TIM_H__

#include "stm32f10x.h"
#include "bitband.h"

void TIM3_Configuration(u16 arr,u16 psc);
void TIM3_IRQHandler(void);


#endif

//time.c


#include "tim.h"

//通用定时器 3 中断初始化 
//这里时钟选择为 APB1 的 2 倍,而 APB1 为 36M 
//arr:自动重装值。 
//psc:时钟预分频数 
//这里使用的是定时器 3! 
void TIM3_Configuration(u16 arr,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //①时钟 TIM3 使能

	TIM_DeInit(TIM3);

	//定时器 TIM3 初始化 
	TIM_TimeBaseInitStruct.TIM_Period = arr;			//设置自动重装载寄存器周期的值 
	TIM_TimeBaseInitStruct.TIM_Prescaler = psc;			//设置时钟频率除数的预分频值
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;	//设置时钟分割 
	TIM_TimeBaseInitStruct.TIM_CounterMode  = TIM_CounterMode_Up;  //TIM 向上计数
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);			//②初始化 TIM3   
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); 			//③更新中断使能

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2 );
	// NVIC_DeInit();

	NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;			//TIM3 中断 
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;		        //IRQ 通道被使能 
	NVIC_Init(&NVIC_InitStruct);				  //④初始化 NVIC 寄存器

	TIM_Cmd(TIM3,ENABLE);		  //⑤使能 TIM3 


}

//定时器 3 中断服务程序⑥ 
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)  //检查发生的中断是否为 TIM3 更新中断。==SET表示TIM3 更新中断发生
	{
		LED0 = !LED0;
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除 TIM3 更新中断标志   
	} 
}

//main.c

#include "MyTime.h"
#include "tim.h"
#include "gpio.h"
#include "bitband.h"


int main(void)
{
		MySysTick_Init();
	GPIO_Configuration();
	TIM3_Configuration(4999,7199);
	
	while(1)
	{
		LED1 = !LED1;
		MyDelay_ms(200);
	}
	
	
	
}

此段代码对 TIM3 进行初始化之后,进入死循环等待 TIM3 溢出中断,当 TIM3_CNT 的值等于 TIM3_ARR的值的时候,就会产生 TIM3 的更新中断,然后在中断里面取反LED1,TIM3_CNT再从0 开始计数。根据上面的公式,我们可以算出中断溢出时间为500ms。
                Tout= ((4999+1)*( 7199+1))/72=500000us=500ms。