========================================================
樣例使用說明
========================================================
功能描述:
此樣例演示了在TIM1中基本計數功能,并使能了更新中斷,每次重裝ARR值時會產生一次
更新中斷,并在中斷中翻轉LED燈。檢測到一次下降沿到來,PA6 的電平拉高
========================================================
測試環境:
測試用板:PY32F030_STK
MDK版本: 5.28
========================================================
使用步驟:
1. 編譯下載程序到MCU,并運行;
2. 可觀察到LED閃爍。
#include "main.h"
#include "tim.h"
#include "gpio.h"
#include "exti.h"
void APP_SystemClockConfig(void);
/**
* @brief 應用程序入口函數.
* @retval int
*/
int main(void)
{
/* 初始化所有外設,Flash接口,SysTick */
HAL_Init();
/* 系統時鐘配置 */
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 系統時鐘配置函數
* @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時鐘24MHz */
RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* 關閉HSE */
RCC_OscInitStruct.LSIState = RCC_LSI_OFF; /* 關閉LSI */
RCC_OscInitStruct.LSEState = RCC_LSE_OFF; /* 關閉LSE */
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF; /* 關閉PLL */
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; /* 選擇時鐘源為HSI */
/* 配置振蕩器 */
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
APP_ErrorHandler();
}
/* 時鐘源配置 選擇配置時鐘 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時鐘 1分頻 */
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB時鐘 1分頻 */
/* 配置時鐘源 */
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
APP_ErrorHandler();
}
}
/**
* @brief 錯誤執行函數
* @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時鐘 */
TimHandle.Instance = TIM1; /*TIM1*/
TimHandle.Init.Period = 8000 - 1; /*TIM1重裝載值位8000-1*/
TimHandle.Init.Prescaler = 3000 - 1; /*預分頻為100-1*/
TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /*時鐘不分配*/
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; /*向上計數*/
TimHandle.Init.RepetitionCounter = 0; /*不重復*/
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; /*自動重裝載寄存器沒有緩沖*/
if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK) /*初始化TIM1*/
{
}
if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK) /* TIM1使能啟動,并使能中斷 */
{
}
}
/**
* @brief 初始化TIM相關MSP
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 3, 3); /* 設置中斷優先級 */
HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn); /* 使能TIM1中斷 */
}
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TimHandle);
}
/**
* @brief TIM更新中斷回調函數
* @param htim:TIM句柄
* @retval 無
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); //GPIO電平翻轉
}
#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時鐘 */
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); /* 配置中斷優先級 */
}
/**
* @brief 中斷入口函數,每產生一次下降沿
* @param 無
* @retval 無
*/
void EXTI2_3_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); /* 處理EXTI中斷請求 */
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, 下載次數: 18)
2023-4-26 19:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|