stm32基本定时器

Driver_TIM6.c

需要注意立即进入中断问题,原因是预分频寄存器并没有更新预分频系数。

c 复制代码
#include "Driver_TIM6.h"
#include "Delay.h"
/**
 * @description: 给定时器6进行初始化
 * @return {*}
 */
void Driver_TIM6_Init(void)
{
    /* 1. 给定时器6开启时钟*/
    RCC->APB1ENR |= RCC_APB1ENR_TIM6EN;

    /* 2. 设置预分频值: 分频值7199表示7200分频。分频后频率10K,周期100us */
    TIM6->PSC = 7200 - 1;

    /*
    3. 设置自动重转载寄存器的值,决定中断发生的频率。
        假设设置为9999,表示计数器计数10000次发生一次中断。
        计数一次100us,10000次1000000us,正好1s
    */
    TIM6->ARR = 10000 - 1;

    /* 为了避免一启动立即进入更新中断,可以先产生一个更新事件 
    预分频寄存器和重装载寄存器都有影子寄存器
     预分频寄存器的影子寄存器和重装载寄存器需要CNT溢出一次才能更新*/
    TIM6->CR1 |= TIM_CR1_URS;//产生一个更新事件 
    TIM6->EGR |= TIM_EGR_UG; /* 预分频寄存器和重装载寄存器的值更新到影子寄存器 */
    // TIM6->SR &= ~TIM_SR_UIF;
    
    /* 4. 使能更新中断 */
    TIM6->DIER |= TIM_DIER_UIE;

    /* NVIC配置 */
    /* 5. 设置中断优先级分组 */
    NVIC_SetPriorityGrouping(3);
    /* 6. 设置中断优先级 */
    NVIC_SetPriority(TIM6_IRQn, 1);

    /* 7. 使能定时器6的中断 */
    NVIC_EnableIRQ(TIM6_IRQn);

    /* 8. 使能计数器 */
    TIM6->CR1 |= TIM_CR1_CEN;
}

/**
 * @description: TIM6的中断服务函数
 * @return {*}
 */
void TIM6_IRQHandler(void)
{
    TIM6->SR &= ~TIM_SR_UIF;
    Drviver_LED_Toggle(LED_1);
    printf("1\r\n");
}

Driver_TIM6.h

c 复制代码
#ifndef __DRIVER_TIM6_H
#define __DRIVER_TIM6_H

#include "stm32f10x.h"
#include "Driver_LED.h"
#include "Driver_USART.h"


void Driver_TIM6_Init(void);

#endif
相关推荐
编程墨客6 小时前
STM32F103C8T6单片机内部执行原理及启动流程详解
stm32·单片机·嵌入式硬件
Wangshanjie_987 小时前
【STM32】-SPI通讯
stm32
qq_411262428 小时前
整体无需占用任何硬件 UART,即可新增一条全双工软串口
单片机·嵌入式硬件
XINVRY-FPGA9 小时前
XCZU47DR-2FFVG1517I Xilinx FPGA AMD ZynqUltraScale+ RFSoC
人工智能·嵌入式硬件·fpga开发·信息与通信·信号处理·射频工程·fpga
Cyrus_柯10 小时前
单片机基础(STM32-DAY2(GPIO))
单片机·嵌入式硬件
吃货界的硬件攻城狮10 小时前
【STM32 学习笔记】SPI通信协议
笔记·stm32·学习
努力的小帅10 小时前
STM32单片机_3
stm32·单片机·嵌入式硬件·学习·stm32c8t6
逼子格11 小时前
开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记
嵌入式硬件·硬件工程·硬件工程师·开关电源·multisim电路仿真·稳压电源·线性电源
SKYDROID云卓小助手11 小时前
无人设备遥控器之无线电频率篇
服务器·网络·单片机·嵌入式硬件·算法
逼子格13 小时前
振荡电路Multisim电路仿真实验汇总——硬件工程师笔记
笔记·嵌入式硬件·硬件工程·硬件工程师·硬件工程师真题·multisim电路仿真·震荡电流