標(biāo)題: PY32F0單片機(jī)TIMER定時(shí)中斷+Exti外部中斷檢測程序 [打印本頁]

作者: 123按時(shí)到崗    時(shí)間: 2023-4-26 18:16
標(biāo)題: PY32F0單片機(jī)TIMER定時(shí)中斷+Exti外部中斷檢測程序
========================================================
                                樣例使用說明
========================================================
功能描述:
此樣例演示了在TIM1中基本計(jì)數(shù)功能,并使能了更新中斷,每次重裝ARR值時(shí)會(huì)產(chǎn)生一次
更新中斷,并在中斷中翻轉(zhuǎn)LED燈。檢測到一次下降沿到來,PA6 的電平拉高

========================================================
測試環(huán)境:
測試用板:PY32F030_STK
MDK版本: 5.28

========================================================
使用步驟:
1. 編譯下載程序到MCU,并運(yùn)行;
2. 可觀察到LED閃爍。


#include "main.h"
#include "tim.h"
#include "gpio.h"
#include "exti.h"


void APP_SystemClockConfig(void);

/**
  * @brief  應(yīng)用程序入口函數(shù).
  * @retval int
  */
int main(void)
{

  /* 初始化所有外設(shè),F(xiàn)lash接口,SysTick */
  HAL_Init();            
  /* 系統(tǒng)時(shí)鐘配置 */
  APP_SystemClockConfig();
  /* 初始化GPIO */
  APP_GpioConfig();
  /* 初始化Exti */
  APP_ConfigureExti();
  /* 初始化Time */
  APP_Tim1Config();               
        
        
  while (1)
  {
                if(KEY_down_up==Down_KEY)//檢測到一次下降沿到來
                {
                         KEY_down_up=Up_KEY;
                         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
                }
  }
}



/**
  * @brief  系統(tǒng)時(shí)鐘配置函數(shù)
  * @param  無
  * @retval 無
  */
void APP_SystemClockConfig(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /* 選擇振蕩器HSE,HSI,LSI,LSE */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;                          /* 開啟HSI */
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;                          /* HSI 1分頻 */
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_24MHz; /* 配置HSI時(shí)鐘24MHz */
  RCC_OscInitStruct.HSEState = RCC_HSE_OFF;                         /* 關(guān)閉HSE */

  RCC_OscInitStruct.LSIState = RCC_LSI_OFF;                          /* 關(guān)閉LSI */
  RCC_OscInitStruct.LSEState = RCC_LSE_OFF;                         /* 關(guān)閉LSE */

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;                   /* 關(guān)閉PLL */
        
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;      /* 選擇時(shí)鐘源為HSI */
  /* 配置振蕩器 */
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    APP_ErrorHandler();
  }

  /* 時(shí)鐘源配置   選擇配置時(shí)鐘 HCLK,SYSCLK,PCLK1 */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;        /* AHB時(shí)鐘 1分頻 */
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;         /* APB時(shí)鐘 1分頻 */
  /* 配置時(shí)鐘源 */
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    APP_ErrorHandler();
  }
}

/**
  * @brief  錯(cuò)誤執(zhí)行函數(shù)
  * @param  無
  * @retval 無
  */
void APP_ErrorHandler(void)
{
  while (1)
  {
  }
}


#include "tim.h"
#include "gpio.h"

TIM_HandleTypeDef    TimHandle;

/**
  * @brief  Timer1初始化
  * @param  無
  * @retval 無
  */
void APP_Tim1Config(void)
{
        
  __HAL_RCC_TIM1_CLK_ENABLE();                                                  /* 使能TIM1時(shí)鐘 */
  TimHandle.Instance = TIM1;                                                           /*TIM1*/
  TimHandle.Init.Period            = 8000 - 1;                                          /*TIM1重裝載值位8000-1*/
  TimHandle.Init.Prescaler         = 3000 - 1;                                         /*預(yù)分頻為100-1*/
  TimHandle.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;            /*時(shí)鐘不分配*/
  TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;              /*向上計(jì)數(shù)*/
  TimHandle.Init.RepetitionCounter = 0;                                               /*不重復(fù)*/
  TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;  /*自動(dòng)重裝載寄存器沒有緩沖*/
  if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK)                               /*初始化TIM1*/
  {
  }

  if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)                         /* TIM1使能啟動(dòng),并使能中斷 */
  {
  }        

}

/**
  * @brief 初始化TIM相關(guān)MSP
  */
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{

  HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 3, 3);  /* 設(shè)置中斷優(yōu)先級(jí) */
  HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);         /* 使能TIM1中斷 */
}

void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&TimHandle);
}

/**
  * @brief  TIM更新中斷回調(diào)函數(shù)
  * @param  htim:TIM句柄
  * @retval 無
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); //GPIO電平翻轉(zhuǎn)
}


#ifndef _TIM_H
#define _TIM_H
#include "main.h"

extern TIM_HandleTypeDef    TimHandle;

void APP_Tim1Config(void);

#endif



#include "exti.h"

EXTI_HandleTypeDef exti_handle;

int  KEY_down_up=Up_KEY;

/**
  * @brief  配置EXTI
  * @param  無
  * @retval 無
  */
void APP_ConfigureExti(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;
  __HAL_RCC_GPIOB_CLK_ENABLE();                         /* 使能GPIOA時(shí)鐘 */
  GPIO_InitStruct.Mode  = GPIO_MODE_IT_FALLING;   /* GPIO模式為下降沿中斷 */
  GPIO_InitStruct.Pull  = GPIO_PULLUP;                      /* 上拉 */
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;   /* 速度為高速 */
  GPIO_InitStruct.Pin = GPIO_PIN_2;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);                /* 使能EXTI中斷 */
  HAL_NVIC_SetPriority(EXTI2_3_IRQn, 2, 0);         /* 配置中斷優(yōu)先級(jí) */

}

/**
  * @brief  中斷入口函數(shù),每產(chǎn)生一次下降沿
  * @param  無
  * @retval 無
  */
void EXTI2_3_IRQHandler(void)
{
        HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);         /* 處理EXTI中斷請(qǐng)求 */
        KEY_down_up=Down_KEY;  
}


#ifndef _EXTI_H
#define _EXTI_H
#include "main.h"

typedef enum
{
  Up_KEY,
  Down_KEY
}KEY_TypeDef;

extern  int  KEY_down_up;

void APP_ConfigureExti(void);

#endif

Keil代碼下載: PY32F0_TIMER.7z (1.03 MB, 下載次數(shù): 18)





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1