GD32的GD库开发

news2025/2/28 9:44:06

所有的Cortex-M处理器都有相同的SysTick定时器,因为CMSIS-Core头文件中定义了一个名为SysTick的结构体。

这个定时器可以用作延时函数,不管是STM32的芯片还是GD32,AT32的芯片,delay函数都可以这么写,只要它是cortex-M3/M4的芯片。

以下代码基于GD32F303,主频120M。

延迟函数

示例代码

代码移植于江科大。

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
    //这里假设主频为72M,如果主频不是72M,自行修改即可
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}
 
/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 


GPIO

参数配置

和STM32的GPIO类似。

库函数调用

时钟使能:rcu_periph_clock_enable()

GPIO参数初始化:gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin)

以初始化PA8,PD2为例

rcu_periph_clock_enable(RCU_GPIOA);  //GPIOA时钟使能
rcu_periph_clock_enable(RCU_GPIOD);  //GPIOD时钟使能
	
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); //设置PA8推挽输出
gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); //设置PD2推挽输出

写引脚电平

gpio_bit_write(GPIOA, GPIO_PIN_8, SET):

读引脚电平

gpio_input_bit_get(GPIOA,GPIO_PIN_13) 

翻转引脚电平

//翻转IO口状态
void gpio_togglepin(uint32_t gpio_periph, uint32_t pin)
{
  uint32_t octl;

  octl = GPIO_OCTL(gpio_periph);

  GPIO_BOP(gpio_periph) = ((octl & pin) << 16u) | (~octl & pin);
}


ADC

参数配置

ADC初始化

//初始化ADC																   
void  Adc_Init(void)
{    
  rcu_periph_clock_enable(RCU_GPIOC);                             //使能GPIOC时钟
  gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4); //AD采集引脚(PC4)模式设置,模拟输入 
	 
	rcu_periph_clock_enable(RCU_ADC0);   //使能ADC0时钟
	 
	adc_deinit(ADC0);   //复位ADC0
	
	//ADC时钟来自APB2,频率为120Mhz
	//使用6分频,得到APB2/6 = 20Mhz的ADC时钟
  rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);   //配置ADC时钟
	
  adc_mode_config(ADC_MODE_FREE);   //ADC独立工作模式              
	
	adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);        //非扫描模式	
  adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE);  //禁止连续模式 
	
	adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);             //数据右对齐
	
	adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);                               //常规序列使能外部触发
  adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE); //常规序列使用软件触发
	
	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);   //规则序列长度,1个转换在规则序列中,也就是只转换规则序列1 

  adc_enable(ADC0);   //使能ADC0

  adc_calibration_enable(ADC0);   //使能ADC0校准复位
	
}

函数调用

获取ADC值

//获得ADC转换后的结果
//ch:通道值 0~17
//返回值:转换结果
uint16_t Get_Adc(uint8_t ch)   
{
	  uint16_t adc_value = 0; 
	
	  adc_regular_channel_config(ADC0, 0, ch, ADC_SAMPLETIME_239POINT5);//配置ADC规则通道组,选择采样时间为239.5周期,提高采样时间可以提高精确度
	
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);   //软件触发使能,常规序列转换开始
	
	  while(SET != adc_flag_get(ADC0,ADC_FLAG_EOC));   //等待转换结束	
	   
	  adc_value = adc_regular_data_read(ADC0);         //读ADC规则组数据寄存器
	
    return  adc_value;   //返回最近一次ADC0的转换结果
}

获取多组ADC平均值

//获取通道ch的转换值,取times次,然后平均 
//ch:通道编号
//times:获取次数
//返回值:通道ch的times次转换结果平均值
uint16_t Get_Adc_Average(uint8_t ch,uint8_t times)
{
	uint32_t temp_val=0;
	uint8_t t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);  //获取times次数据 
		delay_ms(5);
	}
	return temp_val/times;    //返回平均值
} 

自行转换ADC值为电压

adc_val = Get_Adc_Average(ADC_CH14,20);
adc_volt = (float)adc_val/4096.0f * 3.3f;

串口

参数配置

uart.c。

代码分为三部分。

第一部分为os以及printf函数的相关定义。

第二部分为串口的初始化

第三部分为串口的中断处理函数

#include "usart.h"


/* 如果使用os,则包括下面的头文件即可. */
#if SYS_SUPPORT_OS
#include "includes.h" /* os 使用 */
#endif

/******************************************************************************************/
/* 加入以下代码, 支持printf函数, 而不需要选择use MicroLIB */

