PY32F030单片机用TIM1和TIM3级联成32位计数器

111ma功能描述:
此样例演示了TIM1和TIM3级联成32位计数器,TIM3做主机,TIM3的溢出信号作为TIM1的输入
时钟。TIM3每1ms计数一次,计数1000次后产生溢出,TIM1计数一次。

================================================================================
测试环境:
测试用板:PY32F030_STK
MDK版本: 5.28
 
================================================================================
使用步骤:
1. 编译下载程序到MCU,并运行
2. 串口每秒打印一次TIM1计数值,从0~10依次递增


mian.c

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "py32f030xx_ll_Start_Kit.h"

/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private user code ---------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void APP_SystemClockConfig(void);
static void APP_ConfigTIM1Slave(void);
static void APP_ConfigTIM3Master(void);

/**
  * @brief  应用程序入口函数.
  * @retval int
  */
int main(void)
{
  /* 使能TIM1,TIM3时钟 */
  LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_TIM1);
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);

  /* 配置系统时钟 */
  APP_SystemClockConfig();
  
  /* 初始化LED,USART */
  BSP_LED_Init(LED3);
  BSP_USART_Config();
  
  /* 开启TIM1 */
  APP_ConfigTIM1Slave();
  
  /* 开启TIM3 */
  APP_ConfigTIM3Master();
  
  /*  无限循环  */
  while (1)
  {
    printf("TIM1Count:%d\r\n",LL_TIM_GetCounter(TIM1));
    LL_mDelay(1000);
  }
}

/**
  * @brief  配置TIM3 Master
  * @param  无
  * @retval 无
  */
static void APP_ConfigTIM3Master(void)
{
 
  LL_TIM_SetPrescaler(TIM3,8000-1); /* 预分频值:8000 */
  
  /* 计数模式:向上计数 */
  LL_TIM_SetCounterMode(TIM3,LL_TIM_COUNTERMODE_UP);/* 计数模式:向上计数 */
  
  /* 重装载值:1000-1 */
  LL_TIM_SetAutoReload(TIM3,1000-1);/* 重装载值:1000-1 */
  
  /* 时钟不分频 */
  LL_TIM_SetClockDivision(TIM3,LL_TIM_CLOCKDIVISION_DIV1);/* 时钟不分频 */
  
  /* 触发输出为更新事件 */
  LL_TIM_SetTriggerOutput(TIM3,LL_TIM_TRGO_UPDATE);
  
  /* 使能TIM3计数器 */
  LL_TIM_EnableCounter(TIM3);
}

/**
  * @brief  配置TIM1 Slave
  * @param  无
  * @retval 无
  */
static void APP_ConfigTIM1Slave(void)
{
  /* 计数模式:向上计数 */
  LL_TIM_SetCounterMode(TIM1,LL_TIM_COUNTERMODE_UP);
  
  /* 自动重装载值:10 */
  LL_TIM_SetAutoReload(TIM1,10);
  
  /* 触发输入为TIM3 */
  LL_TIM_SetTriggerInput(TIM1,LL_TIM_TS_ITR2);
  
  /* 设置为外部时钟模式1 */
  LL_TIM_SetClockSource(TIM1,LL_TIM_CLOCKSOURCE_EXT_MODE1);
  
  /* 使能TIM1计数器 */
  LL_TIM_EnableCounter(TIM1);
}

/**
  * @brief  系统时钟配置函数
  * @param  无
  * @retval 无
  */
static void APP_SystemClockConfig(void)
{
  /* 使能HSI */
  LL_RCC_HSI_Enable();
  while(LL_RCC_HSI_IsReady() != 1)
  {
  }

  /* 设置 AHB 分频 */
  LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
 
  /* 配置HSISYS作为系统时钟源 */
  LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSISYS);
  while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSISYS)
  {
  }

  /* 设置 APB1 分频 */
  LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
  LL_Init1msTick(8000000);
  
  /* 更新系统时钟全局变量SystemCoreClock(也可以通过调用SystemCoreClockUpdate函数更新) */
  LL_SetSystemCoreClock(8000000);
}

/**
  * @brief  错误执行函数
  * @param  无
  * @retval 无
  */
void APP_ErrorHandler(void)
{
  /* 无限循环 */
  while(1)
  {
  }
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  输出产生断言错误的源文件名及行号
  * @param  file:源文件名指针
  * @param  line:发生断言错误的行号
  * @retval 无
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* 用户可以根据需要添加自己的打印信息,
     例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* 无限循环 */
  while (1)
  {
  }
}
#endif /* USE_FULL_ASSERT */

/****************************END OF FILE******************/

main.h

/**
  ******************************************************************************
  * @file    main.h
  * @author  MCU Application Team
  * @brief   Header for main.c file.
  *          This file contains the common defines of the application.
  ******************************************************************************

  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/

#include "py32f0xx_ll_rcc.h"
#include "py32f0xx_ll_bus.h"
#include "py32f0xx_ll_system.h"
#include "py32f0xx_ll_exti.h"
#include "py32f0xx_ll_cortex.h"
#include "py32f0xx_ll_utils.h"
#include "py32f0xx_ll_pwr.h"
#include "py32f0xx_ll_dma.h"
#include "py32f0xx_ll_gpio.h"
#include "py32f0xx_ll_tim.h"

#if defined(USE_FULL_ASSERT)
#include "py32_assert.h"
#endif /* USE_FULL_ASSERT */

/* Private includes ----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/
/* Exported variables prototypes ---------------------------------------------*/
/* Exported functions prototypes ---------------------------------------------*/
void APP_ErrorHandler(void);
void APP_UpdateCallback(void);

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

/********************** *****END OF FILE******************/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PY32F030是一款基于ARM Cortex-M0内核的微控制器,它具有多个定时器,包括滴答定时器。滴答定时器是一个简单的计时器,可用于生周期性的中断或实现延时功能。 在PY32F030中,滴答定时器使用的是SysTick定时器。SysTick定时器是一个24位倒计时定时器,可以配置为产生固定时间间隔的中断。 要使用滴答定时器,首先需要使能SysTick定时器,并设置其时钟源和计数值。以下是一个使用滴答定时器生1毫秒延时的示例代码: ```c #include "py32f030.h" void delay_ms(uint32_t ms) { // 设置SysTick定时器为1毫秒中断 SysTick_Config(SystemCoreClock / 1000); // 等待指定的毫秒数 while (ms--) { // 等待SysTick中断标志置位 while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) { } } // 关闭SysTick定时器 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; } int main(void) { // 初始化系统和GPIO等设置 // ... // 延时1秒 delay_ms(1000); // 继续执行后续代码 // ... return 0; } ``` 通过调用`delay_ms()`函数可以实现指定毫秒数的延时。在上面的示例代码中,SysTick定时器的时钟源为系统时钟,计数值为系统时钟频率除以1000,这样每次计数减到0时就会产生1毫秒的中断。 需要注意的是,在使用滴答定时器之前,需要先初始化系统和GPIO等相关设置,并根据实际需求进行相应的配置。 希望这个示例能帮助你了解如何在PY32F030中使用滴答定时器。如果有其他问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值