【PC电脑windows-学习样例generic_gpio-拓展GPIO-ESP32的GPIO程序-问题解决-GPIO输出实验-基础样例学习(2)】

news2024/11/23 0:25:37

【PC电脑windows-学习样例generic_gpio-拓展GPIO-ESP32的GPIO程序-基础样例学习(2)】

  • 1、概述
  • 2、实验环境
  • 3、 问题说明
      • 1:问题说明:使用官方样例,增加IO,编译会重新改回去。
      • 2:解决方式:使用命令界面进行控制,然后重新编译。
  • 4、自我总结
  • 5、本次实验说明
    • (1)实验1:更改官方样例
    • (2)实验2:按照网上样例,直接定义
  • 6-1、实验过程1
      • (1)复制目标目录
      • (2)增加代码
      • (3)菜单设置
      • (4)下载验证
  • 6-2、实验过程2
      • (1)代码编写
      • (2)解决报错
      • (2)验证结果
  • 7、代码连接
  • 8、相关细节
      • (1)编译环境配置
      • (2)样例代码目录
      • (3)IO定义
      • (4)报错:无法下载1
      • (5)报错:无法下载2
  • 9、总结

1、概述

最为新手,想要快速入门相关设备,比如ESP32,可能最好的方式就是直接手动去敲一遍代码,之前已经敲了一遍基础代码了,但当我想扩展GPIO时,却发现了一些问题,总是也对GPIO相问题进行了总结。

2、实验环境

硬件信息:开发板 ESP32-S3-DevKitM-1(EPS32-S3-wroom-1模块)
在这里插入图片描述

其它硬件:杜邦线,两个usb-type-c连接线,逻辑分析仪。

3、 问题说明

1:问题说明:使用官方样例,增加IO,编译会重新改回去。

如下图所示,自己调试,在增加IO的时候,发现,一旦编译,被定义的IO,回重新定回去。
在这里插入图片描述

2:解决方式:使用命令界面进行控制,然后重新编译。

之前不知道这回事,觉得只要改代码就可以了,后来发现需要再菜单里配置下。

idf.py menuconfig

在这里插入图片描述

4、自我总结

(1)练习代码是你更快入门
练习代码比实际看代码要快些,这属于个人见解了,练习敲写代码过程汇总,就是帮助你熟悉相关代码结构,当你从一个固有套路结构代码中,切换到另一套方式时,可能直接手敲,更能让你理解。

(2)IO相关测试,手动更改
自己练习的代码,手动敲完,可能会报错,可能会有逻辑错误,在改的过程中,其实也是熟悉。

(3)IO相关调用方式
目前看到网上有关GPIO相关方式,关于写法至少有两种:

  1. 一种就是想官网样例的方式,加完代码后,还需要再菜单里设置下。
  2. 另外就是不用菜单,直接定义然后直接使用。

5、本次实验说明

(1)实验1:更改官方样例

本次实验使用样例,依旧是generic_gpio,直接复制一份在桌面,直接改写,我们的目的时再增加两个IO,发现核心板上的,P15,P16,P17,P18,这四个引脚时连在一起的,所以准备换到这几个GPIO进行输出调试

(2)实验2:按照网上样例,直接定义

具体参考链接如下:https://blog.csdn.net/qq_36347513/article/details/115691435

在这里插入图片描述

本次参考以上写法,再次实现。

6-1、实验过程1

(1)复制目标目录

我这里之前实验复制过,所以可以直接使用。
在这里插入图片描述
使用VScode直接打开。
在这里插入图片描述

(2)增加代码

主要是在三个文件中,增加代码,即
main.c中
**加粗样式**

/* GPIO Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "driver/uart.h"

/**
 * Brief:
 * This test code shows how to configure gpio and how to use gpio interrupt.
 *
 * GPIO status:
 * GPIO18: output (ESP32C2/ESP32H2 uses GPIO8 as the second output pin)
 * GPIO19: output (ESP32C2/ESP32H2 uses GPIO9 as the second output pin)
 * GPIO4:  input, pulled up, interrupt from rising edge and falling edge
 * GPIO5:  input, pulled up, interrupt from rising edge.
 *
 * Note. These are the default GPIO pins to be used in the example. You can
 * change IO pins in menuconfig.
 *
 * Test:
 * Connect GPIO18(8) with GPIO4
 * Connect GPIO19(9) with GPIO5
 * Generate pulses on GPIO18(8)/19(9), that triggers interrupt on GPIO4/5
 *
 */
