GD 32 IIC 驱动代码

news2024/11/13 12:42:26

前言:


 学会IIC驱动的原理,时序和代码实现


1.0 GPIO初始化

从原理图中可以看出IIC对应的时钟线和数据线在PB端口,因此需要初始化GPIOB的时钟,同时初始化GPIOB_PIN_6 | 7,的引脚,设置为开漏输出模式。

什么事开漏?为什么使用开漏?


GPIO_MODE_OUT_OD 是一个配置选项,用于设置微控制器 GPIO(General Purpose Input/Output)引脚的工作模式。在 GD32 系列微控制器中,这代表“开漏输出”(Open Drain Output)模式。

在开漏输出模式下,GPIO 引脚可以被驱动到低电平(接地),或者高阻态(不连接)。当引脚设置为高阻态时,它既不拉高也不拉低,因此外部电路可以将其电平拉高或保持不变。这种模式常用于需要多个设备共享同一信号线的场合,例如 I2C 总线,或是当输出级需要与不同电压级别的逻辑电平兼容时。

在开漏输出模式下,如果需要稳定的高电平输出,通常会在引脚外部接一个上拉电阻至电源。这样,在 GPIO 设置为高阻态时,上拉电阻会将引脚电平拉高;而在 GPIO 设置为低电平时,引脚则会被拉低至地电平。


 GPIO初始化代码:

// GPIO初始化
static void GpioInit()
{
	// rcu 初始化Gpio时钟
	rcu_periph_clock_enable(RCU_GPIOB);
	// gpio 初始化
	gpio_init
	(
		GPIOB,
		GPIO_MODE_OUT_OD,
		GPIO_OSPEED_10MHZ,
		GPIO_PIN_6 | GPIO_PIN_7
	);
	
}


// 初始化GPIO
void EepromDrvInit(void)
{
	// GPIO初始化函数
	GpioInit();
}

 2.0 宏定义引脚

宏定义的作用是简化程序,防止程序出现魔鬼数字,本质是温文本展开,注意优先级问题

// 宏定义SCL 与 SDA
#define GET_I2C_SDA() gpio_input_bit_get(GPIOB,GPIO_PIN_7) 		// 读取SDA端口
#define SET_I2C_SCL() gpio_bit_set(GPIOB, GPIO_PIN_6)           // 时钟线SCL输出高电平
#define CLR_I2C_SCL() gpio_bit_reset(GPIOB, GPIO_PIN_6)         // 时钟线SCL输出低电平
#define SET_I2C_SDA() gpio_bit_set(GPIOB, GPIO_PIN_7)           // 数据线SDA输出高电平
#define CLR_I2C_SDA() gpio_bit_reset(GPIOB, GPIO_PIN_7)         // 数据线SDA输出低电平

3.0 IIC 起始信号

起始信号:

/**
*******************************************************************
* @function 产生IIC起始时序,准备发送或接收数据前必须由起始序列开始 
* @param
* @return 
* @brief    SCL为高电平时,SDA由高电平向低电平跳变,开始传输数据 
*           生成下图所示的波形图,即为起始时序 
*                1 2    3     4   
*                    __________     
*           SCL : __/          \_____ 
*                 ________          
*           SDA :         \___________ 
*******************************************************************
*/
static void I2CStart(void)
{
	SET_I2C_SDA();          // 1#数据线SDA输出高电平
	SET_I2C_SCL();          // 2#时钟线SCL输出高电平   
	DelayNus(4);            // 延时4us
	CLR_I2C_SDA();          // 3#数据线SDA输出低电平 
	DelayNus(4);            // 延时4us
	CLR_I2C_SCL();          // 4#时钟线SCL输出低电平,保持I2C的时钟线SCL为低电平,准备发送或接收数据 
	DelayNus(4);            // 延时4us
}

4.0 IIC 停止信号

停止信号:

