AVR 328pb串口基本介绍和使用

AVR 328pb串口基本介绍和使用


  • 📍相关篇《AVR 328pb定时器0基本介绍和使用》

  • 🔖基于Atmel Studio 7.0开发环境。

  • 📍结合参考同架构lgt8f328p中文文档:http://www.prodesign.com.cn/wp-content/uploads/2023/03/LGT8FX8P_databook_v1.0.4.pdf

  • 🪓工作模式下计算波特率(位/秒)以及UBRR值的公式。
    在这里插入图片描述

波特率设置及引入误差

对于标准晶振及谐振器频率来说,异步模式下的实际通信的波特率可通过波特率计算公式来
获得,它与常用通信波特率之间的误差可用如下公式来计算:

Error[%] = (Baudreal/Baud – 1)*100%

其中,Baud为常用的通信波特率,Baudreal为通过计算公式算出来的波特率,带入波特率计
算公式即可得到波特率误差与系统时钟fsys和波特率寄存器UBRR值之间的关系如下:

普通模式:

Error[%] = (fsys/(16*(UBRR+1))/Baud – 1)*100% 

倍速模式:

Error[%] = (fsys/(8*(UBRR+1))/Baud – 1)*100% 
  • 📄不同频率和波特率配置误差表:
    在这里插入图片描述

在这里插入图片描述

  • 当不考虑通信两边的时钟误差,即系统时钟 fsys为标准时钟时,即可得到波特率误差 UBRR值之间的关系。下表即为16MHz系统时钟下不同UBRR值设置下的波特率误差。
    在这里插入图片描述

