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

GD32VW553-IOT V2【微秒延迟时间实现方法】

一、硬件介绍

1、产品特点

萤火工场基于兆易创新GD32VW553(GD32VW553HMQ7)无线双模MCU研发、RISC-V内核的32位MCU的开源硬件

GD32VW553系列MCU采用了全新的开源指令集架构RISC-V处理器内核,主频可达160MHz。集成了高达4MB Flash及320KB SRAM,另有32KB可配置指令高速缓存(I-Cache),大幅提升了CPU处理效率,支持2.4GHz Wi-Fi 6及BLE5.2无线连接标准;

性能参数

功能参数
FLASH(KB)4096
SRAM(KB)320
时钟———————————
General Timer(16-bit)2
General Timer(32-bit)2
Advanced Timer(16-bit)1
Basic Timer(16-bit)1
SysTick(64-bit)1
Watchdog2
RTC1
接口———————————
USART1
UART2
I2C2
SPI1
QSPI1
Wi-Fi 61
BLE 5.21
12bit ADC Units(Channels)1(9)

2、硬件升级优化

经过一年,对比上一代,硬件布局升级,进行了系统性优化,更加的方便好用了;

Type-C 口升级: 集成串口功能, 简化调试与程序下载流程, 提升开发便捷性;
新增开关: 增设用户可自定义按键及指示灯, 拓展交互控制与状态显示功能;
板面布局优化: 背面增加引脚丝印, 正面仅保留关键器件丝印, 布局清晰及信息聚焦;
FLASH 焊接位: 移至背面, 减少焊接风险, 增加开源二次开发的灵活性;
BOOT 开关优化: 升级为拔码式设计, 简化操作逻辑, 提升切换效率;
稳固性增强: 板厚增至 1mm, 提升了整体结构强度与抗变形能力 ;

实物如下:

GD32VW55x系列 支持 cJTAG 和 JTAG,不支持 SWD 的调试接口
需使用GDLink / JLink 调试器

在这里插入图片描述

3、功能引脚示意图 / 原理图

开发板相关手册 / 资料下载

板载LED灯

LED1:电源指示灯 🔴

USR_LED:PB2 🔴

BOOT选择 (SW1切换)

BOOT0:PC8

BOOT1:PB1

按键

KEY1:复位按钮

KEY2:PB11 (USR_KEY)

在这里插入图片描述

引脚定义

板载Type-C串口功能: PB15 / PA8 (UART1_RX / TX)
USART0(PB15 和 PA8), UART1(PA4 和 PA5),UART2(PA6 和 PA7)