#if 1

#if (__ARMCC_VERSION >= 6010050)            /* 使用AC6编译器时 */
__asm(".global __use_no_semihosting\n\t");  /* 声明不使用半主机模式 */
__asm(".global __ARM_use_no_argv \n\t");    /* AC6下需要声明main函数为无参数格式,否则部分例程可能出现半主机模式 */

#else
/* 使用AC5编译器时, 要在这里定义__FILE 和 不使用半主机模式 */
#pragma import(__use_no_semihosting)

struct __FILE
{
    int handle;
    /* Whatever you require here. If the only file you are using is */
    /* standard output using printf() for debugging, no file handling */
    /* is required. */
};

#endif

/* 不使用半主机模式,至少需要重定义_ttywrch\_sys_exit\_sys_command_string函数,以同时兼容AC6和AC5模式 */
int _ttywrch(int ch)
{
    ch = ch;
    return ch;
}

/* 定义_sys_exit()以避免使用半主机模式 */
void _sys_exit(int x)
{
    x = x;
}

char *_sys_command_string(char *cmd, int len)
{
    return NULL;
}


/* FILE 在 stdio.h里面定义. */
FILE __stdout;

/* MDK下需要重定义fputc函数, printf函数最终会通过调用fputc输出字符串到串口 */
int fputc(int ch, FILE *f)
{
	while(RESET == usart_flag_get(USART0, USART_FLAG_TC));       /* 等待上一个字符发送完成 */
	
	usart_data_transmit(USART0, (uint8_t)ch);                    /* 将要发送的字符 ch 写入到DR寄存器 */  
  return ch;
}
#endif
/******************************************************************************************/

#if USART_EN_RX /*如果使能了接收*/

/* 接收缓冲, 最大USART_REC_LEN个字节. */
uint8_t USART_RX_BUF[USART_REC_LEN];

/*  接收状态
 *  bit15,      接收完成标志
 *  bit14,      接收到0x0d
 *  bit13~0,    接收到的有效字节数目
*/
uint16_t USART_RX_STA = 0;



//串口0初始化函数
//bound: 波特率, 根据自己需要设置波特率值
void usart_init(uint32_t bound)
{
	//使能GPIO时钟和复用时钟
  rcu_periph_clock_enable(RCU_GPIOA);     //使能GPIOA时钟
  rcu_periph_clock_enable(RCU_AF);        //使能复用时钟
  rcu_periph_clock_enable(RCU_USART0);    //使能串口时钟

  //配置TX的GPIO
  gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);

  //配置RX的GPIO
  gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

  //配置USART的参数
  usart_deinit(USART0);                                 //RCU配置恢复默认值
  usart_baudrate_set(USART0, bound);                    //设置波特率
  usart_stop_bit_set(USART0, USART_STB_1BIT);           //一个停止位
  usart_word_length_set(USART0, USART_WL_8BIT);         //字长为8位数据格式
  usart_parity_config(USART0, USART_PM_NONE);           //无奇偶校验位
  usart_receive_config(USART0, USART_RECEIVE_ENABLE);   //使能接收
  usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); //使能发送
  usart_interrupt_enable(USART0, USART_INT_RBNE);       //使能接收缓冲区非空中断
  //配置NVIC,并设置中断优先级
  nvic_irq_enable(USART0_IRQn, 3, 3);                   //抢占优先级3,子优先级3

  //使能串口
  usart_enable(USART0);	
}

void USART0_IRQHandler(void)
{
	uint8_t Res;
#if SYSTEM_SUPPORT_OS 		                              //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntEnter();    
#endif
		if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾(回车/换行) )
		{
		Res =usart_data_receive(USART0);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //还没收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 
#if SYSTEM_SUPPORT_OS 	//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntExit();  											 
#endif
}
#endif

uart.h

#ifndef __USART_H
#define __USART_H

#include "stdio.h"
#include "sys.h"
//	 
//串口0初始化
// 
//如果想串口中断接收,请不要注释以下宏定义
#define USART_REC_LEN               200         /* 定义最大接收字节数 200 */
#define USART_EN_RX                 1           /* 使能(1)/禁止(0)串口0接收 */

extern uint8_t  USART_RX_BUF[USART_REC_LEN];    /*接收缓冲,最大USART_REC_LEN个字节.末字节为换行符*/ 
extern uint16_t USART_RX_STA;         		      /*接收状态标记*/	

void usart_init(uint32_t bound);                /* 串口初始化函数 */

