神舟IV学习笔记(七)定时器中断流水灯
扫描二维码
随时随地手机看文章
通用定时器的功能非常强大,能够测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM),也能够用于定时中断任务。其实系统滴答和实时时钟功能类似于定时器。51单片机也有定时器,可以使用软件的方式实现实时时钟的功能,就是断电后会到初始状态了。
神舟IV开发板采用的是STM32F107VCT,内部含有多达10个定时器,其中TIM1和TIM8是高级控制定时器在APB2总线上,TIM2—TIM7是挂在APB1上的,所以使用起来要注意的是,开启不同的时钟。
我们就用通用定时器TIM2实现LED以1s速度流水灯的功能。首先我们看看时钟,TIM2挂在APB1总线上,而APB1的最大时钟速度为36MHZ。由于系统初始化将APB1的分频比设置为2,所以TIM2的时钟就是APB1时钟的2倍,等于系统时钟。TIM2具有16位可编程预分频器,范围可以从1到65536之间。这里我们设置分频比为7200,得到10KHZ的计数时钟。再设置自动装载的计数值为10000,这样就得到1s的定时器间隔,最后使能中断,配置中断函数。
主要代码为:
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Set the Vector Table base address at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
/* Enable the TIM5 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
/* Setup STM32 system (clock, PLL and Flash configuration) */
SystemInit();
/* Add your application code here
*/
LED_Configuration();//LED时钟和端口配置
TIM2_Configuration();//TIM2时钟和端口配置
NVIC_Configuration();//中断配置
/* Infinite loop */
while (1)
{
}
}
void TIM2_IRQHandler(void)//定时器中断函数
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
LED_Spark();//led流水灯
}
}