引脚复用功能
PC8(BOOT0)TIMER2_CH2, I2C0_SDA, I2C1_SDA, USART0_TX, UART1_TX
PB0TIMER0_CH1_ON, TIMER0_CH0, TIMER0_CH2, UART1_TX, I2C0_SCL, TIMER2_ETI, TIMER16_CH0, UART2_CTS, TIMER0_BRKIN
附加功能:ADC_IN8
PA9SPI_MOSI, TIMER0_CH1, QSPI_SCK, USART0_TX, TIMER15_CH0_ON
PA10SPI_MISO, TIMER0_CH2, QSPI_CSN, TIMER16_CH0, USART0_RX
PA11SPI_SCK, TIMER0_CH3, QSPI_IO0, TIMER16_BRKIN, TIMER1_CH3
PA12(WKUP3)TIMER0_ETI, TIMER0_CH3, QSPI_IO1, SPI_NSS, USART0_CK, TIMER1_CH2, TIMER16_CH0_ON
PB13TIMER0_CH0_ON, TIMER1_CH3, I2C1_SDA, TIMER15_CH0
PB12TIMER0_BRKIN, TIMER0_CH3, TIMER1_CH2, I2C1_SCL
PB4(NJTRST)TIMER1_CH0, TIMER1_ETI, QSPI_IO3, USART0_TX, UART1_TX
PB3(JTDO)TIMER1_CH1, QSPI_IO2, USART0_RX, UART1_RX, TIMER15_BRKIN
PA15(JTDI)TIMER1_CH0, TIMER1_ETI, I2C0_SCL, I2C1_SCL, USART0_RX, UART1_RX
附加功能:ADC_IN8
PA14(JTCK)I2C1_SMBA, I2C1_SDA, USART0_RTS, UART1_RTS
PA13(JTMS)I2C0_SMBA, I2C1_SCL, USART0_CTS, UART1_CTS
PB15(UART1_TX)RTC_REFIN, TIMER0_CH2_ON, TIMER2_CH0, I2C0_SCL, I2C1_SCL, USART0_TX, IFRP_OUT
PA8(UART1_RX)CK_OUT0, TIMER0_CH0, USART0_RX, I2C0_SDA, I2C1_SDA, USART0_CK, TIMER15_CH0, RTC_OUT, TIMER0_CH2_ON
PA7(WAKEUP2)I2C1_SDA, TIMER0_CH0_ON, TIMER2_CH1, QSPI_IO1, SPI_NSS, SPI_MOSI, TIMER0_CH1_ON, UART2_RX, TIMER1_CH2
附加功能:ADC_IN7
PA6TIMER2_CH0, QSPI_IO0, I2C1_SCL, SPI_MISO, SPI_SCK, TIMER0_CH1, TIMER1_CH1, UART2_TX
附加功能:ADC_IN6
PA5UART1_RX, TIMER2_ETI, QSPI_CSN, SPI_MISO, SPI_SCK, TIMER0_CH1_ON
附加功能:ADC_IN5
PA4UART1_TX, SPI_MOSI, QSPI_SCK, SPI_NSS, TIMER0_CH1
附加功能:ADC_IN4
PA3USART0_RTS, TIMER1_CH3, I2C0_SDA, SPI_NSS, TIMER0_CH0_ON, UART1_RX, RTC_OUT
附加功能:ADC_IN3
PA2USART0_CTS, TIMER1_CH2, I2C0_SCL, SPI_SCK, TIMER0_CH0, UART1_TX
附加功能:ADC_IN2
PA1USART0_RX, TIMER1_CH1, SPI_MISO, UART1_RTS
PA0(WAKEUP0)USART0_TX, TIMER1_CH0, TIMER1_ETI, SPI_MOSI, UART1_CTS, TIMER0_ETI
附加功能:ADC_IN0, RTC_TAMP1
PB1TIMER0_CH2_ON, TIMER0_CH0_ON, TIMER2_CH2, UART1_RX, I2C0_SDA, TIMER16_CH0_ON, UART2_RTS
附加功能:BOOT1

BOOT 引导模式配置

启动时,使用 BOOT0 和 BOOT1 引脚选择引导存储器地址
选择从 ROM 启动,FLASH 启动或者 SRAM 启动

BOOT0BOOT1引导地址引导区域
0-0x08000000SIP Flash
0-0x0BF46000secure boot
100x0BF40000Bootloader / ROM
110x20000000SRAM
1-0x0BF40000Bootloader / ROM

主要原理图:

在这里插入图片描述

系统框图
在这里插入图片描述

二、滴答定时器介绍

RISC-V处理器内部包含了一个简单的定时器SysTickSysTick定时器可用作标准的下行计数器,是一个64位向上计数器,有自动重新装载能力,可屏蔽系统中断发生器;

RCU 通过 AHB 时钟(HCLK)8 分频后作为 RISC-V系统定时器(SysTick)的外部时钟。通过对 SysTick 控制和状态寄存器的设置,可选择上述时钟或 AHB(HCLK)时钟作为 SysTick 时钟。

输入的时钟默认为160MHz。滴答定时器里的时钟源是SOCCLKSOCCLK并不等于主频(CPUCLK),而是由主频除以一个预分频系数得到的。

这个预分频系数可以通过寄存器SysTimer_MTIMECFGR的CLKDIV位来设置,其默认值是4

因此,SOC CLK的实际频率是160MHz / 4 = 40MHz,而不是160MHz
SOC CLK的频率就是滴答定时器实际上的频率。

SysTick定时器设定比较值并使能之后,每经过1个系统时钟周期,计数值就加1,减到0时,SysTick计数器自动重新装载初值并继续计数,同时内部的COUNTFLAG标志位被置位,触发中断(前提是开启中断)。

SystemCoreClock / 4000 是放入重装载寄存器中的值。
以系统时钟为160MHz为例,重装载值就为160MHz/4000=40000,即每振荡40000次就产生一个中断。

滴答定时器时钟为40Mhz,1秒振荡40M次,那么每计数一次时钟为 1 / 40000000 s的时间。

计数SystemCoreClock / 4000 个时钟的时间就是

(SystemCoreClock / 4000) * (1 / 40000000) = 40000 / 40000000 = 0.001s = 1ms