#endif


库函数调用

串口使用的代码参考

if(USART_RX_STA&0x8000)    //接收完了一次数据
            {					    
                len=USART_RX_STA&0x3fff; //得到此次接收到的数据长度
                printf("\r\n您发送的消息为:\r\n");
                for(t=0;t<len;t++)
                {
                    usart_data_transmit(USART0, USART_RX_BUF[t]);         //发送接收到的数据

                    while(RESET == usart_flag_get(USART0, USART_FLAG_TC));//等待发送结束
                }
                printf("\r\n\r\n");      //插入换行
                USART_RX_STA=0;
            }
            else
            {
                times++;
                if(times%5000==0)
                {
                    printf("\r\nWKS MiniGD32开发板 串口实验\r\n\r\n");
                }
                if(times%200==0)printf("请输入数据,以回车键结束\r\n");  
                if(times%30==0) LED0_TOGGLE();//闪烁LED,提示系统正在运行.
                delay_ms(10);   
            } 


PWM输出

PWM频率计算公式

公式应用:

如果我们要输出1000hz,占空比为50%的方波信号。

假如系统频率为120MHz = 120*10^6Hz。可以这样设置

PSC = 1200 - 1,PSC + 1 = 1200。ARR = 100 - 1。ARR + 1 = 100。

f = fsystem / [ (PSC+1)*(ARR+1) ] = 1000Hz

参数配置

定时器初始化,这里设置上电后默认输出1000Hz,占空比为50%。

/**
 * @brief 初始化TIMER0为PWM模式
 *
 * 该函数用于初始化TIMER0定时器为PWM模式,设置相关的时钟、GPIO和定时器参数,
 * 以生成PWM信号。PWM信号的频率和占空比可以通过参数arr和psc进行调整。
 *
 * @param arr 自动重装载值,决定了PWM信号的周期
 * @param psc 预分频值,决定了定时器的时钟频率
 */
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
void TIM0_PWM_Init(uint16_t arr,uint16_t psc)
{
	//定义初始化结构体变量
  timer_oc_parameter_struct timer_ocinitpara;
  timer_parameter_struct timer_initpara;

  rcu_periph_clock_enable(RCU_GPIOA);    //使能GPIOA时钟
  rcu_periph_clock_enable(RCU_TIMER0);   //使能TIMER0时钟
  rcu_periph_clock_enable(RCU_AF);       //使能AF时钟
	
  gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);  //设置PA8复用推挽输出

  timer_deinit(TIMER0);                                  //复位TIMER0

  timer_initpara.prescaler         = psc;                //设置预分频值
  timer_initpara.alignedmode       = TIMER_COUNTER_EDGE; //设置对齐模式
  timer_initpara.counterdirection  = TIMER_COUNTER_UP;   //设置向上计数模式
  timer_initpara.period            = arr;                //设置自动重装载值。/* ARR-1即为周期 */
  timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;   //设置时钟分频因子
  timer_initpara.repetitioncounter = 0;                  //设置重复计数值
  timer_init(TIMER0, &timer_initpara);                   //根据参数初始化定时器

  timer_ocinitpara.outputstate  = TIMER_CCX_ENABLE;                    //使能通道输出
  timer_ocinitpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;               //设置通道输出极性为高
  timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara);  //定时器通道输出配置 

  timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, arr/2);               //设置占空比,这里默认设置比较值为自动重装载值的一半,即占空比为50%
  timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);         //设置通道比较模式为PWM模式0 
  
  timer_primary_output_config (TIMER0, ENABLE);                                     //TIMER0所有的通道输出使能
  timer_enable(TIMER0);                                                             //使能定时器TIMER0
}

//设置TIMER0通道0的占空比
//compare:比较值 CCR
void TIM_SetTIM0Compare1(uint32_t compare)
{
    /* compare的取值范围:0-ARR。占空比 = CCR/(ARR+1) */
  timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, compare);
}

库函数调用

初始化,并填入ARR和PSC参数。

TIM0_PWM_Init(100-1,1200-1);               //默认设置1000HZ,占空比为50%


PWM捕获

参数配置

库函数调用


定时器

参数配置

定时器初始化配置