//P15 16 17 18
#define GPIO_OUTPUT_IO_0    CONFIG_GPIO_OUTPUT_0
#define GPIO_OUTPUT_IO_1    CONFIG_GPIO_OUTPUT_1
#define GPIO_OUTPUT_IO_2    CONFIG_GPIO_OUTPUT_2
#define GPIO_OUTPUT_IO_3    CONFIG_GPIO_OUTPUT_3

#define GPIO_OUTPUT_PIN_SEL  ((1ULL<<GPIO_OUTPUT_IO_0) | (1ULL<<GPIO_OUTPUT_IO_1) | (1ULL<<GPIO_OUTPUT_IO_2) | (1ULL<<GPIO_OUTPUT_IO_3)   )
#define GPIO_INPUT_IO_0     CONFIG_GPIO_INPUT_0
#define GPIO_INPUT_IO_1     CONFIG_GPIO_INPUT_1
#define GPIO_INPUT_PIN_SEL  ((1ULL<<GPIO_INPUT_IO_0) | (1ULL<<GPIO_INPUT_IO_1))
#define ESP_INTR_FLAG_DEFAULT 0

#define UART_PORT UART_NUM_0 //选择串口端口

static QueueHandle_t gpio_evt_queue = NULL;

static void IRAM_ATTR gpio_isr_handler(void* arg)
{
    uint32_t gpio_num = (uint32_t) arg;
    xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}

static void gpio_task_example(void* arg)
{
    uint32_t io_num;
    for(;;) {
        if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
          //  printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, gpio_get_level(io_num));
        }
    }
}


void uart_task(void *pvParameters){
    uint8_t data;
    while(1){
		
		// printf("this is my——test,helloworld!",data);
		// sleep(1);
        //从串口读取输入数据
        if(uart_read_bytes(UART_PORT,&data,1,pdMS_TO_TICKS(10))>0){
            //打印读到的字符
            printf("Received:%c\n",data);
        }
    }
}

void app_main(void)
{
    //zero-initialize the config structure.
    gpio_config_t io_conf = {};
    //disable interrupt
    io_conf.intr_type = GPIO_INTR_DISABLE;
    //set as output mode
    io_conf.mode = GPIO_MODE_OUTPUT;
    //bit mask of the pins that you want to set,e.g.GPIO15/16/17/18
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
    //disable pull-down mode
    io_conf.pull_down_en = 0;
    //disable pull-up mode
    io_conf.pull_up_en = 0;
    //configure GPIO with the given settings
    gpio_config(&io_conf);

    //interrupt of rising edge
    io_conf.intr_type = GPIO_INTR_POSEDGE;
    //bit mask of the pins, use GPIO4/5 here
    io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
    //set as input mode
    io_conf.mode = GPIO_MODE_INPUT;
    //enable pull-up mode
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);

    //change gpio interrupt type for one pin
    gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE);

    //create a queue to handle gpio event from isr
    gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
    //start gpio task
    xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);

    //install gpio isr service
    gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
    //hook isr handler for specific gpio pin
    gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
    //hook isr handler for specific gpio pin
    gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void*) GPIO_INPUT_IO_1);
 


    //remove isr handler for gpio number.
    gpio_isr_handler_remove(GPIO_INPUT_IO_0);
    //hook isr handler for specific gpio pin again
    gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);

    printf("Minimum free heap size: %"PRIu32" bytes\n", esp_get_minimum_free_heap_size());