/**
*******************************************************************
* @function 产生IIC停止时序  
* @param
* @return 
* @brief    SCL为高电平时,SDA由低电平向高电平跳变,结束传输数据 
*          生成下图所示的波形图,即为停止时序 
*                1 2   3  4   
*                       _______________     
*          SCL : ______/          
*                __        ____________  
*          SDA:    \______/
*******************************************************************
*/
static void I2CStop(void)
{
	CLR_I2C_SDA();          //2#数据线SDA输出低电平
	DelayNus(4);            //延时4us
	SET_I2C_SCL();          //3#时钟线SCL输出高电平
	DelayNus(4);  
	SET_I2C_SDA();          //4#数据线SDA输出高电平,发送I2C总线结束信号
}

5.0 IIC 发送一个字节

发送字节是从高位开始发送的,一步一步的将数据移动出去,需要使用for循环,并且将数据按位左移。

 

发送字节:

/**
*******************************************************************
* @function 发送一字节,数据从高位开始发送出去
* @param    byte
* @return 
* @brief    下面是具体的时序图 
*                1 2     3      4
*                         ______
*           SCL: ________/      \______    
*                ______________________    
*           SDA: \\\___________________
*******************************************************************
*/
static void I2CSendByte(uint8_t byte)
{                          
	for (uint8_t i = 0; i < 8; i++)   // 循环8次,从高到低取出字节的8个位
	{     
		if ((byte & 0x80))            // 2#取出字节最高位,并判断为‘0’还是‘1’,从而做出相应的操作
		{
			SET_I2C_SDA();            // 数据线SDA输出高电平,数据位为‘1’
		}
		else
		{  
			CLR_I2C_SDA();      	  // 数据线SDA输出低电平,数据位为‘0’
		}
		
		byte <<= 1;            		  // 左移一位,次高位移到最高位
		
		DelayNus(4);          		  // 延时4us
		SET_I2C_SCL();                // 3#时钟线SCL输出高电平
		DelayNus(4);          		  // 延时4us
		CLR_I2C_SCL();        		  // 4#时钟线SCL输出低电平
		DelayNus(4);                  // 延时4us  
	}  
}

6.0 IIC 接收一个字节

接收字节:

在这段I²C读取字节的代码中,byte++ 的作用是在检测到 SDA(Serial Data)线上的数据位为1时,将当前正在构建的字节值的最低位设为1。

具体来说,byte <<= 1; 这一行将 byte 的所有位都向左移动一位,腾出了最低位(最右边的位)。接下来,根据 SDA 线上的数据状态,byte 的最低位会被更新。如果 GET_I2C_SDA() 返回非零值(即SDA线上的数据位为1),那么 byte++ 将会使 byte 的值增加1,从而将最低位设为1。否则,如果 GET_I2C_SDA() 返回0(即SDA线上的数据位为0),byte 的值保持不变,最低位仍然为0。

/**
*******************************************************************
* @function 读取一字节数据
* @param    
* @return   读取的字节
* @brief    下面是具体的时序图
*                       ______
*           SCL: ______/      \___        
*                ____________________    
*           SDA: \\\\______________\\\
*******************************************************************
*/
static uint8_t I2CReadByte(void)
{
	uint8_t byte = 0;           		// byte用来存放接收的数据
	SET_I2C_SDA();                      // 释放SDA
	for (uint8_t i = 0; i < 8; i++)     // 循环8次,从高到低读取字节的8个位
	{
		SET_I2C_SCL();          		// 时钟线SCL输出高电平
		DelayNus(4);            		// 延时4us
		byte <<= 1;          			// 左移一位,空出新的最低位

		if (GET_I2C_SDA())       		// 读取数据线SDA的数据位
		{
			byte++;            			// 在SCL的上升沿后,数据已经稳定,因此可以取该数据,存入最低位
		}
		CLR_I2C_SCL();          		// 时钟线SCL输出低电平
		DelayNus(4);            		// 延时4us
	} 

	return byte;           				// 返回读取到的数据
}

