GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

2023-11-19

前言

之前写了GD32F103调试小记(二)之USART(接收中断、接收空闲中断+DMA、发送DMA)一文。这次我们来看看GD32F303的USART是如何配置的,结合这两篇文章,相信大家GD32的USART配置流程会十分熟悉。

DMA

能大大减轻CPU负荷,数据的搬运工,建议场景合适的情况下,都去配置DMA功能。

USART

一种串行通信协议,网上资料很多,这里不多说。

各模块程序编写

在配置前,请确保你已经有一个GD32F303包含其对应标准库的Keil工程
1、时钟配置

图1.1 GD32F303外设挂载架构

  • 上图说明了GD32F303所拥有的外设时钟挂载在哪个总线上。这里我们使用USART2,挂载在APB1总线上。
  • 这里我们开启各GPIO端口时钟、GPIO引脚复用功能时钟、DMA时钟和USART2的时钟。
void SystemClock_Reconfig(void)
{
	/* Enable all peripherals clocks you need*/
	rcu_periph_clock_enable(RCU_AF);
	
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOB);
	rcu_periph_clock_enable(RCU_GPIOC);
	rcu_periph_clock_enable(RCU_GPIOD);
		
	rcu_periph_clock_enable(RCU_DMA0);

	rcu_periph_clock_enable(RCU_USART2);
}

2、配置GPIO
请添加图片描述

  • 这里我用到了PC10和PC11作为USART2的TX与RX,代码配置如下:
// USART port and pins definition 
#define USART2_PORT						GPIOC
#define USART2_TX_PIN					GPIO_PIN_10
#define USART2_RX_PIN					GPIO_PIN_11

void GPIO_Init(void)
{
	/* 使用SW下载,不使用JTAG下载,管脚用作其它功能 */
	gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);

	/* demo board USARTx I/O */
	gpio_pin_remap_config(GPIO_USART2_PARTIAL_REMAP, ENABLE);
	gpio_init(USART2_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ,USART2_TX_PIN);
	gpio_init(USART2_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,USART2_RX_PIN);	
}

3、配置DMA
请添加图片描述

  • 上图可知,USART2_TX和UASRT2_RX对应DMA0_CH1和DMA0_CH2。
  • 记住DMA传输的方向,TX对应的DMA通道是从我们内存中定义的变量搬运到USART2的发送寄存器中,而RX对应的DMA通道是从USART2的接收寄存器搬运到我们内存里定义的变量。
  • DMA是个搬运工,如果是单个字节的发送与接收,单凭USART自带的接收/发送完成标志位也可以做到。所以如果在USART上用到了DMA一定是多个字节数据的传输。这里用USARTx_RX_BY_IDLE_DMA做一个宏的区分。
  • 这里TX对应的通道初始化完成后先关闭掉,而RX对应的通道是初始化完成后可以先开启。至于为什么,容我先卖个关子,在下面我会详细解释。
/* USARTx Receiving Mode */
#define USARTx_RX_BY_IDLE_DMA	1		//1:使用接收空闲中断+DMA   0:仅使用接收中断

/* USARTx ADrawbuffer definition */
#define USART2_TX_SIZE	20
#define USART2_RX_SIZE	20

uint8_t USART2TX_Buffer[USART2_TX_SIZE] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18};
uint8_t USART2RX_Buffer[USART2_RX_SIZE] = {0};

