一、电路的连接
二、代码展示
1.main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
uint16_t Num;
int main(void)
{
OLED_Init();
Timer_Init();
OLED_ShowString(1,1,"Hello jijiali");
while (1)
{
OLED_ShowNum(2,5,Num,5);
}
}
2.timer.c
a.步骤
/*一、RCC 开启内部时钟
二、选择时基单元的时钟源
三、配置时基单元(包括预分频器、自动重装器、计数模式)
四、配置输出中断控制,允许更新中断输出到NNIC
五、配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
六、运行控制*/
b.概念图
c.代码
#include "stm32f10x.h" // Device header
extern uint16_t Num;
/*一、RCC 开启内部时钟
二、选择时基单元的时钟源
三、配置时基单元(包括预分频器、自动重装器、计数模式)
四、配置输出中断控制,允许更新中断输出到NNIC
五、配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
六、运行控制*/
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//内部时钟
TIM_InternalClockConfig(TIM2);
//初始化时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSturcture;
TIM_TimeBaseInitSturcture.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitSturcture.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInitSturcture.TIM_Period=10000-1;
TIM_TimeBaseInitSturcture.TIM_Prescaler=7200-1;
TIM_TimeBaseInitSturcture.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitSturcture);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
//使能更新中断
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//NVIC优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitSturcture;
NVIC_InitSturcture.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitSturcture.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitSturcture.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitSturcture);
//定时器
TIM_Cmd(TIM2,ENABLE);
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
{
Num++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
3.timer.h
#ifndef __Timer_H
#define __Timer_H
void Timer_Init(void);
#endif
三、笔记
库函数的相关介绍
void TIM_DeInit(TIM_TypeDef* TIMx);
恢复缺省配置(未经其他任何指令更改,程序或系统默认的设置)
1.时基单元
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
时基单元初始化
TIMx,:选择某一个TIMx选择某一个定时器
TIM_TimeBaseInitStruct:结构体,包含单元配置时基单元的一些参数,自动重装值和预分频值
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
把结构体变量付一个默认值
2.运行控制
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
使能计数
TIMx:选择定时器
NewState:状态的选择(使能和失能)
3.使能外设的中断输出
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
这是用来使能中断输出信号
TIMx:选择定时器
TIM_IT:选择配置那个中断输出
NewState:状态的选择(使能和失能)
4.时钟源的选择部分
a.void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
选择内部时钟
b.void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
选择ITRx其他定时器的时钟
TIMx:选择定时器
TIM_InputTriggerSource:选择要接入那个定时器
c.void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);
选择TIx捕获通道的时钟
TIM_TIxExternalCLKSource:选择TI的某一个引脚
TIM_ICPolarity,ICFilter:输入极性和滤波器
对于外部引脚的波形,一般都会有极性选择和滤波器
d.void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
选择ETR通过外部时钟模式1输入的时钟
TIM_ExtTRGPrescaler:外部触发预分频器(对ETR的外部时钟再提前做一个分频)
Polarity,Filter:极性和滤波器
e.void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
选择ETR通过外部始终模式2输出的时钟
f.void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
单独用来配置ETR引脚的预分频器、极性、滤波器
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
Prescaler:写入预分频值
TIM_PSCReloadMode:要写入的模式
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
改变计数器的计数模式
TIM_CounterMode:选择新的计数模式
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
自动重装器预装功能配置
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
给计数器写入一个值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
给自动重装器写一个值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
获取当前计数器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
获取当前的预分频器的值
5.获取标志位和清楚标志位
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);