7.0 IIC 接收应答

接收应答:

/**
*******************************************************************
* @function 等待接收端的应答信号
* @param    
* @return   1,接收应答失败;0,接收应答成功
* @brief    当SDA拉低后,表示接收到ACK信号,然后,拉低SCL,
*           此处表示发送端收到接收端的ACK
*                _______|____     
*           SCL:        |    \_________    
*                _______|     
*           SDA:         \_____________ 
*******************************************************************
*/
static bool I2CWaitAck(void)
{
	uint8_t errTimes = 0;
	
	SET_I2C_SDA();             // 释放SDA总线,很重要
	DelayNus(4);               // 延时4us
	
	SET_I2C_SCL();             // 时钟线SCL输出高电平
	DelayNus(4);               // 延时4us

	while (GET_I2C_SDA())      // 读回来的数据如果是高电平,即接收端没有应答
	{
		errTimes++;            // 计数器加1

		if (errTimes > 250)    // 如果超过250次,则判断为接收端出现故障,因此发送结束信号
		{
			I2CStop();         // 产生一个停止信号
			return false;      // 返回值为1,表示没有收到应答信号
		}
	}

	CLR_I2C_SCL();             // 表示已收到应答信号,时钟线SCL输出低电平
	DelayNus(4);               // 延时4us
	
	return true;               // 返回值为0,表示接收应答成功  
}

8.0 IIC 发送应答

发送应答:

/**
*******************************************************************
* @function 发送应答信号
* @param    
* @return   
* @brief    下面是具体的时序图 
*                 1 2     3      4      5     
*                         ______
*           SCL: ________/      \____________    
*                __                     ______
*           SDA:   \___________________/        
*******************************************************************
*/
void I2CSendAck(void)
{
	CLR_I2C_SDA();          // 2#数据线SDA输出低电平
	DelayNus(4);            // 延时4us
	SET_I2C_SCL();          // 3#时钟线SCL输出高电平,在SCL上升沿前就要把SDA拉低,为应答信号
	DelayNus(4);            // 延时4us
	CLR_I2C_SCL();          // 4#时钟线SCL输出低电平
	DelayNus(4);            // 延时4us
	SET_I2C_SDA();          // 5#数据线SDA输出高电平,释放SDA总线,很重要
}

9.0 IIC 发送非应答

/**
*******************************************************************
* @function 发送非应答信号
* @param    
* @return   
* @brief    下面是具体的时序图 
*               1 2     3      4
*                        ______
*          SCL: ________/      \______    
*               __ ___________________    
*          SDA: __/
*******************************************************************
*/
void I2CSendNack(void)
{
	SET_I2C_SDA();          // 2#数据线SDA输出高电平
	DelayNus(4);            // 延时4us
	SET_I2C_SCL();          // 3#时钟线SCL输出高电平,在SCL上升沿前就要把SDA拉高,为非应答信号
	DelayNus(4);            // 延时4us
	CLR_I2C_SCL();          // 4#时钟线SCL输出低电平
	DelayNus(4);            // 延时4us
}

10.0 完整代码

#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include "gd32f30x.h"
#include "delay.h"

#define GET_I2C_SDA()             gpio_input_bit_get(GPIOB, GPIO_PIN_7)    // 读取SDA端口
#define SET_I2C_SCL()             gpio_bit_set(GPIOB, GPIO_PIN_6)          // 时钟线SCL输出高电平
#define CLR_I2C_SCL()             gpio_bit_reset(GPIOB, GPIO_PIN_6)        // 时钟线SCL输出低电平
#define SET_I2C_SDA()             gpio_bit_set(GPIOB, GPIO_PIN_7)          // 数据线SDA输出高电平
#define CLR_I2C_SDA()             gpio_bit_reset(GPIOB, GPIO_PIN_7)        // 数据线SDA输出低电平