void DMA_Init(void)
{
	dma_parameter_struct dma_init_Usart2_TX = {0};
	dma_parameter_struct dma_init_Usart2_RX = {0};

	/* deinitialize DMA channel */
	dma_deinit(DMA0, DMA_CH1);									//USART2_TX
	dma_deinit(DMA0, DMA_CH2);									//USART2_RX

	/* initialize DMA0 channel1(Usart2_TX) */					
	dma_init_Usart2_TX.direction = DMA_MEMORY_TO_PERIPHERAL;
	dma_init_Usart2_TX.memory_addr = (uint32_t)USART2TX_Buffer;
	dma_init_Usart2_TX.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
	dma_init_Usart2_TX.memory_width = DMA_MEMORY_WIDTH_8BIT;
	dma_init_Usart2_TX.number = (uint32_t)USART2_TX_SIZE;
	dma_init_Usart2_TX.periph_addr = (uint32_t)(&USART_DATA(USART2));
	dma_init_Usart2_TX.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
	dma_init_Usart2_TX.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
	dma_init_Usart2_TX.priority = DMA_PRIORITY_LOW;
	dma_init(DMA0, DMA_CH1, &dma_init_Usart2_TX);
	dma_circulation_disable(DMA0, DMA_CH1);
	
	/* initialize DMA0 channel2(Usart2_RX) */					
	dma_init_Usart2_RX.direction = DMA_PERIPHERAL_TO_MEMORY;
	dma_init_Usart2_RX.memory_addr = (uint32_t)USART2RX_Buffer;
	dma_init_Usart2_RX.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
	dma_init_Usart2_RX.memory_width = DMA_MEMORY_WIDTH_8BIT;
	dma_init_Usart2_RX.number = (uint32_t)USART2_RX_SIZE;
	dma_init_Usart2_RX.periph_addr = (uint32_t)(&USART_DATA(USART2));
	dma_init_Usart2_RX.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
	dma_init_Usart2_RX.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
	dma_init_Usart2_RX.priority = DMA_PRIORITY_LOW;
	dma_init(DMA0, DMA_CH2, &dma_init_Usart2_RX);	
	dma_circulation_disable(DMA0, DMA_CH2);						

	dma_memory_to_memory_disable(DMA0,DMA_CH1);				//USART2_TX
	dma_memory_to_memory_disable(DMA0,DMA_CH2);				//USART2_RX

	/* enable all DMA channels you need */
	dma_channel_disable(DMA0,DMA_CH1);						//USART2_TX
	dma_channel_enable(DMA0,DMA_CH2);						//USART2_RX
}

4、配置USART2

  • 波特率38400,数据位8位,停止位1位,无校验位,不使用硬件流控制,接收/发送使能,发送DMA使能。接收DMA是否使能由USARTx_RX_BY_IDLE_DMA这个宏决定。
void USARTx_Init(void)
{	
	/* USART2 configure */
	usart_deinit(USART2);
	usart_baudrate_set(USART2, 38400U);
	usart_word_length_set(USART2, USART_WL_8BIT);
	usart_stop_bit_set(USART2, USART_STB_1BIT);
	usart_parity_config(USART2, USART_PM_NONE);
	usart_hardware_flow_rts_config(USART2, USART_RTS_DISABLE);
	usart_hardware_flow_cts_config(USART2, USART_CTS_DISABLE);
	usart_receive_config(USART2, USART_RECEIVE_ENABLE);
	usart_transmit_config(USART2, USART_TRANSMIT_ENABLE);
	usart_enable(USART2);
	
	/* config USARTx_TX transmit by DMA */
	usart_dma_transmit_config(USART2,USART_DENT_ENABLE);

#if USARTx_RX_BY_IDLE_DMA
	usart_dma_receive_config(USART2,USART_DENR_ENABLE);	
#endif
}

5、配置中断优先级组与USART2中断

请添加图片描述

请添加图片描述

请添加图片描述

  • 仔细阅读F303应用手册中关于USART的中断描述,我们可以理解RBNE代表每从RX脚上接收到一帧的数据,就置1,我们能从USART接收寄存器读取该数据。IDLEF代表当RX接收完多帧数据后,检测到线上空闲就置1,而USART接收寄存器每次只能接收单个帧数据,意味着多帧数据里除了最后一帧数据,前面的都被覆盖(忽略)掉了,所以必须配合DMA的数据传输功能才能保证多帧数据的接收完整。我想看到这里,大家也应该理解我这里为什么用USARTx_RX_BY_IDLE_DMA这个宏作区分了吧。
  • 设置整个系统中断优先级组。这里根据USARTx_RX_BY_IDLE_DMA这个宏决定仅开接收中断还是仅开接收空闲中断。
