嵌入式系统学习笔记之定时器实验篇
一、实验内容:编写程序操作定时器,控制LED 灯的精确定时流动效果。即第1个LED 灯亮,其余灭,持续1秒;然后第2个亮,其余灭,持续1秒;然后第 3个亮,其余灭,持续1秒;然后第4个亮,其余灭,持续1秒。如此反复。
二、实验原理
用定时器T2定时1秒钟,当定时时间到时产生中断,中断服务程序中根据当前状态设置标志位flag的值,主程序中根据flag的值点亮和熄灭相应的LED灯。
三、实验步骤
1.建立工程。
2.系统初始化:使用外部晶振,将系统时钟倍频至 72MHz。
3. GPIO 初始化配置:2MHz 推挽输出模式,用于输出控制 LED 的亮灭。
3. NVIC 初始化配置:使能TIM2 中断请求通道。
4. TIM2 初始化配置:
(1)使能APB1 时钟、使能 TIM2 时钟;
(2)设定计数器模式、自动重装载寄存器赋初值(需提前计算,16 位整型)、TIM2时钟频率除数的预分频值(16 位整型)、采样分频。
(3)使能TIM2 中断,启动定时器 TIM2。
5.编写中断服务程序:在TIM2 的中断服务程序中实现 LED 灯的流水效果。
6.通过软件仿真,查看是否达到预期效果。
四、实验结果
a.代码部分
中断服务子程序:
extern volatile unsigned char flag;
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
{
flag++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
主函数:
#include “stm32f10x.h”
#include <stdio.h>
volatile unsigned char flag=0;
unsigned int CountOfToggle=0;
void LED0_Config(void);
void LED0_On(uint16_t GPIO_Pin);
void LED0_Off(uint16_t GPIO_Pin);
unsigned char LED0_IsOn(uint16_t GPIO_Pin);
void NVIC_Config(void);
void TIM2_Config(void);
int main(void)
{
LED0_Config();
NVIC_Config();
TIM2_Config();
LED0_On(GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
while(1)
{
if (flag == 1)
{
LED0_Off(GPIO_Pin_6);
LED0_On(GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
} //if (flag)
if(flag == 2)
{
LED0_Off(GPIO_Pin_7);
LED0_On(GPIO_Pin_6| GPIO_Pin_8 | GPIO_Pin_9);
}
if(flag == 3)
{
LED0_Off(GPIO_Pin_8);
LED0_On(GPIO_Pin_6| GPIO_Pin_7 | GPIO_Pin_9);
}
if(flag == 4)
{
LED0_Off(GPIO_Pin_9);
LED0_On(GPIO_Pin_6| GPIO_Pin_8 | GPIO_Pin_7);
}
if(flag > 4)
{
flag=0;
LED0_On(GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
}
}
}
void NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
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);
}
void TIM2_Config()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* Time base configuration /
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1;
TIM_TimeBaseStructure.TIM_Period = 2000-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//Clear TIM2’s Update Flag
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//Enable TIM2’s Interrupt
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//Enable TIM2
TIM_Cmd(TIM2,ENABLE);
}
void LED0_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/ Enable GPIO_LED0 clock /
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/ GPIO_LED0 Pin(PA8) Configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void LED0_On(uint16_t GPIO_Pin)
{
GPIO_ResetBits(GPIOC, GPIO_Pin);
}
void LED0_Off(uint16_t GPIO_Pin)
{
GPIO_SetBits(GPIOC, GPIO_Pin);
}
unsigned char LED0_IsOn(uint16_t GPIO_Pin)
{
return !GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin);
}
b.运行仿真图如下图所示:
----------------------------------- 初学者学习记录