static void GpioInit(void)
{
	rcu_periph_clock_enable(RCU_GPIOB);
    gpio_init(GPIOB, GPIO_MODE_OUT_OD, GPIO_OSPEED_10MHZ, GPIO_PIN_6 | GPIO_PIN_7);
}

void EepromDrvInit(void)
{
	GpioInit();
}

/**
*******************************************************************
* @function 产生IIC起始时序,准备发送或接收数据前必须由起始序列开始 
* @param
* @return 
* @brief    SCL为高电平时,SDA由高电平向低电平跳变,开始传输数据 
*           生成下图所示的波形图,即为起始时序 
*                1 2    3     4   
*                    __________     
*           SCL : __/          \_____ 
*                 ________          
*           SDA :         \___________ 
*******************************************************************
*/
static void I2CStart(void)
{
	SET_I2C_SDA();          // 1#数据线SDA输出高电平
	SET_I2C_SCL();          // 2#时钟线SCL输出高电平   
	DelayNus(4);            // 延时4us
	CLR_I2C_SDA();          // 3#数据线SDA输出低电平 
	DelayNus(4);            // 延时4us
	CLR_I2C_SCL();          // 4#时钟线SCL输出低电平,保持I2C的时钟线SCL为低电平,准备发送或接收数据 
	DelayNus(4);            // 延时4us
}

/**
*******************************************************************
* @function 产生IIC停止时序  
* @param
* @return 
* @brief    SCL为高电平时,SDA由低电平向高电平跳变,结束传输数据 
*          生成下图所示的波形图,即为停止时序 
*                1 2   3  4   
*                       _______________     
*          SCL : ______/          
*                __        ____________  
*          SDA:    \______/
*******************************************************************
*/
static void I2CStop(void)
{
	CLR_I2C_SDA();          //2#数据线SDA输出低电平
	DelayNus(4);            //延时4us
	SET_I2C_SCL();          //3#时钟线SCL输出高电平
	DelayNus(4);  
	SET_I2C_SDA();          //4#数据线SDA输出高电平,发送I2C总线结束信号
}

/**
*******************************************************************
* @function 发送一字节,数据从高位开始发送出去
* @param    byte
* @return 
* @brief    下面是具体的时序图 
*                1 2     3      4
*                         ______
*           SCL: ________/      \______    
*                ______________________    
*           SDA: \\\___________________
*******************************************************************
*/
static void I2CSendByte(uint8_t byte)
{                          
	for (uint8_t i = 0; i < 8; i++)   // 循环8次,从高到低取出字节的8个位
	{     
		if ((byte & 0x80))            // 2#取出字节最高位,并判断为‘0’还是‘1’,从而做出相应的操作
		{
			SET_I2C_SDA();            // 数据线SDA输出高电平,数据位为‘1’
		}
		else
		{  
			CLR_I2C_SDA();      	  // 数据线SDA输出低电平,数据位为‘0’
		}
		
		byte <<= 1;            		  // 左移一位,次高位移到最高位
		
		DelayNus(4);          		  // 延时4us
		SET_I2C_SCL();                // 3#时钟线SCL输出高电平
		DelayNus(4);          		  // 延时4us
		CLR_I2C_SCL();        		  // 4#时钟线SCL输出低电平
		DelayNus(4);                  // 延时4us  
	}  
}

