STM32-HAL库03-TIM定时器实现LED闪烁

STM32-HAL库03-TIM定时器实现LED闪烁

所用材料:
STM32F103C8T6(最小系统板)
STM32cubemx(HAL库软件)
MD5(编程软件)

本节所学内容:
通过TIM3定时器实现LED闪烁;
其中LED-PC13;

第一步-新建工程
1.选择MCU-F103C8
F103C8T6最小版
第二步-GPIO设置

  1. 选择PC13引脚
  2. 选择GPIO_Output即GPIO输出
  3. 默认各输出参数

STM32-HAL库03-TIM定时器实现LED闪烁_第1张图片
第三步-SYS设置
将DEBUG选线设置为Serial Wire
在这里插入图片描述
第四步-时钟设置
具体配置如下图
STM32-HAL库03-TIM定时器实现LED闪烁_第2张图片第五步-配置TIM定时器

  1. 本文选用TIM3,目标为每500ms进行一次LED电平翻转
  2. Timers – Tim3 – Clock Source – Internal Clock
  3. Paramater Setting – Prescaler – (720-1)
    预分频值为720,则TIM3频率为72M/720=100K,即每10us计数一次
  4. Paramater Setting – Counter Period --(50000-1)
    定时周期为50000个计数,即周期为500ms
  5. NVIC Setting – 勾选TIM3的全局中断

STM32-HAL库03-TIM定时器实现LED闪烁_第3张图片

第六步-文件导出至MD5
STM32-HAL库03-TIM定时器实现LED闪烁_第4张图片
第七步-程序烧写

  1. 打开MDK5
  2. 烧录程序设置:魔术棒-DEBUG(选择STlink)-Settings-Flash Download-勾选Reset and run
    在这里插入图片描述
  3. 在main.c文件下加入定时器启动语句如下
	__HAL_TIM_CLEAR_IT(&htim3, TIM_IT_UPDATE);
	HAL_TIM_Base_Start_IT(&htim3);							
  1. 在tim.c文件下加入定时器中断回调函数如下
/*------------------------------------------------------------------
函数名称:TIM内部时钟中断回调函数
函数功能:实现运行指示灯的闪烁
函数参数:每过500ms跳进一次中断函数,实现一次LED电平翻转
-------------------------------------------------------------------*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM3)
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	}
}

程序附录

main.c主要内容:

int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
	__HAL_TIM_CLEAR_IT(&htim3, TIM_IT_UPDATE);
	HAL_TIM_Base_Start_IT(&htim3);							 //内部定时器TIM3中断使能
  /* USER CODE END 2 */

  while (1)
  {

  }
}

tim.c主要内容:

TIM_HandleTypeDef htim3;

/* TIM3 init function */
void MX_TIM3_Init(void)
{

  /* USER CODE BEGIN TIM3_Init 0 */

  /* USER CODE END TIM3_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM3_Init 1 */

  /* USER CODE END TIM3_Init 1 */
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 719;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 49999;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM3_Init 2 */

  /* USER CODE END TIM3_Init 2 */

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspInit 0 */

  /* USER CODE END TIM3_MspInit 0 */
    /* TIM3 clock enable */
    __HAL_RCC_TIM3_CLK_ENABLE();

    /* TIM3 interrupt Init */
    HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM3_IRQn);
  /* USER CODE BEGIN TIM3_MspInit 1 */

  /* USER CODE END TIM3_MspInit 1 */
  }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspDeInit 0 */

  /* USER CODE END TIM3_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM3_CLK_DISABLE();

    /* TIM3 interrupt Deinit */
    HAL_NVIC_DisableIRQ(TIM3_IRQn);
  /* USER CODE BEGIN TIM3_MspDeInit 1 */

  /* USER CODE END TIM3_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */
/*------------------------------------------------------------------
函数名称:TIM内部时钟中断回调函数
函数功能:实现运行指示灯的闪烁
函数参数:每过500ms跳进一次中断函数,实现一次LED电平翻转
-------------------------------------------------------------------*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM3)
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	}
}
/* USER CODE END 1 */

你可能感兴趣的:(STM32HAL,stm32,单片机,嵌入式硬件)