//串口部分

    //配置串口参数
    uart_config_t uart_config={
    .baud_rate = 9600,                      /*!< UART baud rate*/
    .data_bits = UART_DATA_8_BITS,      /*!< UART byte size*/
    .parity = UART_PARITY_DISABLE,               /*!< UART parity mode*/
    .stop_bits = UART_STOP_BITS_1,         /*!< UART stop bits*/
    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE    /*!< UART HW flow control mode (cts/rts)*/

    };
    uart_param_config(UART_PORT,&uart_config);
    uart_set_pin(UART_PORT,UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE);
    uart_driver_install(UART_PORT,1024,0,0,NULL,0);

    //创建串口任务
    xTaskCreate(uart_task,"uart_task",2048,NULL,10,NULL);

    int cnt = 0;
    while(1) {
        printf("cnt: %d\n", cnt++);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        gpio_set_level(GPIO_OUTPUT_IO_0, 1);
        gpio_set_level(GPIO_OUTPUT_IO_1, 1);
        gpio_set_level(GPIO_OUTPUT_IO_2, 1);
        gpio_set_level(GPIO_OUTPUT_IO_3, 1);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        gpio_set_level(GPIO_OUTPUT_IO_0, 0);
        gpio_set_level(GPIO_OUTPUT_IO_1, 0);
        gpio_set_level(GPIO_OUTPUT_IO_2, 0);
        gpio_set_level(GPIO_OUTPUT_IO_3, 0);
    }
}

在文件Kconfig.projbuild中增加内容:
在这里插入图片描述

menu "Example Configuration"

    orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps"

    config GPIO_OUTPUT_0
        int "GPIO output pin 0"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
        default 15 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3
        default 5 if IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
        help
            GPIO pin number to be used as GPIO_OUTPUT_IO_0.

    config GPIO_OUTPUT_1
        int "GPIO output pin 1"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
        default 16 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3
        default 6 if IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
        help
            GPIO pin number to be used as GPIO_OUTPUT_IO_1.

    config GPIO_OUTPUT_2
        int "GPIO output pin 2"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
        default 17 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3
        default 7 if IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
        help
            GPIO pin number to be used as GPIO_OUTPUT_IO_2.

    config GPIO_OUTPUT_3
        int "GPIO output pin 3"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
        default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3
        default 8 if IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
        help
            GPIO pin number to be used as GPIO_OUTPUT_IO_3.




    config GPIO_INPUT_0
        int "GPIO input pin 0"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_IN_RANGE_MAX
        default 4
        help
            GPIO pin number to be used as GPIO_INPUT_IO_0.

    config GPIO_INPUT_1
        int "GPIO input pin 1"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_IN_RANGE_MAX
        default 5
        help
            GPIO pin number to be used as GPIO_INPUT_IO_1.

endmenu

在文件sdkconfig中增加内容。

在这里插入图片描述

注意,如果此时直接编译,那么一定会重新变成18和19GPIO的,需要在菜单里设置。

(3)菜单设置

使用命令进入菜单。

idf.py menuconfig

(1)进入目录,并敲写命令
在这里插入图片描述

(2)菜单如下
在这里插入图片描述

(3)引脚改写如下

在这里插入图片描述

(4)退出来进行保存
在这里插入图片描述

(4)下载验证

之后就是重新编译和烧写下载了。

在这里插入图片描述

下载成功后验证
在这里插入图片描述

在这里插入图片描述

6-2、实验过程2

按照网上相关进行实验。我们选择4个引脚P35,P36,P37,P38,这一组是并排连着的。
主要参考如下部分:
在这里插入图片描述

我们用一个空工程,然后加入如下代码。

(1)代码编写

这里只需要写这一个文件就可以了。

#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"



#define GPIO_OUTPUT_IO_0    35
#define GPIO_OUTPUT_IO_1    36
#define GPIO_OUTPUT_IO_2    37
#define GPIO_OUTPUT_IO_3    38

 #define GPIO_OUTPUT_PIN_SEL  ((1ULL<<GPIO_OUTPUT_IO_0) |(1ULL<<GPIO_OUTPUT_IO_1) | (1ULL<<GPIO_OUTPUT_IO_2) | (1ULL<<GPIO_OUTPUT_IO_3)) // 配置GPIO_OUT位寄存器

void gpio_init(void)
{
    gpio_config_t io_conf;  // 定义一个gpio_config类型的结构体,下面的都算对其进行的配置
    io_conf.intr_type = GPIO_INTR_DISABLE;  // 禁止中断  
    io_conf.mode = GPIO_MODE_OUTPUT;            // 选择输出模式
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; // 配置GPIO_OUT寄存器
    io_conf.pull_down_en = 0;                   // 禁止下拉
    io_conf.pull_up_en = 0;                     // 禁止上拉

    gpio_config(&io_conf);                      // 最后配置使能
}