/**
*******************************************************************
* @function 读取一字节数据
* @param    
* @return   读取的字节
* @brief    下面是具体的时序图
*                       ______
*           SCL: ______/      \___        
*                ____________________    
*           SDA: \\\\______________\\\
*******************************************************************
*/
static uint8_t I2CReadByte(void)
{
	uint8_t byte = 0;           		// byte用来存放接收的数据
	SET_I2C_SDA();                      // 释放SDA
	for (uint8_t i = 0; i < 8; i++)     // 循环8次,从高到低读取字节的8个位
	{
		SET_I2C_SCL();          		// 时钟线SCL输出高电平
		DelayNus(4);            		// 延时4us
		byte <<= 1;          			// 左移一位,空出新的最低位

		if (GET_I2C_SDA())       		// 读取数据线SDA的数据位
		{
			byte++;            			// 在SCL的上升沿后,数据已经稳定,因此可以取该数据,存入最低位
		}
		CLR_I2C_SCL();          		// 时钟线SCL输出低电平
		DelayNus(4);            		// 延时4us
	} 

	return byte;           				// 返回读取到的数据
}

/**
*******************************************************************
* @function 等待接收端的应答信号
* @param    
* @return   1,接收应答失败;0,接收应答成功
* @brief    当SDA拉低后,表示接收到ACK信号,然后,拉低SCL,
*           此处表示发送端收到接收端的ACK
*                _______|____     
*           SCL:        |    \_________    
*                _______|     
*           SDA:         \_____________ 
*******************************************************************
*/
static bool I2CWaitAck(void)
{
	uint8_t errTimes = 0;
	
	SET_I2C_SDA();             // 释放SDA总线,很重要
	DelayNus(4);               // 延时4us
	
	SET_I2C_SCL();             // 时钟线SCL输出高电平
	DelayNus(4);               // 延时4us

	while (GET_I2C_SDA())      // 读回来的数据如果是高电平,即接收端没有应答
	{
		errTimes++;            // 计数器加1

		if (errTimes > 250)    // 如果超过250次,则判断为接收端出现故障,因此发送结束信号
		{
			I2CStop();         // 产生一个停止信号
			return false;      // 返回值为1,表示没有收到应答信号
		}
	}

	CLR_I2C_SCL();             // 表示已收到应答信号,时钟线SCL输出低电平
	DelayNus(4);               // 延时4us
	
	return true;               // 返回值为0,表示接收应答成功  
}

/**
*******************************************************************
* @function 发送应答信号
* @param    
* @return   
* @brief    下面是具体的时序图 
*                 1 2     3      4      5     
*                         ______
*           SCL: ________/      \____________    
*                __                     ______
*           SDA:   \___________________/        
*******************************************************************
*/
void I2CSendAck(void)
{
	CLR_I2C_SDA();          // 2#数据线SDA输出低电平
	DelayNus(4);            // 延时4us
	SET_I2C_SCL();          // 3#时钟线SCL输出高电平,在SCL上升沿前就要把SDA拉低,为应答信号
	DelayNus(4);            // 延时4us
	CLR_I2C_SCL();          // 4#时钟线SCL输出低电平
	DelayNus(4);            // 延时4us
	SET_I2C_SDA();          // 5#数据线SDA输出高电平,释放SDA总线,很重要
}

/**
*******************************************************************
* @function 发送非应答信号
* @param    
* @return   
* @brief    下面是具体的时序图 
*               1 2     3      4
*                        ______
*          SCL: ________/      \______    
*               __ ___________________    
*          SDA: __/
*******************************************************************
*/
void I2CSendNack(void)
{
	SET_I2C_SDA();          // 2#数据线SDA输出高电平
	DelayNus(4);            // 延时4us
	SET_I2C_SCL();          // 3#时钟线SCL输出高电平,在SCL上升沿前就要把SDA拉高,为非应答信号
	DelayNus(4);            // 延时4us
	CLR_I2C_SCL();          // 4#时钟线SCL输出低电平
	DelayNus(4);            // 延时4us
}

头文件

#ifndef _EEPROM_DRV_H_
#define _EEPROM_DRV_H_

void EepromDrvInit(void);
void EepromDrvTest(void);

#endif

后记:


进一步的完成连续发送和接收字节...


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

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

相关文章

构建二叉树并后序遍历