void NVIC_Init(void)
{
	/* USART2 IRQ set */
	nvic_irq_enable(USART2_IRQn, 2, 0);
#if USARTx_RX_BY_IDLE_DMA	
	usart_interrupt_enable(USART2, USART_INT_IDLE);
#else		
	usart_interrupt_enable(USART2, USART_INT_RBNE);			
#endif
}
  • 编写中断服务函数。
  • 如果USARTx_RX_BY_IDLE_DMA这个宏为,即选择使用接收空闲中断+DMA的方式接收数据。我们通过读相应的数据寄存器去清这个标志位(手册描述的清位方式),再重新置为对应的DMA接收通道。程序运行到此处时,DMA通道已经获取了一个或多个字节的数据(看你发了多少字节的数据),关闭再开启则是让DMA的内存buffer再次从头开始(比如我们定义的USART1RX_Buffer数组是USART1_RX的内存buff,在接受了3个字节的数据后,从USART1RX_Buffer[0]移到了USART1RX_Buffer[3],复位DMA后又将从USART1RX_Buffer[0]开始)。这样只要保证最大字节数不被覆盖,在有标志位置1后及时处理,就能完美接收不定长的数据,且程序被中断的次数最少。
  • 如果USARTx_RX_BY_IDLE_DMA这个宏为,即选择仅使用接收中断。那么每接收到一个字节的数据就会产生一次中断,再将每个字节的内容从设备数据寄存器搬运到我们自己定义的内存变量里。
void USART2_IRQHandler(void)
{
#if USARTx_RX_BY_IDLE_DMA	
	if(RESET != usart_interrupt_flag_get(USART2, USART_INT_FLAG_IDLE))
	{
		Module.USART2_RX_OK=1;		
		/* clear USART_INT_FLAG_IDLE */
		usart_data_receive(USART2);
		/* disable USART2_RX DMA_Channel */
		dma_channel_disable(DMA0, DMA_CH2);    
		/* reset DMA_Channel CNT */
		dma_transfer_number_config(DMA0, DMA_CH2, USART2_RX_SIZE);
		/* enable USART2_RX DMA_Channel */
		dma_channel_enable(DMA0, DMA_CH2);
	}
#else	
	if(RESET != usart_interrupt_flag_get(USART2, USART_INT_FLAG_RBNE))
	{
		usart_interrupt_flag_clear(USART2,USART_INT_FLAG_RBNE);
		Module.USART2_RX_OK=1;
		USART2RX_Buffer[0] = usart_data_receive(USART2);
	}
#endif	
}

6、配置发送DMA
请添加图片描述

  • 如果理解了上述手册中对DMA的描述,这里也应该明白了,为什么TX对应初始化完的DMA通道初始化完后不能直接使能,而RX对应的DMA通道初始化完后能直接使能。还是为了保证初始化完后避免误发数据
  • 根据上述对DMA的描述,我们对USART发送DMA的底层函数编写如下:
void Usartx_Transmit_DMA(uint32_t usart_periph,uint8_t* data_buffer,uint8_t length)
{
	if(usart_periph==USART2)
	{
		/* Channel disable */
		dma_channel_disable(DMA0, DMA_CH1);
		
		dma_memory_address_config(DMA0, DMA_CH1,(uint32_t)data_buffer);
		dma_transfer_number_config(DMA0,DMA_CH1,length);
		
		/* enable DMA channel to start send */
		dma_channel_enable(DMA0, DMA_CH1);	
	}
}

7、主函数部分

  • 主函数程序逻辑如下:
int main(void)
{	
	SystemTick_Init();
	
	SystemClock_Reconfig();
	
	GPIO_Init();
	DMA_Init();
	USARTx_Init();
	NVIC_Init();
	while(1)
	{
//		Usartx_Transmit_DMA(USART2,USART2TX_Buffer,USART2_RX_SIZE);
		Usartx_Transmit_DMA(USART2,(uint8*)"hello,MCU World!",20);
		delay_ms(1000);
	}
}
  • 使用Usartx_Transmit_DMA(USART2,USART2TX_Buffer,USART2_RX_SIZE);
    请添加图片描述
  • 使用Usartx_Transmit_DMA(USART2,(uint8*)“hello,MCU World!”,20);
    请添加图片描述
  • 修改while(1)里的内容。
while(1)
{
	if(Module.USART2_RX_OK)
	{
		Module.USART2_RX_OK = 0;
		
		Usartx_Transmit_DMA(USART2,USART2RX_Buffer,USART2_RX_SIZE);
	}
}
  • 显示效果如下:
    请添加图片描述8、总结
    至此,GD32F303与GD32F103关于USART的调试小记已全部完成。不止是GD的,任何与之类似的USART模块都可以以此流程去配置操作。