// gpio_set_level(GPIO_OUTPUT_IO_0, 0);            // 把这个GPIO输出低电平
// gpio_set_level(GPIO_OUTPUT_IO_0, 1);            // 把这个GPIO输出高电平


void app_main(void)
{

    gpio_init();
    // // gpio_pad_select_gpio(GPIO_NUM_9);
    // // gpio_pad_select_gpio(GPIO_NUM_10);
    // // gpio_pad_select_gpio(GPIO_NUM_11);
    // // gpio_pad_select_gpio(GPIO_NUM_12);
    // //gpio_init();
    // /* Set the GPIO as a push/pull output */
    // // gpio_set_direction(GPIO_NUM_9, GPIO_MODE_OUTPUT);
    // // // gpio_set_direction(GPIO_NUM_36, GPIO_MODE_OUTPUT);
    // // // gpio_set_direction(GPIO_NUM_37, GPIO_MODE_OUTPUT);
    // // // gpio_set_direction(GPIO_NUM_38, GPIO_MODE_OUTPUT);
    while(1) 
    {
        /* Blink off (output low) */
	    // printf("Turning off the LED\n");
        // gpio_set_level(GPIO_NUM_22, 0);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        // gpio_set_level(GPIO_NUM_9, 0);                   // 把这个GPIO输出低电平
        // gpio_set_level(GPIO_NUM_36, 0);                   // 把这个GPIO输出低电平
        // gpio_set_level(GPIO_NUM_37, 0);                   // 把这个GPIO输出低电平
        // gpio_set_level(GPIO_NUM_38, 0);                   // 把这个GPIO输出低电平

         gpio_set_level(GPIO_OUTPUT_IO_0, 1);            // 把这个GPIO输出高电平
         gpio_set_level(GPIO_OUTPUT_IO_1, 1);            // 把这个GPIO输出高电平
         gpio_set_level(GPIO_OUTPUT_IO_2, 1);            // 把这个GPIO输出高电平
         gpio_set_level(GPIO_OUTPUT_IO_3, 1);            // 把这个GPIO输出高电平
        /* Blink on (output high) */
	    // printf("Turning on the LED\n");
        // gpio_set_level(GPIO_NUM_22, 1);
        vTaskDelay(1000 / portTICK_PERIOD_MS);

        // gpio_set_level(GPIO_NUM_9, 1);                   // 把这个GPIO输出高电平
        // // gpio_set_level(GPIO_NUM_36, 1);                   // 把这个GPIO输出高电平
        // // gpio_set_level(GPIO_NUM_37, 1);                   // 把这个GPIO输出高电平
        // // gpio_set_level(GPIO_NUM_38, 1);                   // 把这个GPIO输出高电平

         gpio_set_level(GPIO_OUTPUT_IO_0, 0);            // 把这个GPIO输出低电平
         gpio_set_level(GPIO_OUTPUT_IO_1, 0);            // 把这个GPIO输出低电平
         gpio_set_level(GPIO_OUTPUT_IO_2, 0);            // 把这个GPIO输出低电平
         gpio_set_level(GPIO_OUTPUT_IO_3, 0);            // 把这个GPIO输出低电平
    }

}

(2)解决报错

(1)代码过旧,更新为绿色部分
在这里插入图片描述

(2)中英文符合错误
在这里插入图片描述
解决报错
如下有些中英文切换符合的错误,改好了后,可以了。
在这里插入图片描述

(2)验证结果

在这里插入图片描述

在这里插入图片描述

7、代码连接

(1)参照官方:https://download.csdn.net/download/qq_22146161/88650620

(2)参照网上:https://download.csdn.net/download/qq_22146161/88650618

8、相关细节

(1)编译环境配置

相关配置情况自己的其他文章:【ESP32-PC电脑windows-环境搭建-记录-hello-world-运行基础样例学习】

(2)样例代码目录

如果是默认安装,找如下目录

C:\Espressif\frameworks\esp-idf-v5.0.2\examples\peripherals\gpio

