本文基于《STM32CUBE高效开发教程》进行实验,开发板为野火指南者。
(随便移植了LCD接口以兼容书中代码)
LED、按键、外部中断、有cube代码,内容省略
目录
代码自取
链接: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, 启动比较功能