📗串口相关寄存器定义

  • UCSRA – USART 控制和状态寄存器A
    在这里插入图片描述
    在这里插入图片描述

  • UCSRB – USART控制和状态寄存器B
    在这里插入图片描述
    在这里插入图片描述

  • UCSRC– USART控制和状态寄存器C
    在这里插入图片描述
    在这里插入图片描述

  • 🌿UBRR寄存器(包含:UBRRnHUBRRnL
    在这里插入图片描述

    • UBRRnL – USART波特率寄存器低字节
      在这里插入图片描述
    • UBRRnH – USART波特率寄存器高字节
      在这里插入图片描述
      在这里插入图片描述
  • UDR – USART 数据寄存器
    在这里插入图片描述

  • 🌿串口参数代码具体配置:(基于Atmel Studio GCC C Executable Project裸机开发模式)

#define BAUD 9600
#define F_CPU 16000000UL
#define MYUBRR (F_CPU/16/BAUD-1)

// 串口初始化
void USART0_Init(void)
{
    UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (0<<U2X0) | (0<<MPCM0);
    /*Enable receiver and transmitter */
    UCSR0B=(1<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
    /* Set frame format: 8data, 1stop bit */
    UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
   /*Set baud rate */
    UBRR0H = (unsigned char)(MYUBRR>>8);
    UBRR0L = (unsigned char)MYUBRR;
       stdout = &mystdout;//输出流配置

    // Ensure that the USART0 is enabled
    PRR0&= ~(1<<PRUSART0);


// Globally enable interrupts
    sei();

}
  • 🔖如果波特率倍频(X2):
#define BAUD 9600
#define F_CPU 16000000UL
#define MYUBRR (F_CPU/8/BAUD-1)

// 串口初始化
void USART0_Init(void)
{
// USART0 Baud Rate: 9600 (Double Speed Mode)
    UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (1<<U2X0) | (0<<MPCM0);
    /*Enable receiver and transmitter */
    UCSR0B=(1<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
    /* Set frame format: 8data, 1stop bit */
    UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
    
   /*Set baud rate */
    UBRR0H = (unsigned char)(MYUBRR>>8);
    UBRR0L = (unsigned char)MYUBRR;
       stdout = &mystdout;//输出流配置

    // Ensure that the USART0 is enabled
    PRR0&= ~(1<<PRUSART0);


// Globally enable interrupts
    sei();

}
  • 🌿串口0数据发送函数:
void USART_Transmit( unsigned char data )
 {
   /* Wait for empty transmit buffer */
   while ( !( UCSR0A & (1<<UDRE0)) )
      ;
   /* Put data into buffer, sends the data */
   UDR0 = data;
 }
  • 🌿串口0数据接收函数:
unsigned char USART_Receive( void )
 {
   /* Wait for data to be received */
   while ( !(UCSR0A & (1<<RXC0)) )
      ;
   /* Get and return received data from buffer */
   return UDR0;
 }

🔧printf打印配置内容

  • (基于Atmel Studio GCC C Executable Project裸机开发模式)
#include "util/setbaud.h"
#include "avr/sfr_defs.h"//包含loop_until_bit_is_set函数
// Standard Input/Output functions
#include <stdio.h>
// 配置输出流
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
                       _FDEV_SETUP_WRITE);
//static FILE USART0_stream = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_RW);//

static int	uart_putchar(char c, FILE *stream)
{

//   if (c == '\n')
//       uart_putchar('\r', stream);
//   loop_until_bit_is_set(UCSR0A, UDRE0);//需包含:avr/sfr_defs.h
    // /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE0)) );
    UDR0 = c;
    return 0;
}

📘串口0中断接收和printf打印例程

  • 🔖(基于Atmel Studio GCC C Executable Project裸机开发模式)
/*
 * USART0_TEST1.c
 *
 * Created: 2024/2/2 12:34:43
 * Author : Administrator
 */

#include <avr/io.h>
#include "avr/interrupt.h"
#define BAUD 9600
#define F_CPU 16000000UL
#define MYUBRR F_CPU/16/BAUD-1
#include "util/setbaud.h"
#include "avr/sfr_defs.h"//包含loop_until_bit_is_set函数
// Standard Input/Output functions
#include <stdio.h>
//#include <stdlib.h>
#include "util/delay.h"
#include "string.h"

#define DATA_REGISTER_EMPTY (1<<UDRE0)
#define RX_COMPLETE (1<<RXC0)
#define FRAMING_ERROR (1<<FE0)
#define PARITY_ERROR (1<<UPE0)
#define DATA_OVERRUN (1<<DOR0)
// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 16
char rx_buffer0[RX_BUFFER_SIZE0];
volatile unsigned char Rx_flag=0;


#if RX_BUFFER_SIZE0 < 256
volatile unsigned char rx_counter0=0;
#else
volatile unsigned int rx_counter0=0;
#endif

// This flag is set on USART0 Receiver buffer overflow
char rx_buffer_overflow0;
static int uart_putchar(char c, FILE *stream);
//static char uart_getchar(char c, FILE *stream);

// 配置输入输出流
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
                       _FDEV_SETUP_WRITE);
//static FILE USART0_stream = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_RW);//

static int	uart_putchar(char c, FILE *stream)
{

//   if (c == '\n')
//       uart_putchar('\r', stream);
//   loop_until_bit_is_set(UCSR0A, UDRE0);//需包含:avr/sfr_defs.h
    // /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE0)) );
    UDR0 = c;
    return 0;
}
/*
static int uart_getchar(char c, FILE *stream)
{
    char data;
	 // Wait for data to be received
	 while ( !(UCSR0A & (1<<RXC0)) )
	data = UDR0;

    return UDR0;

}
*/


// USART0 Receiver interrupt service routine串口0接收中断
ISR(USART0_RX_vect)
{
    static volatile unsigned char status;
    volatile char data;
    status = UCSR0A;
    data = UDR0;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
        rx_buffer0[rx_counter0++]=data;
        if (rx_counter0 > 0&&(rx_buffer0[rx_counter0]==0))
        {
            //  rx_counter0=0;
            rx_buffer_overflow0=1;
        }

    }

}