NVIC_SetPriority(SysTick_IRQn, 0x00U);是开启中断;
每当定时1ms时间到就会进入到中断函数SysTick_Handler里面,所以每进入一次中断就是1ms;

三、延迟时间设置方法

SetValue = SystemCoreClock / (time * systickCLK)

SystemCoreClock:主控频率默认160MHz

systickCLK:滴答定时器频率,为主控频率的4分频率,默认40MHz;

time:要设置的时间,单位为秒;

SetValue:要设置的滴答定时器比较值

例:设置滴答定时器1us进行中断

SetValue = 160,000,000 / (0.000001 * 40,000,000)
SetValue = 160,000,000 / 40
SetValue = 4000000

只需在代码中修改为4000000即可

SysTimer_SetCompareValue(SystemCoreClock / 4000000);

四、代码编写

工程项目中的 systick.c 中已实现了自带的毫秒级延迟void delay_1ms(uint32_t count)
但没有实现微秒级延迟,以下是简易的实现方法;

systick.c

#include "gd32vw55x.h"
#include "systick.h"volatile static uint32_t delay;void systick_config(void)
{SysTimer_SetControlValue(SysTimer_MTIMECTL_CMPCLREN_Msk);SysTimer_SetCompareValue(SystemCoreClock / 4000); // 1ms__ECLIC_SetTrigIRQ(CLIC_INT_TMR, ECLIC_POSTIVE_EDGE_TRIGGER);eclic_irq_enable(CLIC_INT_TMR, 0, 0);
}void delay_1us(uint32_t count)
{uint64_t ticks;uint64_t told, tnow;uint64_t tcnt = 0;uint64_t reload = SysTimer_GetCompareValue(); // 获取比较值作为重载值ticks = (uint64_t)count * ((SystemCoreClock / 4000000); // 1us/* 获取当前时间 */told = (uint64_t)SysTimer->MTIMER;while (1){/* 循环获得当前时间,直到达到指定的时间后退出循环 */tnow = (uint64_t)SysTimer->MTIMER;if (tnow != told){if (tnow < told){tcnt += (reload - told) + tnow;}else{tcnt += tnow - told;}told = tnow;if (tcnt >= ticks){break;}}}
}void delay_1ms(uint32_t count)
{delay = count;while (0U != delay){}
}void delay_decrement(void)
{if (0U != delay){delay--;}
}
http://www.dtcms.com/a/392783.html

相关文章:

  • html5是移动设备玖写口吧目盖由
  • 华为全联接大会 2025:跃升行业智能化
  • 采用Mayavi对BEV相机外参进行可视化
  • 算法高频题-动态规划
  • 第七篇:强类型枚举:enum class - 彻底解决传统枚举的缺陷
  • 汽车中的轻量化 AI 算法:驶向智能出行新未来
  • 《根治开放世界坐骑卡顿:从时钟同步到负载均衡的架构级解决方案》
  • 在线预览Office文件全攻略
  • Cordova打包Vue项目成APK——真机调试
  • DNS协议、ICMP协议、NAT技术
  • HTML5 基础与常用标签
  • 2023 CCPC Online vp补题-D
  • 阿勒泰羊区域公用品牌在京发布 多方合力打造“雪都牧歌·天选之羊”产业新生态
  • 【分布式技术】Redis 双集群主备部署方案” 的详细说明
  • (信号)频谱泄露和频谱混叠
  • 蓝桥杯2024年第15届B组试题D
  • 【软考中级 - 软件设计师 - 基础知识】数据结构之线性表
  • Tomcat工作机制与Servlet流程详解
  • Netty从0到1系列之Recycler对象池技术【1】
  • 开始 ComfyUI 的 AI 绘图之旅-SD3.5文生图和图生图(全网首发,官网都没有更新)(十五)
  • [数理逻辑] 决定性公理与勒贝格可测性 (III) 有限维情况
  • 浅谈 “混合检索”和“重排”
  • 计算机视觉与深度学习 | 基于Matlab的雾霾天气和夜间车牌识别系统关键技术与架构设计
  • 二、PyTorch张量学习教程:从小白到高手的实战之旅
  • 名字空间,异常与匿名函数
  • DCM项目wan 1.3b T2V模型comfyui改造流程尝试
  • python编写的第一个appium自动化测试脚本
  • 道客巴巴文库资料免费下载的方法(不需要第三方软件)
  • 【C++】STL详解(九)—priority_queue的使用与模拟实现
  • 【车载开发系列】了解FlashDriver