GD32F103VE定时器0

news2024/11/14 3:06:44

本测试程序,配置GD32F103VE定时器0每500ms中断一次,中断时,开关LED灯。

只讲定时器,多了,有点乱。有的人喜欢汇总,Timer的功能太多,放在一起,会搞混,不好移植。即使放一起,也只能使用其中之一的功能。不必贪婪。测试程序如下:

#include "Timer0.h"
#include "LED.h"

void Timer_Interrupt_Initializtion(uint32_t timer_periph,uint16_t arr,uint16_t psc);

//函数功能:通用定时器0中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//Timer_Interrupt_Initializtion(TIMER0,50000,1080);//当arr=50000,psc=1080时,则为500ms,误差为10us;
void Timer_Interrupt_Initializtion(uint32_t timer_periph,uint16_t arr,uint16_t psc)
{
	timer_parameter_struct TimerParameterStruct;

	switch(timer_periph)
	{
		case TIMER0:
    	rcu_periph_clock_enable(RCU_TIMER0);      //使能TIMER0的APB2外设时钟
		  nvic_irq_enable(TIMER0_UP_IRQn, 2U, 0U);  //设置TIMER0_UP_IRQn的中断优先级,抢占优先级为2,子优先级为0
    	break;
    case TIMER1:
			rcu_periph_clock_enable(RCU_TIMER1);
		  nvic_irq_enable(TIMER1_IRQn, 2U, 0U);  //设置TIMER1_IRQn的中断优先级,抢占优先级为2,子优先级为0
		  break;
    case TIMER2:
			rcu_periph_clock_enable(RCU_TIMER2);
		  nvic_irq_enable(TIMER2_IRQn, 2U, 0U);  //设置TIMER2_IRQn的中断优先级,抢占优先级为2,子优先级为0
		  break;
    case TIMER3:
			rcu_periph_clock_enable(RCU_TIMER3);
		  nvic_irq_enable(TIMER3_IRQn, 2U, 0U);  //设置TIMER3_IRQn的中断优先级,抢占优先级为2,子优先级为0
		  break;
    case TIMER4:
			rcu_periph_clock_enable(RCU_TIMER4);
		  nvic_irq_enable(TIMER4_IRQn, 2U, 0U);  //设置TIMER4_IRQn的中断优先级,抢占优先级为2,子优先级为0
		  break;
    case TIMER5:
			rcu_periph_clock_enable(RCU_TIMER5);
		  nvic_irq_enable(TIMER5_IRQn, 2U, 0U);  //设置TIMER5_IRQn的中断优先级,抢占优先级为2,子优先级为0
		  break;
    case TIMER6:
			rcu_periph_clock_enable(RCU_TIMER6);
		  nvic_irq_enable(TIMER6_IRQn, 2U, 0U);  //设置TIMER6_IRQn的中断优先级,抢占优先级为2,子优先级为0
		  break;
    default:
    	break;
	}
	timer_deinit(timer_periph);                 //复位TIMERx

TIMERx配置开始
	TimerParameterStruct.period            = arr-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TimerParameterStruct.prescaler         = psc-1; //设置用来作为TIMx时钟频率除数的预分频值(APB2时钟分频值)
	TimerParameterStruct.clockdivision     = TIMER_CKDIV_DIV1;   //设置时钟分母值为1
	//计算公式:arr*psc/108000000/1,当arr=250,psc=108时,则为0.25ms,误差为1us;
	TimerParameterStruct.counterdirection  = TIMER_COUNTER_UP;   //设置计数方向为"向上计数"
	TimerParameterStruct.alignedmode       = TIMER_COUNTER_EDGE; //设置为无中央对齐计数模式(边沿对齐模式)
	TimerParameterStruct.repetitioncounter = 0;                  //设置"重复计数次数"为0
	timer_init(timer_periph,&TimerParameterStruct);//根据TimerParameterStruct所指向的参数初始化TIMERx的时间基数单位
TIMERx配置结束

	timer_counter_value_config(timer_periph,0);//设置TIMERx的计数器初始值为0
	//timer_counter_read(timer_periph);//读取TIMERx的计数器值

  timer_auto_reload_shadow_enable(timer_periph);//使能TIMERx自动重装载

	timer_flag_clear(timer_periph,TIMER_FLAG_UP);               //清除"TIMERx更新标志位"
	timer_interrupt_flag_clear(timer_periph,TIMER_INT_FLAG_UP); //清除"TIMERx更新中断标志位"
	timer_interrupt_enable(timer_periph,TIMER_INT_UP);          //使能"TIMERx更新"产生中断

  timer_internal_clock_config(timer_periph);//设置"内部时钟"作为定时器时钟
	//timer_slave_mode_select(timer_periph,TIMER_SLAVE_MODE_DISABLE);
	//设置"关闭从模式",如果TIMER计数器使能,则预分频器直接由内部时钟驱动

	timer_enable(timer_periph);//TIMERx计数器使能,开始工作
}


