STM32F103-CUBE开发教程

本文基于《STM32CUBE高效开发教程》,探讨在STM32F103和STM32F407中使用基本定时器和PWM的不同之处。在103型号中,启动单次定时模式需预先装载定时器参数,作者提供了一个自定义的HAL_TIM_OnePulse_Ready函数来解决此问题。此外,文章还展示了如何配置PWM实现呼吸灯效果,包括设置定时器周期、PWM占空比及中断处理。
摘要由CSDN通过智能技术生成

本文基于《STM32CUBE高效开发教程》进行实验,开发板为野火指南者。

(随便移植了LCD接口以兼容书中代码)

LED、按键、外部中断、有cube代码,内容省略

目录

 代码自取

基本定时器

1.普通定时与单次定时

普通定时器

1.PWM实现呼吸灯


 代码自取

链接:https://pan.baidu.com/s/1288JFm1FmaZPMKuNAzUGEQ 
提取码:jes7 

基本定时器

1.普通定时与单次定时

先说问题:

书中使用407直接调用    HAL_TIM_Base_Start_IT(&htim7); //以中断方式启动TIM7

即可完成启动单次定时模式。

在103中则会有两个问题。

1、调用 HAL_TIM_Base_Start_IT(&htim7);后,马上进入了定时器中断

2、第二次运行 HAL_TIM_Base_Start_IT(&htim7);会跑飞。

在407中则不会产生该现象。

解决方法:

每次启动前都要装载定时器的参数。

		HAL_TIM_OnePulse_Ready(&htim7, TIM_OPMODE_SINGLE);
		HAL_TIM_Base_Start_IT(&htim7); 	//以中断方式启动TIM7


//该函数为自己根据HAL_TIM_OnePulse_Init 改写

HAL_StatusTypeDef HAL_TIM_OnePulse_Ready(TIM_HandleTypeDef *htim, uint32_t OnePulseMode)
{
  /* Set the TIM state */
  htim->State = HAL_TIM_STATE_BUSY;
//  htim->hdma[7]->Instance->CCR;
//  htim->Init.AutoReloadPreload;
  /* Set the Autoreload value */
  htim->Instance->ARR = (uint32_t)htim->Init.Period ;

  /* Set the Prescaler value */
  htim->Instance->PSC =htim->Init.Prescaler;

  /* Generate an update event to reload the Prescaler
     and the repetition counter (only for advanced timer) value immediately */
  htim->Instance->EGR = TIM_EGR_UG;
  htim->Instance->CR1 |= OnePulseMode;
  /* Initialize the TIM state*/
  htim->State = HAL_TIM_STATE_READY;

  return HAL_OK;
}

基础定时器TIM6 TIM7配置如下:

TIM6为连续定时模式,TIM7为单次定时模式

计算:

(35999+1/)72MHZ=0.5ms

TIM6定时时间=0.5ms*(999+1)=500ms

TIM7定时时间=0.5ms*(3999+1)=2000ms

 

普通定时器

1.PWM实现呼吸灯

首先要配置PWM引脚

配置PWM  Channel 

配置PSC 和 计数周期

72MHZ/(3599+1)=20KHZ

(399+1)/20KHZ=20ms

 

 配置PWM duty(这里随便配)

1PULSE=1/20KHZ=0.05ms

配输出口极性为LOW

再配个中断

 

mian.C

	HAL_TIM_Base_Start_IT(&htim3); 	//以中断方式启动TIM3
	HAL_TIM_PWM_Start_IT(&htim3,TIM_CHANNEL_2);	//TIM3通道2, 启动生成PWM
	HAL_TIM_PWM_Start_IT(&htim3,TIM_CHANNEL_3);	//TIM3通道3, 启动生成PWM
	HAL_TIM_PWM_Start_IT(&htim3,TIM_CHANNEL_4);	//TIM3通道4, 启动生成PWM

 tim.c

/* USER CODE BEGIN 0 */
uint16_t	pulseWidth=50;	//脉宽
uint8_t		dirInc=1;	//脉宽变化方向�?1=递增�?0=递减
/* USER CODE END 0 */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	if (htim->Instance != TIM3)
		return;

	if (dirInc==1)	//脉宽递增
	{
		pulseWidth++;
		if (pulseWidth>=195)
		{
			pulseWidth =195;
			dirInc=0;	//脉宽递减
		}
	}
	else
	{
		pulseWidth--;
		if (pulseWidth<=5)
		{
			pulseWidth =5;
			dirInc=1;	//脉宽递增
		}
	}

	__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,pulseWidth);  //设置CCR寄存器的�??
}

2.输出比较

main.c

	HAL_TIM_Base_Start(&htim3); 	//启动TIM3
	HAL_TIM_OC_Start_IT(&htim3,TIM_CHANNEL_2);	//TIM3通道2, 启动比较功能

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值