stm32 设置10ms定时器

/*
*********************************************************************************************************
*
*    模块名称 : timer2驱动模块
*    文件名称 : bsp_timer2.c
*    版    本 : V1.0
*    说    明 : timer2时钟定时器
*
*    修改记录 :
*        版本号  日期        作者     说明
*
*********************************************************************************************************
*/

#include "bsp.h"


#define SystemCoreClock  72000000


/*
*********************************************************************************************************
*    函 数 名: bsp_InitTimer2
*    功能说明: 配置beep相关的GPIO,  该函数被 bsp_Init() 调用。
*    形    参:  无
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitTimer2(void)
{
        
        TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  
        uint32_t usPeriod;
    uint16_t usPrescaler;
    uint32_t uiTIMxCLK;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    
  
        TIM_DeInit(TIM2);

    /* 打开GPIO时钟 */
        
        uiTIMxCLK = SystemCoreClock;
    usPrescaler = uiTIMxCLK / 10000 ;    /* 分频到周期 100us */
        //usPrescaler = uiTIMxCLK / 10000 ;    /* 分频到周期 100us */
        
        usPeriod = 100;      //设置计数溢出大小,每计1000个数就产生一个更新事件  100us*100=10ms 
                          
        
        TIM_TimeBaseStructure.TIM_Period = usPeriod-1;//ARR的值  10ms  设置自动装载寄存器  
        TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler-1; //100us 分频计数 
        
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;采样分频
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
        
       // 每次进入中断服务程序间隔时间为  ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒*/


        TIM_ClearFlag(TIM2, TIM_FLAG_Update);       //清除溢出中断标志
        TIM_ARRPreloadConfig(TIM2, DISABLE);/*预装载寄存器的内容被立即传送到影子寄存器 */ 

        
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
        TIM_Cmd(TIM2,ENABLE);//开启时钟
        
      
}

//设置所有的中断允许

void NVIC_Configuration(void)
{
    
  NVIC_InitTypeDef NVIC_InitStructure;

 /* Timer2中断*/
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

//初始调用

void bsp_Init(void)
{

 RCC_Configuration();

    //初始化中断
    NVIC_Configuration();  

bsp_InitTimer2(); 

}

    

<think>嗯,用户想在STM32上生成一个1ms定时器,使用TIM中断或HAL库,并需要示例代码。首先,我需要回忆一下STM32定时器的相关知识。STM32定时器种类很多,比如基本定时器、通用定时器、高级定时器等。这里用户可能使用的是通用定时器,比如TIM2、TIM3等,或者是基本定时器TIM6、TIM7。不过根据引用中的例子,比如引用[2]提到TIM1的时钟源是APB1 Timer clocks,而APB1的频率设置到48MHz。不过需要注意,TIM1其实属于高级定时器,通常挂载在APB2总线上,可能用户的具体型号不同,比如STM32F0系列可能有所不同,所以需要确认时钟树。 接下来,用户需要生成1ms的中断,也就是每1ms触发一次定时器中断。关键点在于定时器的时钟频率和分频系数、自动重装载值的计算。公式通常是:定时时间 = (分频系数 + 1) * (自动重装载值 + 1) / 时钟频率。例如,如果时钟频率是48MHz,想要1ms的中断,那么可以设置分频系数为47,这样分频后的时钟频率是48MHz/(47+1)=1MHz,即每微计数一次。自动重装载值设为999,这样每1000次计数就是1ms。这样计算的话,分频系数是47,自动重载值是999。但需要根据具体的时钟配置来调整,因为不同的STM32型号可能时钟源不同,比如如果使用HAL库,可能通过CubeMX配置时钟树,自动计算这些参数。 然后,用户需要使用HAL库的函数来初始化和启动定时器。比如在CubeMX中配置定时器,生成代码后,在main函数中调用HAL_TIM_Base_Start_IT(&htimx)来启动定时器中断。同时,需要实现中断回调函数HAL_TIM_PeriodElapsedCallback,在这里处理定时任务,比如翻转LED等。 另外,用户提到的示例代码可能需要结合具体的定时器配置,比如初始化结构体中的Prescaler和Period的设置。同时,需要注意中断优先级的配置,确保定时器中断能够正确触发。 还要考虑用户可能的开发环境,比如使用STM32CubeIDE,通过图形化配置定时器参数,然后生成初始化代码。这样用户只需要关注中断回调函数的实现即可。因此,在回答中需要分步骤说明配置过程,包括CubeMX的设置和代码的添加。 最后,根据用户提供的引用,引用[3]中的输入捕获中断可能与用户的定时器中断需求不同,但中断处理的流程类似,都是启动中断并实现回调函数。因此,可以借鉴其中的代码结构,比如使用HAL_TIM_Base_Start_IT启动定时器,并在回调函数中执行需要的操作。 总结步骤:1. 配置系统时钟,确定定时器时钟源频率;2. 计算分频和自动重载值;3. 在CubeMX中配置定时器参数;4. 生成代码并添加中断回调函数;5. 启动定时器中断。同时,示例代码需要展示初始化和回调函数的具体实现,确保用户能够直接应用。</think>### STM32生成1ms定时器中断的实现步骤 #### 1. 系统时钟配置 假设使用STM32F103系列,APB1总线时钟频率为$72\ \text{MHz}$,定时器时钟通过预分频器后为$72\ \text{MHz}$(APB1预分频系数不为1时,定时器时钟会加倍)[^2]。若需要生成$1\ \text{ms}$中断周期,计算公式为: $$ T = \frac{(\text{PSC}+1) \times (\text{ARR}+1)}{\text{TIM\_CLK}} $$ 其中: - $\text{PSC}$为预分频系数 - $\text{ARR}$为自动重装载值 - $\text{TIM\_CLK}$为定时器时钟频率 #### 2. CubeMX配置流程 1. 在**Clock Configuration**中确认APB1 Timer Clocks频率 2. 选择TIMx(如TIM2)作为基础定时器 3. 配置参数: - **Prescaler (PSC)**: 7199 → 分频后时钟为$72\text{MHz}/(7199+1)=10\ \text{kHz}$ - **Counter Period (ARR)**: 9 → $(9+1)/10\text{kHz}=1\ \text{ms}$ 4. 启用定时器中断:**NVIC Settings**中勾选**TIMx global interrupt** #### 3. 代码实现 ```c // main.c 中自动生成的初始化代码 TIM_HandleTypeDef htim2; void MX_TIM2_Init(void) { htim2.Instance = TIM2; htim2.Init.Prescaler = 7199; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 9; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim2); HAL_TIM_Base_Start_IT(&htim2); // 启动定时器中断 } // 中断回调函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 翻转LED } } ``` #### 4. 验证方法 - 连接LED到PA5引脚 - 观察LED以$1\ \text{Hz}$频率闪烁(1ms中断累计500次后翻转) [^1]: 定时器配置方法参考STM32 HAL库标准流程 [^2]: 时钟频率计算依据CubeMX时钟树配置 [^3]: 中断回调函数实现模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值