//函数功能:TIMER0更新中断服务程序
void TIMER0_UP_IRQHandler(void)
{
	if( timer_interrupt_flag_get(TIMER0,TIMER_INT_FLAG_UP) )// 读取更新中断标志位
	{
		MCU_Led_Toggle();
		timer_flag_clear(TIMER0,TIMER_FLAG_UP);               //清除"TIMER0更新标志位"
		timer_interrupt_flag_clear(TIMER0,TIMER_INT_FLAG_UP); //清除"更新中断标志位"
	}
}
#include "LED.h"

void LED_Init(void);

//函数功能:初始化MCU_Led
void LED_Init(void)
{
	rcu_periph_clock_enable(RCU_GPIOD);//使能GPIOD时钟,enable GPIO clock

	gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
	//将GPIOD15设置为输出上拉

	MCU_Led_Off();
//	GPIO_BC(GPIOD) = GPIO_PIN_15;//清除GPIOD15输出,GPIO bit clear register
}
#ifndef __LED_H
#define __LED_H

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t

#define MCU_Led_Off()  GPIO_BOP(GPIOD)=GPIO_PIN_15  //GD15输出高电平
#define MCU_Led_On() GPIO_BC(GPIOD)=GPIO_PIN_15   //GD15输出低电平
#define MCU_Led_Toggle() gpio_bit_write( GPIOD,GPIO_PIN_15,(bit_status)((1-gpio_input_bit_get(GPIOD,GPIO_PIN_15))) )
//GD15取反输出电平

extern void LED_Init(void);

#endif

main.c程序如下:

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "delay.h"

#include "LED.h"
#include "Timer0.h"

