实验五 定时器实验
一、实验目的
1. 掌握基于固件库进行编程的方法
2. 掌握通用定时器的编程方法
二、实验内容
1.基于固件库编程,实现通用定时器实现LED闪烁2s并且熄灭2s的定时功能。
要求:1.使用模块化编程。2. 画出软件设计流程图。
- (选做)实现教材中7.6.2 定时器设计实例2:串行口定时上传信息。
具体任务要求和流程图如教材所示。
三、预备知识
1. 基于STM32固件库进行编程的方法
2. 基于STM32的定时器工作原理
四、实验设备
1. 硬件环境配置
计算机:Intel(R) Pentium(R) 及以上;
内存:1GB及以上;
实验设备:嵌入式开发平台,USB转串口数据线;
2. 软件环境配置
操作系统:Microsoft Windows XP Professional Service Pack 2;
集成开发环境:Keil μVision5 IDE;
五、实验过程
1.电路设计
- 定时器的初始化过程
1. 配置时钟:选择哪个定时器,以及使用哪个时钟源。
2. 配置Prescaler:将时钟源分频得到定时器的计数时钟。
3. 配置计数模式:选择计数模式,如向上计数、向下计数或者自动重载模式。
4. 设置自动重载寄存器ARR:如果使用自动重载模式,需要设置自动重载寄存器ARR的值,确定定时器的周期。如果不使用自动重载模式,则不需要设置ARR寄存器。
5. 配置时钟分频系数PSC:如果使用自动重载模式,则需要设置时钟分频系数PSC的值,用于分频ARR和计数器CNT之间的时钟。
6. 配置定时器中断:选择需要的定时器中断,如更新中断、比较中断等。
7. 启动定时器:启动定时器开始计数。
3.软件设计及代码
1.LED初始化
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_APB2PeriphClockCmd(LED1_GPIO_CLK|LED2_GPIO_CLK|LED3_GPIO_CLK, ENABLE);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIO*/
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
/*调用库函数,初始化GPIO*/
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
/*调用库函数,初始化GPIOF*/
GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
/* 关闭所有led灯 */
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}
2.定时器初始化
void Timer_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
}
3.定时器中断服务函数
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
Num ++;
if(Num%2==0)
{
mode=~mode;
LED3_OFF;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
4.主程序
#include "stm32f10x.h"
#include "bsp_led.h"
#define SOFT_DELAY Delay(0x0FFFFF);
uint8_t mode=0;
uint16_t Num=0;
void Delay(__IO u32 nCount);
int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
Timer_Init();
while (1)
{
if(mode==1) // 灭
{
LED3_OFF;
}
if(mode==0)
{
LED3_ON;
} // 亮
}
}