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

news2024/11/29 0:42:57

基本定时器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.coloradmin.cn/o/474201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python毕业设计之django+vue专业手语翻译工作室预约管理系统

发起预约:用户选定某翻译员发起预约,进行预约信息填写,主要内容有联系电话、工作方式、场合、时间段;或发起预约,填写预约信息,筛选翻译员,可按关键词筛选或等级筛选。发起预约时间需至少提前服…

从CPU的视角看 多线程代码为什么那么难写!

当我们提到多线程、并发的时候,我们就会回想起各种诡异的bug,比如各种线程安全问题甚至是应用崩溃,而且这些诡异的bug还很难复现。我们不禁发出了灵魂拷问 “为什么代码测试环境运行好好的,一上线就不行了?”。 为了解…

如何将 github pages 迁移到 vercel 上托管

如何将 github pages 迁移到 vercel 上托管 前言 早期网站使用 github pages,后来迁移到 coding,最近又放到腾讯云网站静态托管,无论是 coding 的 cos 存储桶,还是静态网站托管 他们都是收费的,那有没有免费的托管商呢,既不影响网站的访问速度还免费,于是,找了一下,还真有,ve…

电商广告营销中,有哪些常见公式和优化手段

对于电商广告ROI的计算,广泛地应用在二类电商、跨境电商等营销场景中,了解这些相关的投放公式,有助于我们更好地进行广告投放和优化。 特别是针对商家而言,可以指导选品及定价策略、优化最终的广告投放收益,避免出现花…

学系统集成项目管理工程师(中项)系列14_采购管理

1. 概念和术语 1.1. 采购是从项目团队外部获得产品、服务或成果的完整的购买过程 1.2. 三大类 1.2.1. 工程 1.2.2. 产品/货物 1.2.3. 服务 2. 主要过程 2.1. 编制采购管理计划 2.2. 实施采购 2.3. 控制采购 2.4. 结束采购 3. 合同 3.1. 包括买方和卖方之间的法律文…

css布局实战:动态详情九宫格

上篇文件介绍了如何实现九宫格图片展示:css布局入门级实战之九宫格网格布局.不过存在一个问题:图片之间没有间距,用户体验欠佳;基于以上问题,本文进行优化. 较之前实现样式做以下调整:四张图按照两行显示,每行显示三个.不足的显示空白.之前是两行两列显示. 对应九宫格样…

忆暖行动|“他一个人推着老式自行车在厚雪堆的道路上走,车上带着学生考试要用的司机”

忆暖行动|“他一个人推着老式自行车在厚雪堆的道路上走,车上带着学生考试要用的sj” 一头白发,满山青葱 在那斑驳的物件褶皱中,透过泛黄的相片,掩藏着岁月的冲刷和青葱的时光。曾经的青年早已经不复年轻,但是那份热爱…

从信息泄露到权限后台

声明:文中涉及到的技术和工具,仅供学习使用,禁止从事任何非法活动,如因此造成的直接或间接损失,均由使用者自行承担责任。 点点关注不迷路,每周不定时持续分享各种干货。 众亦信安,中意你啊&a…

1210. 穿过迷宫的最少移动次数

你还记得那条风靡全球的贪吃蛇吗? 我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格。蛇会从左上角((0, 0) 和 (0, 1))开始移动。我们用 0 表示空单元格,用 1 表示障碍…

题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和--不能完全通过,最好情况通过67.

原题链接: 题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和 https://www.dotcpp.com/oj/problem3166.html 致歉 害,首先深感抱歉,这道题还是没有找到很好的解决办法。目前最好情况就是67分。 这道题先这样跳过吧,当然以后还…

RabbitMQ 03 直连模式-可视化界面

这里先演示最简单的模型:直连模式。其结构图为: 一个生产者 -> 消息队列 -> 一个消费者 生产者只需要将数据丢进消息队列,而消费者只需要将数据从消息队列中取出,这样就实现了生产者和消费者的消息交互。 创建一个新的实验…

CLion开发工具 | 05 - 使用CLion开发ESP32

专栏介绍 一、准备工作 电脑上安装好ESP-IDF环境本文参考Jetbrains官方视频教程:在 Windows 上用 CLion 开发 ESP32 | CLion教程 | 嵌入式开发 | IDE 二、打开工程 复制一份新的helloworld工程。 使用CLion打开该工程。 选择信任该工程。 CLion打开后自动打开…

Linux 基础语法 -2

如果我们以后再Linux当中 写了一些命名,导致程序我们不能进行操作了,如这个死循环: 他就会一直输出 "hello Linux" ,我们就使用 ctrl c 来终止因为程序或者指令异常,而导致我们无法进行指令输入&#xff…

2023/04/27~28 刷题记录

D - JoJos Incredible Adventures 大致题义: 有一串由 0,1 构成的字符串,每次循环右移一位,行编号从 0 一直到 n-1。求这些行里由 1 构成的最大矩形面积。 题解: 我们其实可以观察到一串连续的 1 经过右移后是会形成一对正三角和…

C# WebService的开发以及客户端调用

目录 1、WebService简介 1.1 什么是XML? 1.2 什么是Soap? 1.3 什么是WSDL? 2、WebService与WebApi的区别与优缺点 2.1 WebService与WebApi的区别: 2.2 WebService的优缺点: 2.3 WebApi的优缺点: 3…

ShardingJDBC 数据库分片 流式处理+归并排序 优化原理刨析

1. 分库分表下的分页查询 业务数据达到一定数据量时,必定会引入数据库分片,但当对于分片的情况下,分页查询是如何做到的? 比如: 数据库db1,中有三个user表,user_0,user_1,user_2&a…

FreeRTOS 信号量(五) ------ 递归互斥信号量

文章目录 一、递归互斥信号量简介二、创建互斥信号量1. xSemaphoreCreateRecursiveMutex()2. xSemaphoreCreateRecursiveMutexStatic() 三、递归信号量创建过程分析四、释放递归互斥信号量五、获取递归互斥信号量六、递归互斥信号量使用示例 一、递归互斥信号量简介 递归互斥信…

Linux学习[8]文件权限深入2 默认权限umask SUID/SGID/SBIT file指令

文章目录 前言1. 默认权限umask1.1 默认权限含义1.2 查看默认权限1.3 默认权限在文件与目录的异同 2. 特殊权限2.1 SUID2.2 SGID2.3 SBIT2.4 SUID/SGID/SBIT 权限设置2.4.1 数字法2.4.2 符号法 3. file指令 前言 在linux学习6里面,通过ls -al命令列出文件的所有详细…

2023/4/30周报

目录 摘要 论文阅读 1、题目和现存问题 2、知识空间理论、GRU和自注意力机制 3、模型构建 4、实验准备 5、实验结果 深度学习 1、GRU 2、代码实例 3、GRU和GCN结合的可能性 总结 摘要 本周在论文阅读上,阅读了一篇基于自注意力机制和双向GRU神经网络的…

【MATLAB数据处理实用案例详解(17)】——利用概念神经网络实现柴油机故障诊断

目录 一、问题描述二、利用概念神经网络实现柴油机故障诊断原理三、算法步骤3.1 定义样本3.2 样本归一化3.3 创建网络模型3.4 测试3.5 显示结果 四、运行结果五、完整代码 一、问题描述 柴油机的结构较为复杂,工作状况非常恶劣,因此发生故障的可能性较大…