定时器讲解:
实现步骤:
源代码
tim.c
#include "tim.h"
#include "stm32f10x.h"
void tim_config()
{ //1.使能时钟 定时器时钟
TIM_TimeBaseInitTypeDef TimStruct;
NVIC_InitTypeDef NvicStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//2.配置定时器结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
TimStruct.TIM_ClockDivision = TIM_ICPSC_DIV1;
TimStruct.TIM_CounterMode = TIM_CounterMode_Up;
TimStruct.TIM_Period = 10000-1 ;
TimStruct.TIM_Prescaler = 7199+1;
TIM_TimeBaseInit(TIM2,&TimStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//TIM_IT_Update允许更新中断源
TIM_Cmd(TIM2, ENABLE);
//3.开启定时器中断,配置中断结构体
NvicStruct.NVIC_IRQChannel = TIM2_IRQn;//TIM2_IRQn定时器2,位于USER/stm32f10x_it.c/stm32f10x.h
NvicStruct.NVIC_IRQChannelCmd = ENABLE; //使能
NvicStruct.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NvicStruct.NVIC_IRQChannelSubPriority = 1; //子优先级
NVIC_Init(&NvicStruct);
}
tim.h
void tim_config();
#include "stm32f10x.h"
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "relay.h"
#include "shake.h"
#include "usart.h"
#include "exti.h"
#include "tim.h"
void delay(uint16_t time)//延时函数
{
uint16_t i=0;
while(time--){
i=12000;
while(i--);
}
}
int main()
{
tim_config();
//先到main(),然后到下面的函数,然后到对应的.h,然后.c文件
LED_Init();
GPIO_SetBits(GPIOA , GPIO_Pin_1);//初始化继电器为关闭状态, 与代码3有关
while(1)
{
}
}
void TIM2_IRQHandler(void)
{
static uint16_t temp;
if( TIM_GetITStatus( TIM2,TIM_IT_Update) != RESET)//判断是否发生中断,如果不等于0,就发生中断
{
if(temp++ %2 == 1)
{
GPIO_ResetBits(GPIOA , GPIO_Pin_1);
}
else
{
GPIO_SetBits(GPIOA , GPIO_Pin_1);
}
}
TIM_ClearFlag(TIM2,TIM_IT_Update );
}
led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void){
GPIO_InitTypeDef led_init;
//使能apb2的gpioa,说人话就是打开这个gpioa
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
led_init.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
led_init.GPIO_Pin = GPIO_Pin_1; //引脚为1看原理图
led_init.GPIO_Speed = GPIO_Speed_10MHz; //点灯 速率10mhz即可
GPIO_Init(GPIOA,&led_init);
}
led.h
#include "stm32f10x.h"
void LED_Init(void);
效果展示:
开发板led2闪烁