//通用定时器2中断初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//APB1时钟为60MHz,TIMER2时钟选择为APB1的2倍,因此,TIMER2时钟为120MHz
void TIM2_Int_Init(uint16_t arr,uint16_t psc)
{
	timer_parameter_struct timer_initpara;               //timer_initpara用于存放定时器的参数

  //使能RCU相关时钟 
  rcu_periph_clock_enable(RCU_TIMER2);                 //使能TIMER2的时钟

  //复位TIMER2
  timer_deinit(TIMER2);                                //复位TIMER2
  timer_struct_para_init(&timer_initpara);             //初始化timer_initpara为默认值

  //配置TIMER2
  timer_initpara.prescaler         = psc;              //设置预分频值
  timer_initpara.counterdirection  = TIMER_COUNTER_UP; //设置向上计数模式
  timer_initpara.period            = arr;              //设置自动重装载值
  timer_initpara.clockdivision     = TIMER_CKDIV_DIV1; //设置时钟分频因子
  timer_init(TIMER2, &timer_initpara);                 //根据参数初始化定时器

  //使能定时器及其中断
  timer_interrupt_enable(TIMER2, TIMER_INT_UP);        //使能定时器的更新中断
  nvic_irq_enable(TIMER2_IRQn, 1, 3);                  //配置NVIC设置优先级,抢占优先级1,响应优先级3
  timer_enable(TIMER2);                                //使能定时器TIMER2
}

函数调用

//定时器2中断服务程序
void TIMER2_IRQHandler(void)
{
  if(timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP) == SET)   //判断定时器更新中断是否发生
  {
    
    /*--功能代码--*/

    LED1_TOGGLE(); 
                                                //LED1翻转
    /*-----------*/
    timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);         //清除定时器更新中断标志
  }
}

IIC

参数配置

库函数调用、


SPI

参数配置

库函数调用


Flas读写

函数调用

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

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

相关文章

LabVIEW项目中的工控机与普通电脑选择

工控机&#xff08;Industrial PC&#xff09;与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异&#xff0c;并为LabVIEW项目中的选择提供指导。 ​ 硬件设…

python如何导出数据到excel文件

python导出数据到excel文件的方法&#xff1a; 1、调用Workbook()对象中的add_sheet()方法 wb xlwt.Workbook() ws wb.add_sheet(A Test Sheet) 2、通过add_sheet()方法中的write()函数将数据写入到excel中&#xff0c;然后使用save()函数保存excel文件 ws.write(0, 0, 1234…

Yocto项目 - 解读CROss PlatformS (CROPS)

一、概述 Yocto项目是一个用于创建自定义Linux发布版本的工具集成项目&#xff0c;在应对复杂应用场景时能提供高度可自定义性。但是在多端机应用中&#xff0c;如何在不同的平台上可靠地完成构建工作&#xff1f;CROss PlatformS (CROPS)即展示了其重要作用。 CROPS是Yocto项…

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构

单体仓库&#xff08;Monorepo&#xff09;搭建指南&#xff1a;从零开始 单体仓库&#xff08;Monorepo&#xff09;是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置&#xff0c;并简化依赖管理。本文将通过实际代码示例&#xff0…

Ubuntu24.04初始化MySQL报错 error while loading shared libraries libaio.so.1

Ubuntu24.04初始化MySQL报错 error while loading shared libraries: libaio.so.1 问题一&#xff1a;libaio1不存在 # 提示libaio1不存在 [rootzabbix-mysql-master.example.com x86_64-linux-gnu]#apt install numactl libaio1 Reading package lists... Done Building depe…

数据标注开源框架 Label Studio

数据标注开源框架 Label Studio Label Studio 是一个开源的、灵活的数据标注平台&#xff0c;旨在帮助开发者和数据科学家轻松创建高质量的训练数据集。它支持多种类型的数据&#xff08;如文本、图像、音频、视频等&#xff09;以及复杂的标注任务&#xff08;如分类、命名实体…

OS Copilot功能测评:智能助手的炫彩魔法

简介&#xff1a; OS Copilot 是一款融合了人工智能技术的智能助手&#xff0c;专为Linux系统设计&#xff0c;旨在提升系统管理和运维效率。本文详细介绍了在阿里云ECS实例上安装和体验OS Copilot的过程&#xff0c;重点评测了其三个核心参数&#xff1a;-t&#xff08;模式…

【豆包MarsCode 蛇年编程大作战】蛇形烟花

项目体验地址&#xff1a;项目体验地址 官方活动地址&#xff1a;活动地址 目录 【豆包MarsCode 蛇年编程大作战】蛇形烟花演示 引言 豆包 MarsCode介绍 项目准备 第一步&#xff1a;安装插件 第二步&#xff1a;点击豆包图标来进行使用豆包 使用豆包 MarsCodeAI助手实…