// 串口初始化
void USART0_Init(void)
{
// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 9600
    cli();//关中断
    UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (0<<U2X0) | (0<<MPCM0);
    /*Enable receiver and transmitter */
    UCSR0B=(1<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
    /* Set frame format: 8data, 1stop bit */
    UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
    /*Set baud rate */
//    UBRR0H=0x00;
//    UBRR0L=0x67;//9600
    UBRR0H = (unsigned char)(MYUBRR>>8);
    UBRR0L = (unsigned char)MYUBRR;

// Ensure that the USART0 is enabled
    PRR0&= ~(1<<PRUSART0);

    stdout = &mystdout;


// Globally enable interrupts
    sei();

}



int main(void)
{
    /* Replace with your application code */
    CLKPR=(1<<CLKPCE);
    CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
    DDRB = PINB5;//配置PB5为输出模式
    USART0_Init();
    printf("Hello World!\r\n");
    while (1)
    {

        if (rx_buffer_overflow0)
        {
            rx_counter0 =0;
            rx_buffer_overflow0 =0;
            printf("%s\r\n",rx_buffer0);
            memset(rx_buffer0,0,sizeof(rx_buffer0));
        }

        PORTB ^= (1 << PINB5);//PB5状态翻转
        _delay_ms(1000);

    }
}




  • 🎬串口测试效果:
    在这里插入图片描述

🔰Atmel Studio Atmel Start Project开发模式工程

✨如果基于Atmel Start Project创建对应的串口外设工程,那么开发方式如同STM32使用STM32CubeMX来配置工程并开发,相对于使用纯裸机自行配置寄存器开发方式要简单易上手一些。不需要掌握具体外设对应的寄存器如何配置信息。

🛠配置流程
  • 创建Atmel Start Project创建工程。
  • 选择对应的开发芯片型号。
  • 添加对应的外设:
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 串口初始化函数:USART_0_initialization();
/* configure pins and initialize registers */
void USART_0_initialization(void)
{

	// Set pin direction to input
	PD0_set_dir(PORT_DIR_IN);

	PD0_set_pull_mode(
	    // <y> Pull configuration
	    // <id> pad_pull_config
	    // <PORT_PULL_OFF"> Off
	    // <PORT_PULL_UP"> Pull-up
	    PORT_PULL_OFF);

	// Set pin direction to output
	PD1_set_dir(PORT_DIR_OUT);

	PD1_set_level(
	    // <y> Initial level
	    // <id> pad_initial_level
	    // <false"> Low
	    // <true"> High
	    false);

	USART_0_init();
}
/**
 * \brief Initialize USART interface
 * If module is configured to disabled state, the clock to the USART is disabled
 * if this is supported by the device's clock system.
 *
 * \return Initialization status.
 * \retval 0 the USART init was successful
 * \retval 1 the USART init was not successful
 */
int8_t USART_0_init()
{

	// Module is in UART mode

	/* Enable USART0 */
	PRR0 &= ~(1 << PRUSART0);

#define BAUD 115200

#include <utils/setbaud.h>

	UBRR0H = UBRRH_VALUE;
	UBRR0L = UBRRL_VALUE;

	UCSR0A = USE_2X << U2X0 /*  */
	         | 0 << MPCM0;  /* Multi-processor Communication Mode: disabled */

	UCSR0B = 1 << RXCIE0    /* RX Complete Interrupt Enable: enabled */
	         | 0 << TXCIE0  /* TX Complete Interrupt Enable: disabled */
	         | 0 << UDRIE0  /* USART Data Register Empty Interupt Enable: disabled */
	         | 1 << RXEN0   /* Receiver Enable: enabled */
	         | 1 << TXEN0   /* Transmitter Enable: enabled */
	         | 0 << UCSZ02; /*  */

	// UCSR0C = (0 << UMSEL01) | (0 << UMSEL00) /*  */
	//		 | (0 << UPM01) | (0 << UPM00) /* Disabled */
	//		 | 0 << USBS0 /* USART Stop Bit Select: disabled */
	//		 | (1 << UCSZ01) | (1 << UCSZ00); /* 8-bit */

	// UCSR0D = 0 << RXSIE /* USART RX Start Interrupt Enable: disabled */
	//		 | 0 << SFDE; /* Start Frame Detection Enable: disabled */

#if defined(__GNUC__)
	stdout = &USART_0_stream;
#endif

	return 0;
}
  • 👉通过Atmel Start Project创建的工程,配置的所有外设初始化都在atmel_start_init();函数中被一起初始化。
  • 测试代码:
#include <atmel_start.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include "string.h"

volatile uint16_t timer_overflow_count = 0;
#define DATA_REGISTER_EMPTY (1<<UDRE0)
#define RX_COMPLETE (1<<RXC0)
#define FRAMING_ERROR (1<<FE0)
#define PARITY_ERROR (1<<UPE0)
#define DATA_OVERRUN (1<<DOR0)
// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 16
char rx_buffer0[RX_BUFFER_SIZE0];
volatile unsigned char Rx_flag=0;
#if RX_BUFFER_SIZE0 < 256
volatile unsigned char rx_counter0=0;
#else
volatile unsigned int rx_counter0=0;
#endif

// This flag is set on USART0 Receiver buffer overflow
char rx_buffer_overflow0;
// USART0 Receiver interrupt service routine
ISR(USART0_RX_vect)
{
    static volatile unsigned char status;
    volatile char data;
    status = UCSR0A;
    data = UDR0;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
        rx_buffer0[rx_counter0++]=data;
        /*
        #if RX_BUFFER_SIZE0 == 256
        // special case for receiver buffer size=256
        if (++rx_counter0 == 0) rx_buffer_overflow0=1;
        #else
        */
//        if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
        if (rx_counter0 > 0&&(rx_buffer0[rx_counter0]==0))
        {
            //  rx_counter0=0;
            rx_buffer_overflow0=1;
        }

//#endif
    }

}


