1.定时器延时2s实验
一、CubeMX生成项目文件。
在使用HAL库时,如何使用定时器定时是我们需要掌握的,下面的实验演示了定时器如何定时2s。
首先打开CubeMX,创建一个自己芯片的项目。
找到SYS,修改Debug为Serial Wire。
转到RCC,修改High Speed Clock。
本次实验打算用PA0做管脚闪烁灯,所以这里初始化了GPIOA_PIN_0。
点击TIM2,修改Clock Source,将Prescaler和Counter Period修改为4999和6399,这两个值会决定中断时间,公式为:
这里psc取4999,arr取6399,Tclk在下面会设置为16Mhz,所以Tout=(5000*6400)/16 us=2 s.
修改clk。
最后修改项目名称,IDE等,点击GENERATE CODE生成对应的项目。
二、编写代码
在main函数while循环前,加一句HAL_TIM_Base_Start_IT(&htim2);,初始化定时器中断函数
HAL_TIM_Base_Start_IT(&htim2);
在生成的项目中找到main函数,加入定时器中断函数,由于是中断函数,所以我们不需要写在while主循环里,写在主函数外面就行,这里选择写在USER CODE 4中。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned char ledState = 0;
if (htim == (&htim2))
{
if (ledState == 0)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
ledState = !ledState;
}
}
关于keil5的烧录可以看我的上篇博客:STM32新手入门篇之HAL库点灯-CSDN博客
效果图:
2.使用PWM波生成呼吸灯
PWM波点灯可以达到一个缓慢熄灭和缓慢点亮的效果,效果图如下
打开CubeMX,我们可以在上面定时器中断的项目上修改项目设置。
按照上面定时器的方式修改RCC和SYS,在TIM2修改Clock Source、Channel1,下方修改PSC和Counter Period,修改这两个值可以改变呼吸灯的频率,具体搜索PWM波原理,这里选择的是199和499,你可以尝试调低PSC为99会有不一样的效果,然后将auto-reload preload修改为Enable,在NVIC Setting勾上ENABLE。
然后按照之前的方式调节时钟和项目设置 。
生成项目后我们打开keil5,编写代码。
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
// uint8_t dir=1;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal;
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal;
HAL_Delay(1);
}
HAL_Delay(200);
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
}}
代码编写完毕,我们在对应引脚连上LED即可查看效果,在CubeMX右侧可以看到TIM2对应的引脚为PA15。
最后我们在keil示波器上查看一下PWM波形,具体方法查看STM32新手入门篇之HAL库点灯-CSDN博客:
可以看到波形类似与渐变的一个效果,所以表现出呼吸灯。