当前位置: 首页 > article >正文

国民技术N32G430开发笔记(5)- 基本定时器TIM6的使用

基本定时器TIM6的使用

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

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

/**
*\*\file timer_common.c
*\*\author Nations
*\*\version v1.0.0
*\*\copyright Copyright (c) 2019, Nations Technologies Inc. All rights reserved.
**/
#include "timer.h"
#include "main.h"
#include "type.h"

static TIM_TimeBaseInitType TIM_TimeBaseStructure;

/**
*\*\name    Common_TIM_Base_Initialize.
*\*\param   TIMx :
*\*\          - TIM1
*\*\          - TIM2
*\*\          - TIM3
*\*\          - TIM4
*\*\          - TIM5
*\*\          - TIM6
*\*\param   period
*\*\          - [1, 0xffff]
*\*\param   prescaler
*\*\          - [0, 0xffff]
*\*\return  none
**/

static void Common_TIM_Base_Initialize(TIM_Module *TIMx, uint16_t period, uint16_t prescaler)
{
    TIM_Base_Struct_Initialize(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period    = period;
    TIM_TimeBaseStructure.Prescaler = prescaler;
    TIM_TimeBaseStructure.ClkDiv    = 0;
    TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;

    TIM_Base_Initialize(TIMx, &TIM_TimeBaseStructure);   
}

/**
*\*\name    Common_TIM_NVIC_Initialize.
*\*\param   IRQ_number :
*\*\          - TIM1_BRK_IRQn
*\*\          - TIM1_UP_IRQn
*\*\          - TIM1_TRG_COM_IRQn
*\*\          - TIM1_CC_IRQn
*\*\          - TIM2_IRQn
*\*\          - TIM3_IRQn
*\*\          - TIM4_IRQn
*\*\          - TIM8_BRK_IRQn
*\*\          - TIM8_UP_IRQn
*\*\          - TIM8_TRG_COM_IRQn
*\*\          - TIM8_CC_IRQn
*\*\          - TIM5_IRQn
*\*\          - TIM6_IRQ
*\*\param   command
*\*\          - ENABLE
*\*\          - DISABLE
*\*\return  none
**/
static void Common_TIM_NVIC_Initialize(IRQn_Type IRQ_number, FunctionalState command)
{
    NVIC_InitType NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = IRQ_number;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    
    if(ENABLE == command)
    {
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    }
    else
    {
        NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
    }
    
    NVIC_Initializes(&NVIC_InitStructure);
}

/**
*\*\name    Common_TIM_DMA_Config.
*\*\param   chan_handle
*\*\param   dma_param
*\*\param   req_remap
*\*\          - DMA_REMAP_TIM1_CH1
*\*\          - DMA_REMAP_TIM1_CH2
*\*\          - DMA_REMAP_TIM1_CH3
*\*\          - DMA_REMAP_TIM1_CH4
*\*\          - DMA_REMAP_TIM1_COM
*\*\          - DMA_REMAP_TIM1_UP
*\*\          - DMA_REMAP_TIM1_TRIG
*\*\          - DMA_REMAP_TIM2_CH1
*\*\          - DMA_REMAP_TIM2_CH2
*\*\          - DMA_REMAP_TIM2_CH3
*\*\          - DMA_REMAP_TIM2_CH4
*\*\          - DMA_REMAP_TIM2_UP
*\*\          - DMA_REMAP_TIM3_CH1
*\*\          - DMA_REMAP_TIM3_CH3
*\*\          - DMA_REMAP_TIM3_CH4
*\*\          - DMA_REMAP_TIM3_UP
*\*\          - DMA_REMAP_TIM3_TRIG
*\*\          - DMA_REMAP_TIM4_CH1
*\*\          - DMA_REMAP_TIM4_CH2
*\*\          - DMA_REMAP_TIM4_CH3
*\*\          - DMA_REMAP_TIM4_UP
*\*\          - DMA_REMAP_TIM5_CH1
*\*\          - DMA_REMAP_TIM5_CH2
*\*\          - DMA_REMAP_TIM5_CH3
*\*\          - DMA_REMAP_TIM5_CH4
*\*\          - DMA_REMAP_TIM5_UP
*\*\          - DMA_REMAP_TIM5_TRIG
*\*\          - DMA_REMAP_TIM6_UP
*\*\          - DMA_REMAP_TIM8_CH1
*\*\          - DMA_REMAP_TIM8_CH2
*\*\          - DMA_REMAP_TIM8_CH3
*\*\          - DMA_REMAP_TIM8_CH4
*\*\          - DMA_REMAP_TIM8_COM
*\*\          - DMA_REMAP_TIM8_UP
*\*\          - DMA_REMAP_TIM8_TRIG
*\*\return  none
**/
static void Common_TIM_DMA_Config(DMA_ChannelType *chan_handle, DMA_InitType *dma_param, uint32_t req_remap)
{
    RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_DMA);
    
    DMA_Reset(chan_handle);

    DMA_Initializes(chan_handle, dma_param);

    DMA_Channel_Request_Remap(chan_handle, req_remap);
}