void delay_ms(uint16_t milliseconds)
{
    while (milliseconds > 0)
    {
        _delay_ms(1); // 使用util/delay.h中的宏函数来实现1毫秒的延时
        milliseconds--;
    }
}

int main(void)
{
    /* Initializes MCU, drivers and middleware */
    atmel_start_init();

    /* Replace with your application code */
    while (1)
    {

        LED_set_level(false);
        //delay_ms_timer(1000);
        delay_ms(1000);
        LED_set_level(true);
        delay_ms(1000);
        //	delay_ms_timer(1000);
        printf("Hello AVR Studio\r\n");
        /*查看gcc版本信息*/
#ifdef __GNUC__
        printf("__GNUC__ = %d\n",__GNUC__);
#endif
#ifdef __GNUC_MINOR__
        printf("__GNUC_MINOR__ = %d\n",__GNUC_MINOR__);
#endif
#ifdef __GNUC_PATCHLEVEL__
        printf("__GNUC_PATCHLEVEL__ == %d\n",__GNUC_PATCHLEVEL__);
#endif
    }
    if (rx_buffer_overflow0)//打印接收到的数据
    {
        rx_counter0 =0;
        rx_buffer_overflow0 =0;
        printf("%s\r\n",rx_buffer0);
        memset(rx_buffer0,0,sizeof(rx_buffer0));
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

北朝隋唐文物展亮相广西,文物预防性保护网关保驾护航

一、霸府名都——太原博物馆收藏北朝隋朝文物展 2月1日&#xff0c;广西民族博物馆与太原博物馆携手&#xff0c;盛大开启“霸府名都——太原博物馆北朝隋文物展”。此次新春展览精选了北朝隋唐时期150多件晋阳文物珍品。依据“巍巍雄镇”“惊世古冢”“锦绣名都”三个单元&am…

多线程编程6——使用 volatile 解决问题可见性问题

一、内存可见性问题 内存可见性问题是出现线程安全问题的原因之一。 1、什么是内存可见性问题&#xff1f; 一个线程针对一个变量进行读取操作&#xff0c;另一个线程针对这个变量进行修改操作&#xff0c;此时读到的值不一定是修改后的值&#xff0c;出现了线程安全问题&a…

学习Android的第三天

目录 Android LinearLayout 线性布局 XML 属性 LinearLayout 几个重要的 XML 属性 LinearLayout.LayoutParams XML 属性 divider (分割线) Android RelativeLayout 相对布局 RelativeLayout 布局属性 TableLayout ( 表格布局 ) TableRow 子控件的主要属性 Android Lin…

爬虫入门到精通_基础篇4(BeautifulSoup库_解析库,基本使用,标签选择器,标准选择器,CSS选择器)

1 Beautiful说明 BeautifulSoup库是灵活又方便的网页解析库&#xff0c;处理高效&#xff0c;支持多种解析器。利用它不用编写正则表达式即可方便地实线网页信息的提取。 安装 pip3 install beautifulsoup4解析库 解析器使用方法优势劣势Python标准库BeautifulSoup(markup,…

ADB的配置和使用及刷机root

ADB的配置和使用 ADB即Android Debug Bridge&#xff0c;安卓调试桥&#xff0c;是谷歌为安卓开发者提供的开发工具之一&#xff0c;可以让你的电脑以指令窗口的方式控制手机。可以在安卓开发者网页中的 SDK 平台工具页面下直接下载对应系统的 adb 配置文件&#xff0c;大小只…

05、全文检索 -- Solr -- Solr 全文检索之图形界面的文档管理(文档的添加、删除,如何通过关键字等参数查询文档)

目录 Solr 全文检索之文档管理添加文档使用 JSON 添加文档&#xff1a;使用 XML 添加文档: 删除文档使用 JSON 删除文档&#xff1a;使用 XML 删除文档&#xff1a; 查询文档查询文档的详细参数fq&#xff08;Filter Query&#xff09;&#xff1a;过滤sort&#xff1a;排序sta…

LangGPT-人人都可以写高质量的prompt

使用 LangGPT&#xff0c;可以在几分钟内轻松上手大模型指令编写。 网址&#xff1a;https://github.com/EmbraceAGI/LangGPT/tree/main 手册&#xff1a;⭐LangGPT 结构化提示词 模版 # Role: 角色名## Profile - Author: 西堂 - Version: 0.1 - Language: 中文 - Descripti…

RocketMQ问题篇02 | Broker存储过慢异常分析

RocketMQ问题篇01 | Broker存储过慢异常分析 1、问题描述2、磁盘IO分析&#xff08;排除硬件问题&#xff09;3、刷盘源码分析&#xff08;排除刷盘逻辑&#xff09;4、macloud的告警源代码分析&#xff08;定位至pageCache有问题&#xff09;5、操作系统排查&#xff08;排除m…

使用apifox创建一个Mock Server Api 接口

安装 下载 Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能&#xff0c;接口开发、测试、联调效率&#xff0c;提升 10 倍。最好用的接口文档管理工具&#xff0c;接口自动化测试工具。 创建mock api项目中使用 创建项…

vio参数文件内相机imu参数的修改

imu标定工具 https://github.com/mintar/imu_utils网络上有各种IMU校准工具和校准教程&#xff0c;曾经花费了巨大精力跟着各种教程去跑校准。 然而&#xff0c;标定使用的数据都是在静止状态下录制的&#xff0c;我们在使用vio或者imu-cam联合标定的时候&#xff0c;imu确是处…

短剧小程序开发:打造高效、便捷的娱乐体验

随着移动互联网的普及和用户需求的多样化&#xff0c;短剧小程序作为一种新型的应用形态&#xff0c;逐渐受到了广大用户的青睐。短剧小程序开发旨在为用户提供一种高效、便捷的娱乐体验&#xff0c;让用户在忙碌的生活中轻松享受到精彩的短剧内容。本文将探讨短剧小程序开发的…

备战蓝桥杯---搜索(BFS基础1)

如果DFS是时光回溯&#xff0c;那么BFS则是影子分身。 下面是它的定义&#xff1a; 下面直接看题&#xff1a; 十分经典&#xff0c;在这注意存的时候可以用i*mj的形式&#xff0c;可以当作模板&#xff0c;下面是AC代码&#xff1a; #include<bits/stdc.h> using name…

卡诺图:逻辑相邻与几何相邻的统一

文章目录 1.一句话记住卡诺图2.卡诺图的由来、定义和特点3.填写卡诺图&#xff08;用卡诺图表示逻辑函数&#xff09;⑴根据真值表填写卡诺图⑵根据最小项&#xff08;或最大项&#xff09;填写卡诺图⑶根据函数的与或表达式填写卡诺图 4.用卡诺图化简逻辑函数⑴化简步骤⑵画圈…

c#的反汇编对抗

文章目录 前记nim攻防基础FFI内存加载加解密、编码 后记C#类型转换表nim基础 前记 随便编写一个c#调用winapi并用vs生成dll,同时用csc生成exe using System; using System.Runtime.InteropServices; namespace coleak {class winfun{[DllImport("User32.dll")]publ…

AutoCAD .NET 层次结构介绍

AutoCAD .NET API 提供了一种面向对象的编程接口&#xff0c;通过它可以与AutoCAD进行深度集成和自定义功能开发。以下是基于.NET框架下AutoCAD对象层次结构的基本介绍&#xff1a; Autodesk.AutoCAD.ApplicationServices 命名空间 根对象&#xff0c;代表运行中的AutoCAD应用程…

模板简要介绍,C++读书笔记

2014年2月3日 内容整理自《程序设计教程&#xff1a; 用C语言编程 第三版》 陈家骏 郑滔 --------------------------------------------------------------------------------------------------------------------------------- &#xff08;一&#xff09;函数模板 1…

苹果的ipad可能会缓存vue项目的数据或者pinia数据

如果你发现开发的vue项目在ipad上出现了异常&#xff0c;比如数据出现NaN的情况&#xff0c;或者computed计算属性没生效&#xff0c;或者pinia里面的数据没生效&#xff0c;可能就是ipad浏览器safari缓存了数据导致的&#xff0c;只需要清空safari里面缓存的数据就可以了&…

(java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~

目录 冒泡排序(BubbleSort)&#xff1a; 代码详解&#xff1a; 冒泡排序的优化&#xff1a; 选择排序(SelectSort)&#xff1a; 代码详解&#xff1a; 插入排序&#xff08;InsertSort&#xff09;&#xff1a; 代码详解&#xff1a; 希尔排序(ShellSort)&#xff1a; 法一…

深度学习图像分类相关概念简析+个人举例1(ANN相关概念与计算)

&#xff08;1&#xff09;神经网络&#xff1a;英文全称Artificial Neural Network&#xff0c;简称为ANN。 神经网络是一种模仿人脑神经元结构和功能的人工智能模型。它由多个神经元&#xff08;也称节点、单元&#xff09;组成&#xff0c;每个神经元通过计算输入和权重的线…

从零开始复现GPT2(六):生成代码的实现

源码地址&#xff1a;https://gitee.com/guojialiang2023/gpt2 GPT2 模型文本生成配置生成框架文本生成类实现文本生成代码 模型 文本生成 配置 class GenerateConfig(object):def __init__(self,seq_len: int,nucleus_prob: float,use_gpu: bool):self.seq_len seq_lenself…