#include "stm32f4xx.h"
//LED灯初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //输出速率
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //无上下拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //引脚编号
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10); //默认不亮
}
//TIM6定时器的初始化 8400 2000
void TIM6_Init(uint16_t psc,uint16_t arr)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//1.打开TIM6的外设时钟 APB1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
//2.配置定时器TIM6的参数 定时200ms APB1定时时钟84MHZ(84000000HZ) 数84次花费1us 1ms=1000us 数84000次花费1ms 200ms=84000*200
// 定时200ms 经过8400分频 10KHZ(10000HZ) 数1次花费100us 1ms=1000us 数10次花费1ms 200ms=10*200
TIM_TimeBaseStructure.TIM_Prescaler = psc-1; //预分频值(数数的快慢)
TIM_TimeBaseStructure.TIM_Period = arr-1; //计数周期(打算数多少次)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数模式(打算怎么数数)
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
//3.配置NVIC(中断通道+优先级)
NVIC_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn; //中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStructure);
//4.选择TIM6的中断源 更新事件发生中断
TIM_ITConfig(TIM6,TIM_IT_Update, ENABLE);
//5.使能定时器
TIM_Cmd(TIM6, ENABLE);
}
int main()
{
//1.硬件初始化
LED_Init();
TIM6_Init(8400,2000); //相当于定时200ms
//2.进入死循环
while(1)
{
}
}
//TIM6的中断服务函数
void TIM6_DAC_IRQHandler(void)
{
//检测中断是否发生
if( TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);//清除中断状态
//异常处理
GPIO_ToggleBits(GPIOF,GPIO_Pin_9);
}
}