在这里插入图片描述

(3)IO定义

自己打代码的时候,比较疑惑,没有看到GPIO18相关的信息,怎么就是GPIO19,GPIO4,等等,后来看到配置文件。
在这里插入图片描述

(4)报错:无法下载1

如下图,比较常见下载错误了,直接先按boot然后rst,之后撒开rst,最后再放开boot,就可以在下载了。
在这里插入图片描述

(5)报错:无法下载2

如果上边方式还是不行,那么就有另一种可能了,在自己实际调试时候,我其实开了两个工具,一个是VScode,l另一个就是如下界面。
那么就会有抢占端口问题。所以下面界面无法下载。

在这里插入图片描述

解决方式:需要关闭一个,这里我关闭了vscode

在这里插入图片描述
在这里插入图片描述

9、总结

一步一步

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

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

相关文章

STM32 使用ARM仿真器设置

STM32单片机程序下载到单片机芯片中有两种方式&#xff0c;①编译生成HEX&#xff0c;使用程序烧录软件刷到单片机芯片里。②使用ARM仿真器下载程序。使用ARM仿真器的优势是&#xff0c;在工程编译没问题直接在Keil软件里就可以将程序下载到单片机里&#xff0c;并且程序可以在…

苏州耕耘无忧物联网:降本增效,设备维护管理数字化转型的引领者

随着科技的快速发展和工业4.0的推动&#xff0c;设备维护管理已经从传统的被动式、经验式维护&#xff0c;转向了更加积极主动、数据驱动的维护模式。在这个过程中&#xff0c;苏州耕耘无忧物联科技有限公司以其深厚的技术积累和丰富的管理经验&#xff0c;引领着设备维护管理数…

ASP.NET Core基础之定时任务(二)-Quartz.NET入门

阅读本文你的收获 了解任务调度框架QuartZ.NET的核心构成学会在ASP.NET Core 中使用QuartZ.NET 在项目的开发过程中&#xff0c;难免会遇见需要后台处理的任务&#xff0c;例如定时发送邮件通知、后台处理耗时的数据处理等&#xff0c;上次分享了ASP.NET Core中实现定时任务的…

4. 行为模式 - 中介者模式

亦称&#xff1a; 调解人、控制器、Intermediary、Controller、Mediator 意图 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 问题 假如你有一个创建…

el-date-picker时间戳问题

最近用el-date-picker时间插件&#xff0c;没想到只能得到格式化的日期&#xff0c;那能不能得到时间戳呢&#xff1f;答案是肯定的&#xff0c;最恶心的来了&#xff0c;按照大多数人提供的方案得到了一个莫名其妙的字符串&#xff0c;看起来很奇怪 经过不懈的努力找到了最终的…

通过U盘:将电脑进行重装电脑

目录 一.老毛桃制作winPE镜像 1.制作准备 2.具体制作 下载老毛桃工具 插入U盘 选择制作模式 正式配置U盘 安装提醒 安装成功 具体操作 二.使用ultrasio制作U盘 1.具体思路 2.图片操作 三.硬盘安装系统 具体操作 示例图 ​编辑 一.老毛桃制作winPE镜像 1.制作准…

神经网络:深度学习优化方法

1.有哪些方法能提升CNN模型的泛化能力 采集更多数据&#xff1a;数据决定算法的上限。 优化数据分布&#xff1a;数据类别均衡。 选用合适的目标函数。 设计合适的网络结构。 数据增强。 权值正则化。 使用合适的优化器等。 2.BN层面试高频问题大汇总 BN层解决了什么问…

使用@jiaminghi/data-view实现一个数据大屏

<template><div class"content bg"><!-- 全局容器 --><!-- <dv-full-screen-container> --><!-- 第二行 --><div class"module-box" style"align-items: start; margin-top: 10px"><!-- 左 -->…

【IntelliJ IDEA】打开项目Git突然无法识别解决方案

这个问题也是我今天突然偶尔遇到的&#xff0c;当时没在意&#xff0c;项目打开之后又关闭&#xff0c;后来很久才又打开&#xff0c;发现项目明明有git版本控制的&#xff0c;咋突然开发工具右下角没有标识了&#xff0c;然后检查了一下git配置还报错了。 其实从图上我们可以看…

