找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 882|回复: 0
打印 上一主题 下一主题
收起左侧

PY32F0单片机TIMER定时中断+Exti外部中断检测程序

[复制链接]
跳转到指定楼层
楼主
ID:351957 发表于 2023-4-26 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
========================================================
                                样例使用说明
========================================================
功能描述:
此样例演示了在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, 下载次数: 12)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表