题目来源&#xff1a;牛客网清华考研oj题 http://www.nowcoder.com/questionTerminal/4b91205483694f449f94c179883c1fef 题目&#xff1a;如下图 答案&#xff1a;如下图 #include<stdio.h> #include<stdlib.h>typedef struct TreeNode{char val;struct TreeNod…

java之IO篇高级流——缓冲流、转化流、序列化流、打印流、压缩流

前言 上一篇IO流就介绍了File和基本流&#xff0c;这节介绍好用的高级流。 还有IO流的心得&#xff1a;随用随创建&#xff0c;什么时候不用什么时候关闭 目录 前言 一、缓冲流 1.体系图 2.字节缓冲流 &#xff08;1&#xff09;用法 &#xff08;2&#xff09;底层原理 …

JavaSE之常用API(前一部分)

一、String 1.1 是什么 String字符串类,底层就是一个字符数组,所以字符串很多特性就是数组的特征 1 字符串一旦创建,不能修改 2 为了提高字符串的访问效率,Java提供了一种缓存技术,字符串常量池 3 如果是用" " 就不会再堆内存创建对象,而是直接再常量池进行搜索,如果…

Java反序列化漏洞实战:原理剖析与复现步骤

文章目录 java反序列化概念数据示例Ysoserial工具使用概念原生态api第三方组件概念复现 反序列化示例靶场过程 在现代应用程序开发中&#xff0c;Java反序列化漏洞已成为一个备受关注的安全问题。反序列化是Java中用于将字节流转换回对象的过程&#xff0c;但如果没有妥善处理&…

搭建PXE实现服务器自动部署

PXE&#xff08;Preboot Execution Environment&#xff09;是一种计算机启动技术&#xff0c;它允许计算机从网络上的服务器而不是从本地硬盘或光盘等存储介质上启动。这种技术主要应用在无盘工作站、网络安装操作系统、远程维护等方面。 环境&#xff1a;一台rhel7.9作为PXE…

Java学习十五—异常处理

一、关于异常 1.1 简介 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是指程序执行过程中可能遇到的意外或错误情况。 Java异常处理是Java语言中一个重要的机制&#xff0c;用于处理程序运行时发生的异常情况。 ​​ 1.2 分类 Java异常分为两大类&#xff1…

STM32 驱动直流无刷电机(BLDC)发声

STM32驱动直流无刷电机(BLDC)发声 ✨需要注意&#xff0c;这是驱动直流无刷电机(BLDC)发出声音&#xff0c;不是直接驱动无刷电机转动。 &#x1f4cd;内容移植参考&#xff1a;ttps://github.com/AlkaMotors/AM32-MultiRotor-ESC-firmware&#x1f4cd;Arduino平台BLDC Music开…

小程序开发入门:第一天的学习和实践指南

目录 一. 理解小程序的基本概念 1. 无需安装 2. 快速启动 3. 界面简洁 4. 独立性和封闭性 5. 数据安全 6. 框架结构 7. 生命周期 8. 全局配置 9. API支持 10. 发布和更新 二、选择合适的开发工具 1. 微信开发者工具 2. Visual Studio Code 3. Sublime Text 4. …

荣耀手机怎么录屏?荣耀手机录屏功能全解析

荣耀手机作为一款受欢迎的智能手机品牌&#xff0c;拥有丰富的功能和实用的工具&#xff0c;其中包括强大的录屏功能。然而&#xff0c;对于一些荣耀手机用户来说&#xff0c;如何利用这一功能可能会感到困惑。 在数字化时代&#xff0c;录制屏幕上的内容已成为许多用户分享、…

AOE网及其求解关键路径

全称 Activity on Edge Network 边活动网 特点 仅存在 有向无环图 作用 用于记录完成整个工程至少花费的时间 > 哪条路径最耗时&#xff1f;也就是“ 关键路径 ” AOE网元素介绍 关键活动 关键路径上的活动称为关键活动 &#xff0c; 关键活动是不允许拖延的&#x…

