stm32f103 hal库中timer使用

使用步骤

1.初始化定时器


	tim.Instance 			= TIM2;
	tim.Init.Period 		= 1000-1;
	tim.Init.Prescaler 		= (uint32_t)((SystemCoreClock / 1000) - 1);
	tim.Init.ClockDivision		= 0;
	tim.Init.CounterMode		= TIM_COUNTERMODE_UP;
	tim.Init.RepetitionCounter	= 0;
	tim.Init.AutoReloadPreload	= TIM_AUTORELOAD_PRELOAD_DISABLE;

2.HAL_TIM_Base_Init(&htim2)基本参数配置

HAL_TIM_Base_Init(&htim2);

3.重写void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)函数

在函数中我们需要使能timer的时钟、设置固定中断优先级和中断使能(此函数在2.HAL_TIM_Base_Init中调用)
注意:打开对应的时钟使能,我用的是TIM2

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM2)
  {
    /* TIM2 clock enable */
    __HAL_RCC_TIM2_CLK_ENABLE();
    /* TIM2 interrupt Init */
   HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
   HAL_NVIC_EnableIRQ(TIM2_IRQn);
  }
}

4.中断函数的重写

void TIM2_IRQHandler(void)
{
	//自己想要做的事情,但是不能进入递归等函数,不要进行浮点运算!
	HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
	//结束自己要做的事情
  	HAL_TIM_IRQHandler(&tim);
}

5.如果想用溢出回调

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	/* 自己想要做的事情,与上面的要求一样 */
	//HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}

6.启动定时器

编写到这里基本已经完成配置,接下来要启动定时器,定时器才能运行(不可以没有这一步)

HAL_TIM_Base_Start_IT(&tim);

7.整个代码

static TIM_HandleTypeDef	tim;

void TIM_Init(void)
{

	tim.Instance 				= TIM2;
	tim.Init.Period 			= 1000-1;
	tim.Init.Prescaler 			= (uint32_t)((SystemCoreClock / 1000) - 1);
	tim.Init.ClockDivision		= 0;
	tim.Init.CounterMode		= TIM_COUNTERMODE_UP;
	tim.Init.RepetitionCounter	= 0;
	tim.Init.AutoReloadPreload	= TIM_AUTORELOAD_PRELOAD_DISABLE;
	
	HAL_TIM_Base_Init(&tim);
	
	HAL_TIM_Base_Start_IT(&tim);
	
}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspInit 0 */

  /* USER CODE END TIM2_MspInit 0 */
    /* TIM2 clock enable */
    __HAL_RCC_TIM2_CLK_ENABLE();

    /* TIM2 interrupt Init */
   HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
   HAL_NVIC_EnableIRQ(TIM2_IRQn);
  /* USER CODE BEGIN TIM2_MspInit 1 */
  /* USER CODE END TIM2_MspInit 1 */
  }
}

void TIM2_IRQHandler(void)
{
	
	HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
  HAL_TIM_IRQHandler(&tim);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	/* Toggle LED3 */
	//GpioToggle(&Led_tx);
	//HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 STM32F103 微控制器,你可以使用 Timer8 来生成 PWM 信号。下面是一个简单的示例代码,演示如何配置 Timer8 作为 PWM 产生器: 首先,你需要在 STM32CubeMX 或者手动配置寄存器的方式下,将 Timer8 配置为 PWM 模式。确保 Timer8 的时钟源被正确配置,并设置 PWM 输出的频率和占空比。 接下来,你需要对 Timer8 进行初始化和配置。以下是一个示例代码片段: ```c #include "stm32f1xx_hal.h" void HAL_TIM_MspInit(TIM_HandleTypeDef* htim) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(htim->Instance==TIM8) { /* 配置 GPIO 引脚为复用推挽输出 */ GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* 启用 Timer8 时钟 */ __HAL_RCC_TIM8_CLK_ENABLE(); } } void MX_TIM8_Init(void) { TIM_OC_InitTypeDef sConfigOC = {0}; htim8.Instance = TIM8; htim8.Init.Prescaler = 0; htim8.Init.CounterMode = TIM_COUNTERMODE_UP; htim8.Init.Period = 9999; htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(&htim8); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 5000; // 设置占空比为 50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1); } ``` 上述代码片段将 Timer8 配置为 PWM 模式,并将占空比设置为 50%。你可以根据需求修改占空比和其他参数。这样,Timer8 将会在 PC7 引脚上产生 PWM 输出信号。 请注意,以上代码仅为示例,并且假设你已经进行了必要的时钟配置和引脚映射。具体的配置和初始化步骤可能因你的硬件和需求而有所不同。建议你查阅 STM32F103 参考手册和相关文档以获取更详细的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值