!!!本文为欢喜6666在CSDN原创发布,复制或转载请注明出处 :)!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA) 的相关文章

  • 【避坑指南】GD32 KEIL中SW Device没有识别芯片,jlink下载不进去的问题

    项目场景 xff1a 某次正常使用Jlink下载完代码后 xff0c 发现Jlink链接不上了 下载报错 SW Device没有识别芯片 xff0c 换一个单片机就可以识别下载 问题描述 在网上搜了好多帖子 xff0c 有的说是芯片低功耗模
  • GD32串口读取GPS模块数据并解析经纬度教程-附完整代码和资料文件

    前言 xff1a 最近入手了个GPS模块 xff0c 手上只有GD32的开发板 网上有很多使用STM32库函数的GPS驱动程序 xff0c 但是基于GD32库函数读取GPS驱动的教程居然一篇都没有 所以为了学习GD32库的同学 xff0c
  • 关于GD32的CMakeLists以及gcc部分编译选项的解释

    set CMAKE SYSTEM NAME Generic cmake最低版本 cmake minimum required VERSION 3 0 0 工程名称 语言 project TEST PRJ NAME LANGUAGES C C
  • GD32 低功耗模式-深度睡眠模式(包含1,2)电流达不到规格书的要求

    深度睡眠模式 深度睡眠模式1 深度睡眠模式2在测试时电流比数据手册中大得多 1 测试GD32E503RE芯片时 发现各个低功耗模式的电流分别为 run mode 3 0 3 3mA左右 sleep mode 2 4 2 5mA deepsl
  • GD32E230_timer2解析SIF通讯协议

    背景 最近客户在使用GD32E230解析SIF 想让帮忙写一个解析的demo SIF协议简介 懒得写和上传附件 直接截图了 环境搭建 看着这个协议是不是很简单 直接找一个MCU STM32F103ZET6 的PB2模拟一个协议 用GD32E
  • GD32 笔记 05:如何使用 DMA 配合 ADC,以软触发的方式采集电压

    文章目录 一 前言 二 主要代码 1 变量定义 2 初始化配置函数 GPIO ADC DMA 3 主函数 一 前言 测试时使用的 MCU 是 GD32E230 测试例程下载地址是 20210409 test gd32 usart dma z
  • GD32F303X SPI调试遇到的问题总结

    1 下面是一些常规配置 SPI0为例 define SPI0 CS ENABLE GPIO BC GPIOA GPIO PIN 4 LOW define SPI0 CS DISABLE GPIO BOP GPIOA GPIO PIN 4 H
  • GD32F103读写内部FLASH

    GD32F103读写内部FLASH 测试环境 GD32F103C8 20KBytes RAM 64KBytes FLASH 2021年11月24日10 01 49更新 修复擦除FLASH的bug 具体在 应改为 感谢评论区 qq 29872
  • GD32替换STM32移植过程

    目录 1 硬件芯片移植 2 软件配置 2 1 修改外部晶振起振超时时间 2 2 增加DMA 功能 2 3 异常记录 1 硬件芯片移植 下面以 GD32F103RET6 替换 STM32F103RET6为例 硬件上使用对应的GD32芯片替换S
  • STM32移植到GD32(以32的工程为模板简单三步完成移植)

    STM32移植到GD32 一 移植说明 最近有个项目想用GD替代原有的STM32 因为GD的成本更低 然后我就找了一些GD的资料 发现目前网上已有的一些资料都比较老 比如ST移植到GD的攻略 很多都停留在GD刚推广不久的过渡时期 目前已经不
  • GD32+EEPROM(IO)

    一 测试环境 1 芯片 GD32F10x 2 EEPROM BL24CM1A 3 SCL引脚 推完输出 硬件没上拉 4 SDA引脚 浮空输入 硬件没上拉 二 功能 1 使用IO模拟的方式 实现读写EEPROM 三 问题描述 1 很久没有调试
  • GD32E23x的USART被断点打断后重新运行,会一直进入中断的问题

    GD32E23x的USART被断点打断后重新运行 会一直进入中断的问题 GD32E230K8单片机USART0连接一个从机芯片 该芯片每100ms发来一串16Bytes的数据 MCU中断接收 没有开启FIFO 只开启了RBNE 接收缓存非空
  • GD32F190 ADC多通道DMA自动接收踩坑指南

    如果条件允许的话 请不要用GD32F1x0系列 题记 这个系列的芯片官方连个库函数指南都没有你敢信 我都不要求中文版的了 起码英文版的得有吧 以往stm32的ADC工作模式 一般都是配置成多个通道自动连续切换 然后通过DMA把数据读走 这次
  • 关于GD32调试JLINK连接不上的问题

    最近有一个项目要用到GD32E230 然后经过了绘画原理图 PCB布线 焊接元件 再到最后一步的调试 发现用JLINK的SWD模式无论怎么也连不上 在和同事纠结了两天之后 发现了原来是PCB里面IC的封装画错了 以下把GD32和STM32官
  • GD32F103调试小记(一)之ADC+DMA

    前言 由于芯片外部大坏境 结合自身内部原因 这次开始改用国产32位单片机 近些年来 国产32位单片机确实做的还可以 靠谱的多了起来 且有着如ST这种在MCU32位领域里的行业标杆 上手一个新的单片机也变得容易的多 废话不多说 进入今天的正题
  • GD32的项目源码从台式机拷贝到笔记本,烧录后串口数据异常

    目录 1 问题描述 2 故障排查 3 问题分析 4 问题总结 1 问题描述 最近一个项目 需要外场调试 将台式机的源代码拷贝到笔记本中 通过笔记本烧录程序到设备中 发现串口数据异常 重新使用台式机进行烧录 则设备输出正常 2 故障排查 由于
  • GD32F303 Keil 5.33 开发环境搭建流程

    目录 1 资源准备 2 Keil5安装流程 第一步 解压缩包 第二步 安装Keil5 第三步 安装GD32芯片支持包环境 总结 1 资源准备 Keil 5 33安装包 注册机 支持包 固件库 这里作者已经帮大家准备好了 见链接 百度网盘ht
  • GD32F105的CAN通讯,可以发送数据,但接收不到数据

    项目简介 使用的芯片型号GD32F105VC 芯片资源CAN1 波特率500k 调试过程中发现发送数据正常 但是接收不到数据 总结几点注意事项如下 1 需要设置滤波器 若未设置滤波器 则接收不到数据 傻傻的认为滤波器配置问题 以为注释掉滤波
  • GD32F405RGT6定时器固件库(所有定时器的配置(12个))

    GD32F405RGT6所有定时器的配置 GD32F4XXX系列拥有12个定时器 定时器的类型如下表 一般我们可以根据定时器的作用以及类型选取合适的定时器 在这次对GD的单片机而言我就将它所拥有的12个定时器撸了一遍 通用定时器以及高级定时
  • GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

    前言 之前写了GD32F103调试小记 二 之USART 接收中断 接收空闲中断 DMA 发送DMA 一文 这次我们来看看GD32F303的USART是如何配置的 结合这两篇文章 相信大家GD32的USART配置流程会十分熟悉 DMA 能大

