[N32G430] 基本定时器TIM6的使用

[复制链接]
 楼主| 呐咯密密 发表于 2024-12-23 10:33 | 显示全部楼层 |阅读模式
基本定时器TIM6的使用

1、设置一个定时器,100ms一次去开关LED灯
2、tim6的初始化代码:
大部分代码来自官方demo

  1. /*****************************************************************************
  2. * Copyright (c) 2019, Nations Technologies Inc.
  3. *
  4. * All rights reserved.
  5. * ****************************************************************************
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * - Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the disclaimer below.
  12. *
  13. * Nations' name may not be used to endorse or promote products derived from
  14. * this software without specific prior written permission.
  15. *
  16. * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR
  17. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  19. * DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
  20. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  21. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  22. * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  23. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  24. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  25. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. * ****************************************************************************/

  27. /**
  28. *\*\file timer_common.c
  29. *\*\author Nations
  30. *\*\version v1.0.0
  31. *\*\copyright Copyright (c) 2019, Nations Technologies Inc. All rights reserved.
  32. **/
  33. #include "timer.h"
  34. #include "main.h"
  35. #include "type.h"

  36. static TIM_TimeBaseInitType TIM_TimeBaseStructure;

  37. /**
  38. *\*\name    Common_TIM_Base_Initialize.
  39. *\*\param   TIMx :
  40. *\*\          - TIM1
  41. *\*\          - TIM2
  42. *\*\          - TIM3
  43. *\*\          - TIM4
  44. *\*\          - TIM5
  45. *\*\          - TIM6
  46. *\*\param   period
  47. *\*\          - [1, 0xffff]
  48. *\*\param   prescaler
  49. *\*\          - [0, 0xffff]
  50. *\*\return  none
  51. **/

  52. static void Common_TIM_Base_Initialize(TIM_Module *TIMx, uint16_t period, uint16_t prescaler)
  53. {
  54.     TIM_Base_Struct_Initialize(&TIM_TimeBaseStructure);
  55.     TIM_TimeBaseStructure.Period    = period;
  56.     TIM_TimeBaseStructure.Prescaler = prescaler;
  57.     TIM_TimeBaseStructure.ClkDiv    = 0;
  58.     TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;

  59.     TIM_Base_Initialize(TIMx, &TIM_TimeBaseStructure);   
  60. }

  61. /**
  62. *\*\name    Common_TIM_NVIC_Initialize.
  63. *\*\param   IRQ_number :
  64. *\*\          - TIM1_BRK_IRQn
  65. *\*\          - TIM1_UP_IRQn
  66. *\*\          - TIM1_TRG_COM_IRQn
  67. *\*\          - TIM1_CC_IRQn
  68. *\*\          - TIM2_IRQn
  69. *\*\          - TIM3_IRQn
  70. *\*\          - TIM4_IRQn
  71. *\*\          - TIM8_BRK_IRQn
  72. *\*\          - TIM8_UP_IRQn
  73. *\*\          - TIM8_TRG_COM_IRQn
  74. *\*\          - TIM8_CC_IRQn
  75. *\*\          - TIM5_IRQn
  76. *\*\          - TIM6_IRQ
  77. *\*\param   command
  78. *\*\          - ENABLE
  79. *\*\          - DISABLE
  80. *\*\return  none
  81. **/
  82. static void Common_TIM_NVIC_Initialize(IRQn_Type IRQ_number, FunctionalState command)
  83. {
  84.     NVIC_InitType NVIC_InitStructure;

  85.     NVIC_InitStructure.NVIC_IRQChannel = IRQ_number;
  86.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  87.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  88.    
  89.     if(ENABLE == command)
  90.     {
  91.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  92.     }
  93.     else
  94.     {
  95.         NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  96.     }
  97.    
  98.     NVIC_Initializes(&NVIC_InitStructure);
  99. }

  100. /**
  101. *\*\name    Common_TIM_DMA_Config.
  102. *\*\param   chan_handle
  103. *\*\param   dma_param
  104. *\*\param   req_remap
  105. *\*\          - DMA_REMAP_TIM1_CH1
  106. *\*\          - DMA_REMAP_TIM1_CH2
  107. *\*\          - DMA_REMAP_TIM1_CH3
  108. *\*\          - DMA_REMAP_TIM1_CH4
  109. *\*\          - DMA_REMAP_TIM1_COM
  110. *\*\          - DMA_REMAP_TIM1_UP
  111. *\*\          - DMA_REMAP_TIM1_TRIG
  112. *\*\          - DMA_REMAP_TIM2_CH1
  113. *\*\          - DMA_REMAP_TIM2_CH2
  114. *\*\          - DMA_REMAP_TIM2_CH3
  115. *\*\          - DMA_REMAP_TIM2_CH4
  116. *\*\          - DMA_REMAP_TIM2_UP
  117. *\*\          - DMA_REMAP_TIM3_CH1
  118. *\*\          - DMA_REMAP_TIM3_CH3
  119. *\*\          - DMA_REMAP_TIM3_CH4
  120. *\*\          - DMA_REMAP_TIM3_UP
  121. *\*\          - DMA_REMAP_TIM3_TRIG
  122. *\*\          - DMA_REMAP_TIM4_CH1
  123. *\*\          - DMA_REMAP_TIM4_CH2
  124. *\*\          - DMA_REMAP_TIM4_CH3
  125. *\*\          - DMA_REMAP_TIM4_UP
  126. *\*\          - DMA_REMAP_TIM5_CH1
  127. *\*\          - DMA_REMAP_TIM5_CH2
  128. *\*\          - DMA_REMAP_TIM5_CH3
  129. *\*\          - DMA_REMAP_TIM5_CH4
  130. *\*\          - DMA_REMAP_TIM5_UP
  131. *\*\          - DMA_REMAP_TIM5_TRIG
  132. *\*\          - DMA_REMAP_TIM6_UP
  133. *\*\          - DMA_REMAP_TIM8_CH1
  134. *\*\          - DMA_REMAP_TIM8_CH2
  135. *\*\          - DMA_REMAP_TIM8_CH3
  136. *\*\          - DMA_REMAP_TIM8_CH4
  137. *\*\          - DMA_REMAP_TIM8_COM
  138. *\*\          - DMA_REMAP_TIM8_UP
  139. *\*\          - DMA_REMAP_TIM8_TRIG
  140. *\*\return  none
  141. **/
  142. static void Common_TIM_DMA_Config(DMA_ChannelType *chan_handle, DMA_InitType *dma_param, uint32_t req_remap)
  143. {
  144.     RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_DMA);
  145.    
  146.     DMA_Reset(chan_handle);

  147.     DMA_Initializes(chan_handle, dma_param);

  148.     DMA_Channel_Request_Remap(chan_handle, req_remap);
  149. }

  150. /**
  151. *\*\name    Common_TIM_DMA_Config.
  152. *\*\param   chan_handle
  153. *\*\param   src_addr
  154. *\*\param   dst_addr
  155. *\*\param   len
  156. *\*\return  none
  157. **/
  158. static void Common_TIM_DMA_Start(DMA_ChannelType *chan_handle, uint32_t src_addr, uint32_t dst_addr, uint32_t len)
  159. {
  160.     DMA_Channel_Disable(chan_handle);

  161.     chan_handle->TXNUM = len;
  162.     if(chan_handle->CHCFG & DMA_DIR_PERIPH_DST)
  163.     {
  164.         chan_handle->PADDR = dst_addr;
  165.         chan_handle->MADDR = src_addr;
  166.     }
  167.     else
  168.     {
  169.         chan_handle->PADDR = src_addr;
  170.         chan_handle->MADDR = dst_addr;
  171.     }

  172.     DMA_Channel_Enable(chan_handle);
  173. }

  174. /**
  175. *\*\name    Common_BSTIM_RCC_Initialize.
  176. *\*\param   TIMx :
  177. *\*\          - TIM6
  178. *\*\param   hclk_division
  179. *\*\          - RCC_HCLK_DIV1
  180. *\*\          - RCC_HCLK_DIV2
  181. *\*\          - RCC_HCLK_DIV4
  182. *\*\          - RCC_HCLK_DIV8
  183. *\*\          - RCC_HCLK_DIV16
  184. *\*\return  uint32_t
  185. **/
  186. static MI_BOOL Common_BSTIM_RCC_Initialize(TIM_Module *TIMx, uint32_t hclk_division)
  187. {
  188.     uint32_t BSTIM_clock;

  189.     RCC_ClocksType RCC_Clocks;

  190.     // RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA | RCC_AHB_PERIPH_GPIOB| RCC_AHB_PERIPH_GPIOC
  191.     //                                    | RCC_AHB_PERIPH_GPIOD);
  192.    
  193.     // RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_AFIO);
  194.    
  195.     // RCC 配置 RCC_HCLK_DIV1 频率为128M RCC_HCLK_DIV4 为64M
  196.     // 多个预分频器可用于配置 AHB、高速 APB(APB2)和低速 APB(APB1)的频率。AHB、APB2 和 APB1 的最大 频率分别为 128MHz、64MHz 和 32MHz。
  197.     // APB 低速(APB1)预分频器
  198.     // 由软件置位和清零,配置 APB1 时钟(PCLK1)的分频系数。需确保 PCLK1 不 超过 32MHz。
  199.     // 0xx:HCLK 不分频
  200.     // 100:HCLK 2 分频
  201.     // 101:HCLK 4 分频
  202.     // 110:HCLK 8 分频
  203.     // 111:HCLK 16 分频
  204.     //RCC_Pclk1_Config(hclk_division);

  205.     RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_TIM6);

  206.     RCC_Clocks_Frequencies_Value_Get(&RCC_Clocks);

  207.     return MI_TRUE;
  208. }

  209. // 基本定时器的使用
  210. void timer6_init()
  211. {

  212.     Common_BSTIM_RCC_Initialize(TIM6, RCC_HCLK_DIV1);

  213.      /* NVIC Configuration */
  214.     Common_TIM_NVIC_Initialize(TIM6_IRQn, ENABLE);

  215.     /* Time base configuration, period = 1000-1, prescaler = 6400-1 */
  216.     /* 100ms 触发中断一次  64000000 /(1000-1+1)* (6400-1+1) = 10HZ     */
  217.     Common_TIM_Base_Initialize(TIM6, 1000-1, 6400-1);

  218.     TIM_Base_Reload_Mode_Set(TIM6, TIM_PSC_RELOAD_MODE_IMMEDIATE);

  219.     TIM_Interrupt_Enable(TIM6, TIM_INT_UPDATE);

  220.     TIM_On(TIM6);
  221. }

  222. // timer1 当作通用定时器的使用
  223. void timer1_common_init()
  224. {
  225.     //RCC配置
  226.         RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_TIM1);

  227.     // 中断配置
  228.         Common_TIM_NVIC_Initialize(TIM1_UP_IRQn, ENABLE);
  229.    
  230.     /* Time base configuration, period = 65535, prescaler = prescaler */
  231.     Common_TIM_Base_Initialize(TIM1, 1000-1, 12800-1);
  232.     TIM_Base_Reload_Mode_Set(TIM1, TIM_PSC_RELOAD_MODE_IMMEDIATE);
  233.     TIM_Interrupt_Enable(TIM1, TIM_INT_UPDATE);
  234.     TIM_On(TIM1);
  235. }

3、中断处理函数

  1. void TIM6_IRQHandler(void)
  2. {
  3.     if (TIM_Interrupt_Status_Get(TIM6, TIM_INT_UPDATE) != RESET)
  4.     {
  5.         TIM_Interrupt_Status_Clear(TIM6, TIM_INT_UPDATE);

  6.         /* Pin PC.06 toggling */
  7.         GPIO_Pin_Toggle(LED2_GPIO_PORT, LED1_GPIO_PIN);
  8.     }
  9. }

4、main.cpp引用time6_init()后,重新烧录,即可看到led1 100ms闪烁。

注意:


/* Time base configuration, period = 1000-1, prescaler = 6400-1 /

/ 100ms 触发中断一次 64000000 /(1000-1+1)* (6400-1+1) = 10HZ */


N32G430C8L7的时钟配置为

HCLK = 128M

APB2 = 64M

APB1 = 32M




LOVEEVER 发表于 2024-12-28 18:22 | 显示全部楼层
学习一下
小小蚂蚁举千斤 发表于 2024-12-29 19:11 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4081

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部