int main(void)
{
	//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)
	//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)
	//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)
	//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)
	//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"
  INTX_ENABLE();//开启所有中断

	LED_Init();//初始化MCU_Led
	delay_init();//系统时钟配置

	Timer_Interrupt_Initializtion(TIMER0,50000,1080);//设置TIMER0中断周期为500ms,误差为10us;

	while(1)
	{
		delay_ms(200);//软件延时200ms
	}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/834184.html

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

相关文章

【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT 2

1、物联网的诞生 美国计算机巨头微软(Microsoft)创办人、世界首富比尔盖茨,在1995年出版的《未来之路》一书中,提及“物物互联”。1998年麻省理工学院提出,当时被称作EPC系统的物联网构想。2005年11月,国际电信联盟发布《ITU互联网…

哪些情况下需要使用爬虫IP

不知道小伙伴们有没有遇到过这种场景:上网闲逛,看一些搞笑的视频或者想下载一些酷炫的文件,正点击呢,结果却发现被网站限制了,无法访问或者下载? 别急,今天我来告诉大家,如何借助使…

IE浏览器,和Edge浏览器

目录 一.IE浏览器(前世今生) 1.什么是IE浏览器? 2.IE浏览器发展历程 3.IE浏览器在早些年为什么这么流行 4.ie浏览器为什么被停用? 5.IE浏览器无法适应如今的Web发展原因 二.Edge(发展) 1.什么是Edge浏览器&…

2023年人工智能技术与智慧城市发展白皮书

人工智能与智慧城市是当前热门的话题和概念,通过将人工智能技术应用在城市管理和服务中,利用自动化、智能化和数据化的方式提高城市运行效率和人民生活质量,最终实现城市发展的智慧化,提升城市居民的幸福感。 AI技术在城市中的应…

【修正-高斯拉普拉斯滤波器-用于平滑和去噪】基于修正高斯滤波拉普拉斯地震到达时间自动检测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

iMX6ULL应用移植 | 移植 infoNES 模拟器(重玩经典NES游戏)

没玩过NES游戏的童年,可能不是80后的童年。我们小时候是从玩FC开始接触游戏机的,那时真的是红极一时啊,我上初中时还省吃俭用买了一台小霸王,暑假里把电视机都给打爆了!那时任天堂单是FC机的主机的发售收入就超过全美的…

小白解密ChatGPT大模型训练;Meta开源生成式AI工具AudioCraft

🦉 AI新闻 🚀 Meta开源生成式AI工具AudioCraft,帮助用户创作音乐和音频 摘要:美国公司Meta开源了一款名为AudioCraft的生成式AI工具,可以通过文本提示生成音乐和音频。该工具包含三个核心组件:MusicGen用…

Spring源码面试题

Spring源码面试题 谈谈你对Spring框架的理解? Spring 是一个开源的应用程序框架,它起源于 Rod Johnson 在其著名的 Spring Framework 专著中提出的一个轻量级框架的观念。下面是 Spring 的发展历史: 2002 年,Rod Johnson 发表了他的专著 …

GPT Prompt编写的艺术:如何提高AI模型的表现力

随着AI技术的迅速发展,人工智能模型变得越来越强大,能够协助我们完成各种任务。然而,如何更好地利用AI的能力仍然存在很大的探索空间。在与AI进行交互的过程中,我们主要依赖于Prompt,不管是直接与大模型交互&#xff0…

dlib的安装

由于需要人脸识别,所以需要安装opencv和dlib,OpenCV的安装很顺利,实例也跑的很正常。但dlib的安装却出现了很多坑,而且国内的解决方法都是复制粘贴,一点营养都没有,查了国外资料,终于解决&#…

让Python点亮你的世界:打造专业级编程环境的必备步骤

文章目录 初识pythonpython的安装win系统Linux系统(centos7) 第一个Python程序常见问题 Python解释器Python开发环境PyCharm的基础使用创建项目修改主题修改默认字体和大小汉化插件翻译软件常用快捷键 初识python Python语言的起源可以追溯到1989年&…

OFCMS代码审计

环境搭建 https://blog.csdn.net/oufua/article/details/82584637 安装后是重启容器 最后 db-config.properties 改成db.properties 修改数据库连接 搭建成功 代码审计 sql注入审计 全局搜索${ 查看没有预编译的sql语句,从而找到sql注入功能点 Ctrlalth 查看函…

AIGC大模型ChatGLM2-6B:国产版chatgpt本地部署及体验

1 ChatGLM2-6B介绍 ChatGLM是清华技术成果转化的公司智谱AI研发的支持中英双语的对话机器人。ChatGLM基于GLM130B千亿基础模型训练,它具备多领域知识、代码能力、常识推理及运用能力;支持与用户通过自然语言对话进行交互,处理多种自然语言任务…

干翻Dubbo系列第八篇:Dubbo直连开发核心三要素概述

文章目录 文章说明 一:Dubbo直连开发概念 1:直连设计中的核心组件 (一):Provider服务的提供者 (二): Consumer服务的访问者 (三):网络通信明白图 文章说明 本文内容整理自《孙哥说Dubbo系列视频课程》,孙帅老师…

❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件

❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件 cmd或者终端用nvm 安装提示: npm不是内部或外部命令,也不是可运行的程序或批处理文件 原因(一) 提示这个问题,有可能是Node没有安装,也有可能是没有配置…

【LeetCode】105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 这道题也是经典的数据结构题了,有时候面试题也会遇到,已知前序与中序的遍历序列,由前序遍历我们可以知道第一个元素就是根节点,而中序遍历的特点就是根节点的左边全部为左子树,右…

C高级-day2

思维导图 #!/bin/bash echo "$(head -n 5 /etc/group | tail -1)" mkdir /home/ubuntu/copy cd /home/ubuntu/copy cp /etc/shadow test chown root test chmod o-r,o-w,o-x test#include <myhead.h> //递归实现&#xff0c;输入一个数&#xff0c;输出这个数的…

OpenShift 4 - 可观测性之用 OpenTelemetry+Tempo 实现 Distributed Tracing

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.13 的环境中验证 文章目录 技术架构部署 Distributed Tracing 运行环境安装 minio 环境安装 Grafana Tempo 环境 部署测试应用并进行观测跟踪测试应用1测试应用2 参考 技术架构 Tempo …

Vue3 watch监听器

概览&#xff1a;watch监听器的定义以及使用场景。在vue3中的监听器的使用方式&#xff0c;watch的三个参数&#xff0c;以及进一步了解第一个参数可以是一个属性&#xff0c;也可以是一个数组的形式包含多个属性。 watch在vue3和vue2中的使用&#xff1a; vue3中&#xff1a…

互联网+同城上门预约推拿系统-到家理疗服务平台源码

随着互联网技术的不断发展&#xff0c;越来越多的传统行业开始拥抱互联网&#xff0c;实现线上线下融合。推拿按摩作为人们日常保健、治疗疾病的一种方式&#xff0c;也在不断探索与互联网的结合。 本文将介绍基于互联网思维的家庭同城预约推拿系统到家服务平台的源码如何实现…