/**
*\*\name    Common_TIM_DMA_Config.
*\*\param   chan_handle
*\*\param   src_addr
*\*\param   dst_addr
*\*\param   len
*\*\return  none
**/
static void Common_TIM_DMA_Start(DMA_ChannelType *chan_handle, uint32_t src_addr, uint32_t dst_addr, uint32_t len)
{
    DMA_Channel_Disable(chan_handle);

    chan_handle->TXNUM = len;
    if(chan_handle->CHCFG & DMA_DIR_PERIPH_DST)
    {
        chan_handle->PADDR = dst_addr;
        chan_handle->MADDR = src_addr;
    }
    else
    {
        chan_handle->PADDR = src_addr;
        chan_handle->MADDR = dst_addr;
    }

    DMA_Channel_Enable(chan_handle);
}

/**
*\*\name    Common_BSTIM_RCC_Initialize.
*\*\param   TIMx :
*\*\          - TIM6
*\*\param   hclk_division
*\*\          - RCC_HCLK_DIV1
*\*\          - RCC_HCLK_DIV2
*\*\          - RCC_HCLK_DIV4
*\*\          - RCC_HCLK_DIV8
*\*\          - RCC_HCLK_DIV16
*\*\return  uint32_t
**/
static MI_BOOL Common_BSTIM_RCC_Initialize(TIM_Module *TIMx, uint32_t hclk_division)
{
    uint32_t BSTIM_clock;

    RCC_ClocksType RCC_Clocks;

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

    RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_TIM6);

    RCC_Clocks_Frequencies_Value_Get(&RCC_Clocks);

    return MI_TRUE;
}

// 基本定时器的使用
void timer6_init()
{
 
    Common_BSTIM_RCC_Initialize(TIM6, RCC_HCLK_DIV1);

     /* NVIC Configuration */
    Common_TIM_NVIC_Initialize(TIM6_IRQn, ENABLE);

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

    TIM_Base_Reload_Mode_Set(TIM6, TIM_PSC_RELOAD_MODE_IMMEDIATE);

    TIM_Interrupt_Enable(TIM6, TIM_INT_UPDATE);

    TIM_On(TIM6);
}

// timer1 当作通用定时器的使用
void timer1_common_init()
{
    //RCC配置
	RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_TIM1);

    // 中断配置
	Common_TIM_NVIC_Initialize(TIM1_UP_IRQn, ENABLE);
    
    /* Time base configuration, period = 65535, prescaler = prescaler */
    Common_TIM_Base_Initialize(TIM1, 1000-1, 12800-1);
    TIM_Base_Reload_Mode_Set(TIM1, TIM_PSC_RELOAD_MODE_IMMEDIATE);
    TIM_Interrupt_Enable(TIM1, TIM_INT_UPDATE);
    TIM_On(TIM1);
}

3、中断处理函数

void TIM6_IRQHandler(void)
{
    if (TIM_Interrupt_Status_Get(TIM6, TIM_INT_UPDATE) != RESET)
    {
        TIM_Interrupt_Status_Clear(TIM6, TIM_INT_UPDATE);

        /* Pin PC.06 toggling */
        GPIO_Pin_Toggle(LED2_GPIO_PORT, LED1_GPIO_PIN);
    }
}

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

在这里插入图片描述

配置的代码在system_n32g430.c文件里

在这里插入图片描述

在这里插入图片描述

有时钟树得知:
TIM2/3/4/5/6的频率为64M
TIM1/8频率为128M


http://www.kler.cn/a/15591.html

相关文章:

  • 探索美赛:从准备到挑战的详细指南
  • Lua资料
  • ARM(安谋) China处理器
  • MySQL的游标和While循环的详细对比
  • 性能高于Transformer模型1.7-2倍,彩云科技发布基于DCFormer架构通用大模型云锦天章
  • 37.超级简易的计算器 C语言
  • 外网SSH远程连接linux服务器,看这一篇就够了
  • 动态内存管理
  • 【zotero】从知网万方维普WOS等数据库上导出格式引文-引文格式到zotero中
  • 【RPA开发】lxml 库之 etree 使用详解
  • AI智能课程:第五讲chatGPT搞定APP小程序
  • 【VM服务管家】VM4.x算法模块开发_4.2 联合OpenCV开发
  • 推荐一些免费可用的热门 API
  • JAVA面试中遇到的那些坑,80%的人都种过招
  • 【web基础】html常用标签+作品展示
  • 如何在自己的Maven工程上搭建Mybatis框架?
  • 『LogDashboard』.NET开源的日志面板——登录授权页面扩展
  • Spring Security 6.0系列【30】授权服务器篇之JOSE规范
  • 软件和信息服务业专题讲座
  • 【go】三色标记-垃圾回收机制
  • 电信运营商网络运维方案
  • FPGA入门系列12--RAM的使用
  • jsp家庭农场投入品信息管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目
  • python哲学
  • Vue——组合式函数
  • 流程图拖拽视觉编程-流程编辑器