ctfshow sql 195-200

195 堆叠注入 十六进制 if(preg_match(/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|\|\"|select|union|or|and|\x26|\x7c|file|into/i, $username)){$ret[msg]用户名非法;die(json_encode($ret));}可以看到没被过滤&#xff0c;select 空格 被过滤了&#xff0c;可…

【Week-P2】CNN彩色图片分类-CIFAR10数据集

文章目录 一、环境配置二、准备数据三、搭建网络结构四、开始训练五、查看训练结果六、总结3.1 ⭐ torch.nn.Conv2d()详解3.2 ⭐ torch.nn.Linear()详解3.3 ⭐torch.nn.MaxPool2d()详解3.4 ⭐ 关于卷积层、池化层的计算4.2.1 optimizer.zero_grad()说明4.2.2 loss.backward()说…

SQL---Zeppeline前驱记录与后驱记录查询

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

油猴脚本教程案例【键盘监听】-编写 ChatGPT 快捷键优化

文章目录 1. 元数据1. name2. namespace3. version4. description5. author6. match7. grant8. icon 2. 编写函数.1 函数功能2.1.1. input - 聚焦发言框2.1.2. stop - 取消回答2.1.3. newFunction - 开启新窗口2.1.4. scroll - 回到底部 3. 监听键盘事件3.1 监听X - 开启新对话…

GPTs | Actions应用案例

上篇文章说道&#xff0c;如何使用创建的GPTs通过API接口去获取外部的一些信息&#xff0c;然后把获取的外部信息返回给ChatGPT让它加工出来&#xff0c;回答你的问题&#xff0c;今天我们就来做一个通俗易懂的小案例&#xff0c;让大家来初步了解一下它的使用法&#xff01; …

【数字图像处理】实验二 图像变换

图像变换 一、实验内容&#xff1a; 1&#xff0e; 熟悉和掌握利用Matlab工具进行数字图像的读、写、显示等数字图像处理基本步骤。 2&#xff0e; 熟练掌握各种图像变换的基本原理及方法。 3&#xff0e; 能够从深刻理解图像变换&#xff0c;并能够思考拓展到一定的应用领域。…

【Zabbix】使用 Grafana 统一监控展示并对接Zabbix v6

Grafana是开源的可视化工具&#xff0c;支持各类数据源的接入MySQL、PostgreSQL、AWS CloudWatch、Microsoft SQL Server (MSSQL)等;支持丰富的插件生态系统 Bar chart、CloudWatch、Geomap、Jaeger等。以下是grafana的官方网站&#xff1a; Grafana Labs grafana服务端支持在…

Centos 7.9安装Oracle19c步骤亲测可用有视频

视频介绍了在虚拟机安装centos 7.9并安装数据库软件的全过程 视频链接&#xff1a;https://www.zhihu.com/zvideo/1721267375351996416 下面的文字描述是安装数据库的部分介绍 一.安装环境准备 链接&#xff1a;https://pan.baidu.com/s/1Ogn47UZQ2w7iiHAiVdWDSQ 提取码&am…

CUMT--Java复习--泛型与集合

目录 一、泛型 1、概述 2、通配符 3、有界类型 二、集合 1、概述 2、迭代器接口 三、集合类 1、Collection接口 2、List接口 3、Set接口 4、Queue接口 5、Map接口 四、集合转换 五、集合工具类 一、泛型 1、概述 从JDK5.0开始&#xff0c;Java引入泛型类型&…

ARM GIC(四) gicv3架构基础

GICv3架构是GICv2架构的升级版&#xff0c;增加了很多东西。变化在于以下&#xff1a; 使用属性层次&#xff08;affinity hierarchies&#xff09;&#xff0c;来对core进行标识&#xff0c;使gic支持更多的core 将cpu interface独立出来&#xff0c;用户可以将其设计在core…

谷歌Gemini造假始末

&#x1f4a1;大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 在过去一年中&#xff0c;OpenAI ChatGPT引发了一股AI新浪潮&#xff0c;而谷歌则一直处于被压制的状态&#xff0c;迫切需要一款现象级的AI产品来…