随机推荐

  • 最短路径-C++算法

    C 算法之 最短路径 基础2 2020版 前记 通过前面那份讲义 你应该对基础知识有所了解 今天我们来看下floyed算法的实现 复习 什么是最短路径 百度中的定义 用于计算一个节点到其他所有节点的最短路径 主要特点是以起始点为中心向外层层
  • Mixed Reality Toolkit-Unity 开发系列—Input 模块

    在 Mixed Reality Toolkit Unity 开发系列 Sharing 模块 中 我们首次开讲 HoloLens 开发神器 微软原生开发包 Mixed Reality Toolkit Unity 简称 MRTK 并介绍了 Sh
  • 如何拿到半数面试公司Offer——我的Python求职之路

    从八月底开始找工作 短短的一星期多一些 面试了9家公司 拿到5份Offer 可能是因为我所面试的公司都是些创业性的公司吧 不过还是感触良多 因为学习Python的时间还很短 没想到还算比较容易的找到了工作 就把这些天的面试经验和大家分享一下
  • c++ 链表的创建与链表常见操作

    c 链表的创建与链表常见操作 一 链表定义 struct 下面的结构体定义了C 语言中的一种常见的链表节点 包括数据 指针和两种种不同类型的构造函数 struct ListNode int val 存储数据 ListNode next ne
  • java集合框架(一)——框架结构及基础接口

    java util包是一个重要的包 包含许多类和接口 它还包括java的一个功能强大的子系统 集合框架 集合框架是一个复杂接 口和类的层 提供了管理对象组的优化技术 使用集合框架的目的有几个 首先这种框架必须是高性能的 基础集合 动态数组
  • Java String6,7,8,9区别 以及 有哪些方式可以提高性能

    String 对象在jdk不同版本中的实现 String对象是 Java 中使用最频繁的对象之一 所以 Java 公司也在不断的对String对象的实现进行优化 以便提升String对象的性能 看下面这张图 一起了解一下String对象的优
  • 每日一个Python基础练习题

    题目 有四个数字 1 2 3 4 能组成多少个互不相同且无重复数字的三位数 各是多少 可填在百位 十位 个位的数字都是1 2 3 4 组成所有的排列后再去 掉不满足条件的排列 代码 a 100 b 10 c r 1 for a in ran
  • 朗润国际期货技术分析——日内交易图表类型

    一张图表胜过千言万语 你以前听说过这句话 对吗 在日内交易员的世界里 一张图表往往比千言万语更有价值 它不仅告诉我们过去发生了什么 而且告诉我们一个市场在未来可能会做什么 它将继续走高还是走低 它是否处于一个区间 也许一个重大的方向变化或反
  • 2D/3D人体姿态估计 (2D/3D Human Pose Estimation)

    1 基本概念 算法改进入口 网络设计 特征流 损失函数 数据集的重要性 只要有一个好的 针对性的数据集 问题都可以解决 过集成新一代AutoML技术 可降低算法试错成本 人体姿态估计 Human Pose Estimation 是指图像或视
  • 在C语言中,“>>=”;“<<=”;“&=”;“

    C语言中 gt gt 的意思是 右移后赋值 示例 x 8 1000 x gt gt 3 结果为 0001 C语言中 lt lt 的意思是 左移后赋值 示例 x 1 0001 x lt lt 3 结果为 1000 C语言中 的意思是 按位与后
  • pycharm 代码上传到gitee仓库里

    目录 一 准备 二 1 新建仓库 2 commit和push 一 准备 1 在pycharm中安装插件 github git 2 在本地安装git 二 1 新建仓库 首先在pycharm中打开自己的本地项目 如果没有配置过 主界面应该是这样
  • 2023年数学建模B组:利用AHP层次分析法解决实际问题(Matlab)

    目录 利用AHP层次分析法解决实际问题 Matlab实现 介绍 案例背景 步骤1 建立层次结构模型
  • Flutter酷炫的路由动画效果

    现在Flutter的路由效果已经非常不错了 能满足大部分App的需求 但是谁不希望自己的App更酷更炫那 下面介绍几个酷炫的路由动画 其实路由动画的原理很简单 就是重写并继承PageRouterBuilder这个类里的transitions
  • 详解JS前端异步文件加载篇之Async与Defer区别

    目录 同步 异步及推迟的概念 async和defer解决文件加载阻塞问题 在了解async和defer的区别之前 我们需要先了解同步 异步和推迟的概念 同步 异步及推迟的概念 假如现在有一条非常狭隘的胡同 里面有两个人挨着走 那么现在请问后
  • Java集合的两种遍历方式

    Java集合共有两种遍历方式 增强for循环 foreach 迭代器 Main方法 public static void main String args 创建集合 Collection collection new ArrayList 添
  • XXL-JOB分布式任务调度平台配置详解

    XXL JOB是一个分布式任务调度平台 其核心设计目标是开发迅速 学习简单 轻量级 易扩展 个人建议 对于需要定时调度任务开箱即用的小伙伴来说 完全可以学习参考下 本文主要介绍了Xxl Job分布式任务调度框架的配置信息详解 以及路由策略
  • git clone下新项目后运行报错‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

    报错 vue cli service 不是内部或外部命令 也不是可运行的程序 或批处理文件 因为项目里还没有node modules这个包 需要运行npm install 运行后没有报错但是有个警告 npm WARN read shrink
  • MySQL导入导出数据mysqldump,mysql,select into file,load data

    研发人员往往需要从数据库中导出数据 或者将数据导入到数据库中 一些客户端工具提供了简单方便的功能 可以让他们不用使用命令进行操作 但是客户端工具可能会受到环境的限制而不能使用 所以 研发人员有必要掌握一些常用的命令来进行操作数据 MySQL
  • 残差神经网络的研究

    目录 一 ResNet残差神经网络 1 1 提出 1 2 作用 1 3 应用场景 1 4 残差单元的结构 1 4 1 残差网络得名的原因 1 4 2 残差网络可以有效缓解退化现象的原因 1 4 3 数学原理 二 附录 2 1 残差神经网络可
  • GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

    前言 之前写了GD32F103调试小记 二 之USART 接收中断 接收空闲中断 DMA 发送DMA 一文 这次我们来看看GD32F303的USART是如何配置的 结合这两篇文章 相信大家GD32的USART配置流程会十分熟悉 DMA 能大