2013年蓝桥杯第四届CC++大学B组真题及代码

目录 1A&#xff1a;高斯日记&#xff08;日期计算&#xff09; 2B&#xff1a;马虎的算式&#xff08;暴力模拟&#xff09; 3C&#xff1a;第39级台阶&#xff08;dfs或dp&#xff09; 4D&#xff1a;黄金连分数&#xff08;递推大数运算&#xff09; 5E&#xff1a;前缀…

14.杂谈:领域知识库与知识图谱:概念、关系与重要性

文章目录 1. 领域知识库的概念2. 知识图谱的概念3. 领域知识库与知识图谱的关系与差异3.1 关系3.2 差异 4. 为什么要构建领域知识库&#xff1f;4.1 知识的集中管理与共享4.2 知识的标准化与规范化4.3 促进知识创新与应用 5. 为什么要进行知识融合&#xff1f;5.1 异构数据的整…

【GoLang】利用validator包实现服务端参数校验时自定义错误信息

在C/S架构下&#xff0c;服务端在校验请求参数时&#xff0c;若出现参数错误&#xff0c;要响应给客户端一个错误消息&#xff0c;通常我们会统一响应“参数错误”。 但是&#xff0c;如果只是一味的提示参数错误&#xff0c;我并不知道具体是哪个参数错了呀&#xff01;能不能…

c#实现重启Explorer.exe并且启动某个命令

由于经常需要重启Explorer.exe 然后接着又需要马上启动一个命令行&#xff0c;于是干脆写一个程序&#xff0c;实现了此功能。 可以直接在运行中&#xff0c;或者在资源管理器中新建任务。 注意&#xff0c;下方的设置为应用程序&#xff0c;可以避免启动时出现黑框。 直接上代…

C语言自定义数据类型详解(一)——结构体类型(上)

什么是自定义数据类型呢&#xff1f;顾名思义&#xff0c;就是我们用户自己定义和设置的类型。 在C语言中&#xff0c;我们的自定义数据类型一共有三种&#xff0c;它们分别是&#xff1a;结构体(struct)&#xff0c;枚举(enum)&#xff0c;联合(union)。接下来&#xff0c;我…

绘制决策树尝试2 内含添加环境变量步骤

目录 step1 ai码 ai改 step2 下面就是环境配置问题 “ExecutableNotFound: failed to execute WindowsPath(‘dot’), make sure the Graphviz executables are on your systems’ PATH” dot -v愣是没有​编辑 graphviz安装指导 对于Windows用户&#xff1a; 对于Lin…

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;而OpenAI尚未承认这一漏洞。 本月&#xff0c;德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章&#xff0c;解释了如何通过向ChatGPT API发送单个HTTP请求…

【优选算法】10----无重复字符的最长子串

---------------------------------------begin--------------------------------------- 题目解析&#xff1a; 看到这一类题目&#xff0c;有没有那种一眼就感觉时要用到滑动窗口的感觉&#xff0c;铁子们&#xff1f; 讲解算法原理&#xff1a; 方法一: 暴力解法&#xff…

【模型】RNN模型详解

1. 模型架构 RNN&#xff08;Recurrent Neural Network&#xff09;是一种具有循环结构的神经网络&#xff0c;它能够处理序列数据。与传统的前馈神经网络不同&#xff0c;RNN通过将当前时刻的输出与前一时刻的状态&#xff08;或隐藏层&#xff09;作为输入传递到下一个时刻&…

开源鸿蒙开发者社区记录

lava鸿蒙社区可提问 Laval社区 开源鸿蒙项目 OpenHarmony 开源鸿蒙开发者论坛 OpenHarmony 开源鸿蒙开发者论坛

C语言中的|=代表啥意思?

在C语言中&#xff0c;| 是复合赋值运算符中的按位或赋值运算符。 其作用是将两个操作数按二进制位进行“或”运算&#xff0c;并将结果赋值给左操作数。例如&#xff0c;若有 x | y;&#xff0c;则等同于 x x | y;。其中&#xff0c;| 是按位或运算符&#xff0c;对两个操作数…

日志收集Day005

1.filebeat的input类型之filestream实战案例: 在7.16版本中已经弃用log类型,之后需要使用filebeat,与log不同&#xff0c;filebeat的message无需设置就是顶级字段 1.1简单使用&#xff1a; filebeat.inputs: - type: filestreamenabled: truepaths:- /tmp/myfilestream01.lo…