ctfshow-web入门-sql注入(web186-web190)

目录 1、web186 2、web187 3、web188 4、web189 5、web190 1、web186 新增过滤 \%|\<|\>|\^ 采用 regexp 正则表达式的方法来匹配&#xff0c;payload&#xff1a; ^ 表示匹配开头&#xff0c;也就是说我们猜测 flag 的第一个字符是 c tableNamectfshow_user gro…

sql注入——环境搭建以及sqli-labs闯关

1.简介 本文将详细介绍如何在Windows系统中使用PHPStudy搭建SQLi-Labs环境&#xff0c;在刚学习SQL注入的时候&#xff0c;都需要拥有一个能SQL注入的网站。因此我们一般都是在本地搭建一个能SQL注入测试的网站&#xff0c;而SQLi-Labs是一个精心设计的SQL注入学习平台。 2. …

无心剑七律《悼李政道先生》

七律悼李政道先生 苏州才俊志凌云&#xff0c;联大求知岁月勤 异域扬名赢诺奖&#xff0c;前沿探秘破迷群 基金倡导根基固&#xff0c;学子栽培事业殷 科教倾心功绩著&#xff0c;英名不朽铸奇文 2024年8月5日 平水韵十二文平韵 这首诗是一首悼念李政道先生的七律&#xff0c;无…

【隐私计算篇】混淆电路之深入浅出

入门隐私计算的阶段&#xff0c;一般都会涉及对于混淆电路的学习&#xff0c;这是因为混淆电路是多方安全计算中的基础密码原语&#xff0c;也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理&#xff0c;今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…

【2024华数杯】C题成品论文及代码

问题分析 1、问题一 针对问题一&#xff0c;为了解决此问题&#xff0c;我们需要利用 python 中的内置线性扫描算法 max遍历所有城市景点数据&#xff0c;寻到最高评分&#xff0c;检索每个城市中景点获评最高评分的数量&#xff0c;随后排序并列出前 10 个城市。 2、问题二&…

sqlilab本地靶场注入less-1~less-6

如何通过information_schema数据库查表名&#xff0c;列名 首先要了解mysql和mariadb数据库默认自带的tables有哪些&#xff1a; mariadb自带数据库 information_schema performance_schema mysql MySQL自带数据库 information_schema performance_schema mysql…

ubuntu执行git svn clone发生中断:APR does not understand this error code: ra serf

问题描述 在ubuntu中执行 git svn clone <url>的时候&#xff0c;出现如下报错&#xff1a; 即 ubuntu&#xff1a;APR does not understand this error code: ra serf: The server sent a truncated HTTPresponse body.解决方法 方法一&#xff1a;使用git svn fet…

C语言 | Leetcode C语言题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; static inline void swap(int *a, int *b) {int c *a;*a *b;*b c; }static inline int partitionAroundPivot(int left, int right, int pivot, int *nums) {int pivotValue nums[pivot];int newPivot left;swap(&nums[pivot], &a…

谈谈冯诺依曼体系

我们都知道冯诺依曼体系这张图最为代表性&#xff0c;而接下来我们就来浅谈一下各部分之间的作用~ 输入设备&#xff1a;键盘&#xff0c;磁盘&#xff0c;网卡&#xff0c;话筒等等 输出设备&#xff1a;磁盘&#xff0c;网卡&#xff0c;声卡&#xff0c;显示屏等等 这些硬件…

TiDE时间序列模型预测(Long-term Forecasting with TiDE: Time-series Dense Encoder)

时间序列预测&#xff0c;广泛用于能源、金融、交通等诸多行业&#xff0c;传统的统计模型&#xff0c;例如ARIMA、GARCH等因其简单高效而被广泛使用&#xff0c;近年来&#xff0c;随着深度学习的兴起&#xff0c;基于神经网络的预测模型也备受关注&#xff0c;表现出强大的预…