CODE3:TIM定时器
一、定时器定时中断
1.1 计数自增
main.c
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "Timer.h"
/* 声明全局变量 ------------------------------------------------------------------*/
uint16_t Num = 0;
/* 主函数 ------------------------------------------------------------------*/
int main(void)
{
/*-------- 初始化硬件 --------*/
OLED_Init(); // OLED初始化
Timer_Init(); // 定时器初始化
/*-------- OLED显示 --------*/
OLED_ShowString(1, 1, "Num: "); // 5
// OLED_ShowString(2, 1, "Count: "); // 7
while(1)
{
OLED_ShowNum(1, 8, Num, 5); //从1行6列开始,显示十进制数字
// OLED_ShowNum(2, 8, TIM_GetCounter(TIM2), 5); //从1行6列开始,显示十进制数字
}
}
/* 定时器中断函数 ------------------------------------------------------------------*/
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){ // 检查更新中断标志位
Num++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除更新中断标志位
}
}
Timer.c
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h" // Device header
/**
* @brief TIM初始化函数,每秒触发一次中断
* @param
* @note TIM2-APB1
* @retval
*/
void Timer_Init(void)
{
/*-------- 声明和初始化变量 --------*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 滤波时钟的分频配置
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1; // 自动重装值(相当于1s重装载1次)
TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1; // 预分频值(当前f = 10,000Hz, T = 0.1ms)
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; // 重复计数器只有高级定时器才有
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; // 指定中断通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; // 响应优先级
/*-------- 配置时钟 --------*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟
TIM_InternalClockConfig(TIM2); // 选择内部时钟源
/*-------- 配置时基单元 --------*/
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_ClearFlag(TIM2, TIM_FLAG_Update); // 手动清除中断标志位
/*-------- 使能更新中断 --------*/
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/*-------- 配置NVIC --------*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 注意:整个芯片只能使用1种分组
NVIC_Init(&NVIC_InitStruct);
/*-------- 启动TIM --------*/
TIM_Cmd(TIM2, ENABLE);
}
1.2 LED闪烁
main.c
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h" // Device header
#include "Timer.h"
#include "LED.h"
#include "OLED.h"
/* 声明全局变量 ------------------------------------------------------------------*/
uint16_t BlinkFlag = 0;
uint16_t Num = 0;
/* 主函数 ------------------------------------------------------------------*/
int main(void)
{
/*-------- 初始化 --------*/
Timer_Init(); // 初始化定时器
LED_Init(); // 初始化LED
OLED_Init(); // 初始化OLED
/*-------- OLED显示 --------*/
OLED_ShowString(1, 1, "Num: "); // 5
while(1)
{
OLED_ShowNum(1, 8, Num, 5); // 放判断里外都可以
if(BlinkFlag){
LED_Blink();
BlinkFlag = 0; // 清除标志位
}
}
}
/* 定时器中断函数 ------------------------------------------------------------------*/
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){ // 检查更新中断标志位
BlinkFlag = 1;
Num++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除更新中断标志位
}
}
LED.c
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h" // Device header
/* 声明全局变量 ------------------------------------------------------------------*/
uint16_t BlinkTemp = 0x0;
/**
* @brief LED初始化函数
* @param
* @note PA0-APB2
* @retval
*/
void LED_Init(void)
{
/*-------- 声明和初始化变量 --------*/
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
/*-------- 使能时钟 --------*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/*-------- 初始化IO口 --------*/
GPIO_Init(GPIOA, &GPIO_InitStruct);
/*GPIO_SetBits & GPIO_ResetBits*/
// GPIO_SetBits(GPIOA, GPIO_Pin_0);
// GPIO_ResetBits(GPIOA, GPIO_Pin_0);
/*GPIO_WriteBit*/
// GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
// GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
// GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
// GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
/*GPIO_Write*/
// GPIO_Write(GPIOA, 0x1);
GPIO_Write(GPIOA, 0x0); // 输出低电平
}
/**
* @brief LED闪烁函数
* @param
* @note
* @retval
*/
void LED_Blink(void)
{
BlinkTemp = ~BlinkTemp;
GPIO_Write(GPIOA, BlinkTemp);
}
本文来自博客园,作者:LI,Yi-han,转载请注明原文链接:https://www.cnblogs.com/LiYi-han/p/19248331

浙公网安备 33010602011771号