STM32——SPI通信

news2024/10/6 18:21:50

文章目录

    • SPI(Serial Peripheral Interface)概述:
    • SPI的硬件连接:
    • SPI的特点和优势:
    • SPI的常见应用:
    • SPI的工作方式和时序图分析:
      • 工作模式
      • 传输模式与时序分析
      • 工作流程
    • SPI设备的寄存器结构和寄存器设置
      • SPI设备寄存器结构:
      • 常见的寄存器设置:
    • STM32F4xx SPI 模块特性
    • 如何调试SPI通信问题和故障排除

SPI(Serial Peripheral Interface)概述:

SPI是一种串行通信接口,用于在微控制器、传感器、存储器等设备之间进行数据传输。
SPI通信通常涉及一个主设备(Master)和一个或多个从设备(Slave),通过共享时钟信号和数据线进行通信。

SPI的硬件连接:

SPI使用四条信号线:时钟线(SCLK)、主设备输出线(MOSI)、主设备输入线(MISO)和片选线(SS)。
通信过程中,主设备通过时钟线产生时钟信号,控制数据传输的时序。
主设备通过MOSI线发送数据,而从设备通过MISO线返回响应数据。
片选线用于选择要与主设备进行通信的从设备。
在这里插入图片描述
一主一从连接
在这里插入图片描述
一主多从连接
在这里插入图片描述

SPI的特点和优势:

SPI支持高速的全双工数据传输、只需少量的信号线和硬件引脚、SPI可以连接多个从设备,每个从设备都有独立的片选线,方便扩展和集成多个设备、SPI通常用于设备之间的短距离通信,如同一个电路板上的通信。

SPI的常见应用:

存储器接口:SPI常用于与闪存、EEPROM等存储器设备进行通信。
传感器接口:许多传感器模块使用SPI接口与主控制器通信,如加速度计、陀螺仪等。
显示器接口:某些显示模块使用SPI接口进行数据传输。
无线通信模块:一些无线模块,如WiFi模块、蓝牙模块等,可以通过SPI与主控制器通信。

SPI的工作方式和时序图分析:

工作模式

配置SPI设备的参数,如时钟频率、数据位数和传输模式。本模块代码参考博客:https://blog.51cto.com/u_15903730/6163015
主模式(Master Mode):
在主模式下,一个主设备控制整个SPI通信过程。主设备负责生成时钟信号(SCLK)和控制片选信号(SS)来选择从设备,并通过MOSI线(Master Output Slave Input)向从设备发送数据。同时,主设备通过MISO线(Master Input Slave Output)接收从设备返回的数据。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "stm32f4xx.h"

#define SPIx            SPI1
#define GPIO_AF_SPIx     GPIO_AF5_SPI1
#define GPIO_CS         GPIO_Pin_4
#define GPIO_CLK        GPIO_Pin_5
#define GPIO_MISO       GPIO_Pin_6
#define GPIO_MOSI       GPIO_Pin_7

void init_spi(void)
{
    SPI_InitTypeDef spi_init_struct;
    GPIO_InitTypeDef gpio_init_struct;

    /* Enable the SPI clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

    /* Enable the GPIO clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    /* Configure the chip select pin as output */
    gpio_init_struct.GPIO_Mode = GPIO_Mode_OUT;
    gpio_init_struct.GPIO_OType = GPIO_OType_PP;
    gpio_init_struct.GPIO_Pin = GPIO_CS;
    gpio_init_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_init_struct);

    /* Configure the SPI pins */
    gpio_init_struct.GPIO_Mode = GPIO_Mode_AF;
    gpio_init_struct.GPIO_OType = GPIO_OType_PP;
    gpio_init_struct.GPIO_Pin = GPIO_CLK | GPIO_MISO | GPIO_MOSI;
    gpio_init_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_init_struct);

    /* Connect the SPI pins to their alternate functions */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPIx);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPIx);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPIx);

    /* Configure the SPI peripheral */
    spi_init_struct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    spi_init_struct.SPI_CPHA = SPI_CPHA_1Edge;
    spi_init_struct.SPI_CPOL = SPI_CPOL_Low;
    spi_init_struct.SPI_CRCPolynomial = 7;
    spi_init_struct.SPI_DataSize = SPI_DataSize_8b;
    spi_init_struct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    spi_init_struct.SPI_FirstBit = SPI_FirstBit_MSB;
    spi_init_struct.SPI_Mode = SPI_Mode_Master;
    spi_init_struct.SPI_NSS = SPI_NSS_Soft;
    SPI_Init(SPIx, &spi_init_struct);

    /* Enable the SPI peripheral */
    SPI_Cmd(SPIx, ENABLE);
}

uint8_t spi_send_byte(uint8_t byte)
{
    /* Wait for any pending transfers to complete */
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    /* Send the byte */
    SPI_I2S_SendData(SPIx, byte);

    /* Wait for the transfer to complete */
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);

    /* Return the received byte */
    return SPI_I2S_ReceiveData(SPIx);
}

int main(void)
{
    uint8_t data;

    /* Initialize the SPI module */
    init_spi();

    /* Select the slave device */
    GPIO_ResetBits(GPIOA, GPIO_CS);

    /* Send some data */
    data = spi_send_byte(0xAA);
    printf("Received: 0x%02X\n", data);

    /* Deselect the slave device */
    GPIO_SetBits(GPIOA, GPIO_CS);

    return 0;
}

从模式(Slave Mode):
在从模式下,从设备被动地响应主设备的控制。从设备通过MISO线接收主设备发送的数据,并通过MOSI线向主设备返回数据。从设备在接收到有效的片选信号(SS)后才会响应数据传输。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "stm32f4xx.h"

#define SPIx            SPI1
#define GPIO_AF_SPIx     GPIO_AF5_SPI1
#define GPIO_CS         GPIO_Pin_4
#define GPIO_CLK        GPIO_Pin_5
#define GPIO_MISO       GPIO_Pin_6
#define GPIO_MOSI       GPIO_Pin_7

void init_spi(void)
{
    SPI_InitTypeDef spi_init_struct;
    GPIO_InitTypeDef gpio_init_struct;

    /* Enable the SPI clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

    /* Enable the GPIO clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    /* Configure the chip select pin as output */
    gpio_init_struct.GPIO_Mode = GPIO_Mode_OUT;
    gpio_init_struct.GPIO_OType = GPIO_OType_PP;
    gpio_init_struct.GPIO_Pin = GPIO_CS;
    gpio_init_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_init_struct);

    /* Configure the SPI pins */
    gpio_init_struct.GPIO_Mode = GPIO_Mode_AF;
    gpio_init_struct.GPIO_OType = GPIO_OType_PP;
    gpio_init_struct.GPIO_Pin = GPIO_CLK | GPIO_MISO | GPIO_MOSI;
    gpio_init_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_init_struct);

    /* Connect the SPI pins to their alternate functions */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPIx);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPIx);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPIx);

    /* Configure the SPI peripheral */
    spi_init_struct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    spi_init_struct.SPI_CPHA = SPI_CPHA_1Edge;
    spi_init_struct.SPI_CPOL = SPI_CPOL_Low;
    spi_init_struct.SPI_CRCPolynomial = 7;
    spi_init_struct.SPI_DataSize = SPI_DataSize_8b;
    spi_init_struct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    spi_init_struct.SPI_FirstBit = SPI_FirstBit_MSB;
    spi_init_struct.SPI_Mode = SPI_Mode_Slave;
    spi_init_struct.SPI_NSS = SPI_NSS_Hard;
    SPI_Init(SPIx, &spi_init_struct);

    /* Enable the SPI peripheral */
    SPI_Cmd(SPIx, ENABLE);
}

uint8_t spi_receive_byte(void)
{
    /* Wait for any pending transfers to complete */
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    /* Return the received byte */
    return SPI_I2S_ReceiveData(SPIx);
}

void spi_send_byte(uint8_t byte)
{
    /* Wait for any pending transfers to complete */
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    /* Send the byte */
    SPI_I2S_SendData(SPIx, byte);

    /* Wait for the transfer to complete */
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);

    /* Clear the receive buffer */
    SPI_I2S_ReceiveData(SPIx);
}

int main(void)
{
    uint8_t data;

    /* Initialize the SPI module */
    init_spi();

    /* Wait for the chip select signal */
    while (GPIO_ReadInputDataBit(GPIOA, GPIO_CS) != Bit_RESET);

    /* Loop forever */
    while (1)
    {
        /* Receive some data */
        data = spi_receive_byte();

        /* Process the data */
        printf("Received: 0x%02X\n", data);

        /* Send a response */
        spi_send_byte(0xAA);
    }

    return 0;
}

传输模式与时序分析

时钟极性和相位(Clock Polarity and Phase):
SPI接口还具有时钟极性(CPOL)和时钟相位(CPHA)的设置。CPOL定义了时钟信号在空闲状态时的电平,可以是高电平(CPOL=1)或低电平(CPOL=0)。CPHA定义了数据采样的时机,可以是在时钟信号的上升沿(CPHA=0)或下降沿(CPHA=1)进行采样。
根据CPOL和CPHA的不同组合,可以有四种不同的时钟极性和相位模式,分别为:

模式0:CPOL=0,CPHA=0
模式1:CPOL=0,CPHA=1
模式2:CPOL=1,CPHA=0
模式3:CPOL=1,CPHA=1

时钟极性和相位的设置需要主设备和从设备之间保持一致,以确保正确的数据传输。SPI 总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是 SPI0 和和 SPI3 方式

读取数据方式:
00 起始电平为低电平—>数据采样(读数据)在第一个边沿,时钟线从低到高跳变的时候,数据线保持不变,这时候读数据,时钟线从高到底跳变的时候,数据线可以变化,发送数据,所以上升沿读,下降沿写

01 起始电平为低电平—>数据采样(读数据)在第二个边沿,时钟线从低到高跳变的时候,数据线可以变化,发送数据,时钟线从高到底跳变的时候,数据线保持不变,这时候读数据,所以上升沿写,下降沿读

10 起始电平是高点平—>数据采样(读数据)在第一个边沿,时钟线从高到低跳变的时候,数据线保持不变,这时候读数据,时钟线从低到高跳变的时候,数据线可以变化,发送数据,所以,下降沿读,上升沿写

11 起始电平是高点平—>数据采样(读数据)在第二个边沿,时钟线从高到低跳变的时候,数据线可以变化,发送数据,时钟线从低到高跳变的时候,数据线保持不变,这时候读数据,所以,下降沿写,上升沿读
在这里插入图片描述
每次传输数据的宽度为 8bit,上升沿发送、下降沿接收、高位先发送。
上升沿到来的时候,MOSI 上的电平将被发送到从设备的寄存器中。
下降沿到来的时候,MISO 上的电平将被接收到主设备的寄存器中。

在这里插入图片描述

工作流程

  1. SPI通信工作流程
    1)硬件连接:
    首先,确保SPI主机(如微控制器)和SPI从机(外部设备)之间正确连接。通常,SPI通信需要四根线:SCLK(时钟线)、MOSI(主机输出从机输入线)、MISO(主机输入从机输出线)和SS(从机选择线)。
    2)主机配置:
    主机(如微控制器)需要配置SPI控制器的相关寄存器或寄存器位,以设置通信参数,如时钟速率、数据位顺序、数据传输模式等。
    3)选择从机:
    主机通过设置SS线(从机选择线)来选择要与之通信的从机。如果有多个从机连接到同一总线,主机需要选择其中一个从机与之通信,常通过将SS线拉低来选中对应的从机。
    4)数据传输:
    SPI通信是全双工的,数据可以同时在主机和从机之间传输。
    主机通过SCLK线发送时钟信号,驱动数据传输的时序。主机在每个时钟周期的上升沿或下降沿将数据位推送到MOSI线上,发送给从机。从机在相应的时钟边沿读取MOSI线上的数据位,并将响应的数据位推送到MISO线上,供主机读取。数据传输可以按照指定的字节、位数或连续传输的方式进行。
    5)传输完成:
    传输完成后,可以继续进行下一次传输或者释放SPI总线。

SPI设备的寄存器结构和寄存器设置

SPI设备寄存器结构:

控制寄存器(Control Register):控制SPI设备的操作模式、时钟频率、数据位顺序等设置。
状态寄存器(Status Register):提供SPI设备的状态信息,如传输完成标志、错误标志等。
数据寄存器(Data Register):用于存储要发送或接收的数据。

常见的寄存器设置:

操作模式(Mode):SPI设备通常支持多种操作模式,如主模式(Master Mode)和从模式(Slave Mode)。通过控制寄存器的相关位,选择适当的模式。
时钟频率(Clock Frequency):SPI设备的通信速率由时钟频率决定。控制寄存器中的时钟分频位或配置寄存器可以用于设置合适的时钟频率。
时钟极性和相位(Clock Polarity and Phase):SPI设备的时钟极性(CPOL)和时钟相位(CPHA)设置决定了数据采样和传输的时机。通过控制寄存器的相关位设置CPOL和CPHA。
数据位顺序(Data Bit Order):SPI设备可以支持先传输最高有效位(MSB)或先传输最低有效位(LSB)。寄存器中的位序设置可以用于选择合适的数据位顺序。
中断使能(Interrupt Enable):SPI设备通常支持中断功能,用于通知主设备有数据可用或传输完成。中断使能位可以在控制寄存器中设置。
具体参考技术文档、参考文档、数据手册来确定产品的使用。

STM32F4xx SPI 模块特性

1) 由 SPI 模块中 SCLK、MOSI 和 MISO 三线组成全双工同步传输
2) 支持数据传输位宽为 8 位数据或 16 位数据
3) 可以通过软件设置 SPI 模块为主机模式或从机模式
4) 可以对 SPI 的时钟源进行分频,来做为作为主机或从机时的通讯速度(分频最大值为 fPCLK/2),但 STM32F401xE 的 SPI 模块最大通信速度为 42MHz (spi1,spi4)或者 21Mhz(spi2,spi3)。
5) 可以使用软件对 SPI 的通讯时序(时钟极性和时钟相位)进行选择
6) 可以对 SPI 数据传输顺序进行选择为最先移位 MSB 或 LSB
7) SPI 模块的中断源为:SPI 数据发送和接收、主模式故障、数据上溢(过载)以及 CRC 错误
8) SPI 可以利用 DMA 功能对数据进行每次 1 字节发送和接收。
在这里插入图片描述

如何调试SPI通信问题和故障排除

掌握常见的SPI通信错误和解决方法,如时钟频率不匹配、数据线连接错误等。
1.串口显示内容但是乱码:时钟频率两端不匹配,重新调频率
2.无现象或者本来有现象后来突然中断通信:数据线是否连接错误,附近是否有信号干扰,检查电源线是否未连接好
3.冲突和协议错误:和板子的协议不匹配,先查看协议,检查硬件连接是否正确,确保SPI主设备和从设备之间的通信协议和数据格式设置正确。检查SPI设备的地址、片选信号等设置是否正确。确保主设备和从设备之间的通信时序和协议一致。检查设备的文档和规格说明,确保了解正确的配置和操作方法。

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

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

相关文章

Linux下使用lookbusy加载cpu负载

Lookbusy 是一个用于在 Linux 系统上生成合成负载的简单应用程序。它可以在 CPU 上生成固定的、可预测的负载&#xff0c;保持选定数量的内存处于活动状态&#xff0c;并生成您需要的任意数量的磁盘流量。 官方地址&#xff1a;lookbusy -- a synthetic load generator 编译 …

IEEE-CDC文章格式版本设置(审稿/提交)格式变更

IEEE-CDC文章格式版本设置&#xff08;审稿/提交&#xff09;格式变更 在IEEE-CDC的提交过程中&#xff0c;由于使用了IEEE的latex文章模板&#xff0c;final version提交之后出现了格式不正确的问题&#xff1a; 如图是官网pdf check检测得到的结果&#xff0c;可以看到&…

MyBatis-Plus数据表操作条件构造器Wrapper

一、Wapper分类 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &#xff1a; Entity 对象封装操作类&#xff0c;不是用lambda语法 UpdateWrapper &#xff1a;…

MATLAB画三维曲面(surf,mesh)以及不规则meshgrid

MATLAB画三维曲面以及不规则meshgrid 1. 引言2. MATLAB中的surf&#xff0c;mesh函数3. 案例3.1 绘图3.2 美化3.3 完整代码3.4 高阶图&#xff08;不规则meshgrid&#xff0c;非矩形meshgrid&#xff09; 1. 引言 2. MATLAB中的surf&#xff0c;mesh函数 fmincon是MATLAB中用…

vue中的计算属性computed

计算属性 概念&#xff1a;基于现有的数据&#xff0c;计算出来的新属性。依赖的数据变化&#xff0c;自动重新计算。 语法: 声明在computed配置项中&#xff0c;一个计算属性对应一个函数 使用起来和普通属性一样使用 {{计算属性名}} <!DOCTYPE html> <html l…

14 道关于计算机网络的面试题,助你查漏补缺

最近在整理计算机网络的时候发现遇到了很多面试中常见的面试题&#xff0c;本部分主要原作者在 Github 等各大论坛收录的计算机网络相关知识和一些相关面试题时所做的笔记&#xff0c;分享这份总结给大家&#xff0c;对大家对计算机网络的可以来一次全方位的检漏和排查&#xf…

美陆军推动人工智能算法的持续更新

源自&#xff1a;蓝德智库 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff0c;如转载稿涉及版权等问题&#xff0c;请立即联系我们删除。 “人工智能技术与咨询”…

SpringMVC之JSR303与拦截器

一.JSR303 1.什么是JSR303 JSR是Java Specification Requests的缩写&#xff0c;意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR&#xff0c;以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标…

趣解设计模式之《怀念小时候玩的红白机嘛?》

〇、小故事 不知道大家小时候都有什么难忘的经历。作为80后的我来说&#xff0c;小时候印象最深的就是任天堂生产的FC游戏机&#xff08;俗称“红白机”&#xff09;&#xff0c;当时在家和小伙伴一起玩《魂斗罗》、《超级马里奥》、《冒险岛》、《坦克大战》等等游戏&#xf…

成果喜人 增速稳健丨Fortinet 谢青谈行业发展趋势与企业强劲增长驱动力

引言 随着时间进入到2023年第三季度末&#xff0c;Gartner、Forrester、ESG等全球权威咨询机构已相继发布Universal ZTNA、ZTE、OT安全等相关研究报告&#xff0c;2023年网络安全行业趋势渐趋明朗。同时&#xff0c;在这些相关报告中&#xff0c;作为创立二十余载&#xff0c;始…

leetcode 132. 分割回文串 II

2023.9.12 dp算法经典题之回文子串&#xff0c;先联想到 回文子串。 先用传统回文子串的dp方法定义一个二维数组存储该字符串的各子串是否为回文子串。 再定义一个一维dp数组用于存储下标0~i的最小分割次数。 初始化&#xff1a;先将该dp数组初始化为最坏情况&#xff0c;即下…

小米汽车进入生产调试冲刺阶段,雷军率队完成夏季新车路测

小米汽车通州生产基地即将进入生产调试冲刺阶段&#xff0c;小米集团董事长雷军率领小米汽车高层最近已经在新疆完成夏季新车路测&#xff0c;以争取在获得相关批文后尽快进入新车量产。 小米汽车的整个基地包括六个车间&#xff1a;压铸、冲压、车身、涂装、总装和电池。小米汽…

SpringBoot整合SSM-junit测试

前提 &#xff1a;创建一个新的springboot模块 创建一个员工案例(搭建) 创建员工实体类创建员工的控制层创建员工的服务层&#xff08;接口–实现类&#xff09;创建员工的数据层&#xff08;接口–实现类&#xff09; 以上的4种文件 是使用SSM必备的文件 创建员工实体类 属性…

vue3 element plus表格导出为excel自定义表头

新建一个out_excel.js文件并调用 import * as XLSX from "xlsx";export const exportToExcel (tableData, tableName, sheetName, fileName) > {const ws XLSX.utils.aoa_to_sheet([...[tableName], ...tableData]); // tableName为表头&#xff0c;tableData为…

【python自动化】Playwright基础教程定位操作

上文我们已经能够成功进行登录操作了。对于里面的一些定位方式&#xff0c;输入&#xff0c;点击等操作&#xff0c;在这一节&#xff0c;我们直接进行一个大汇总。以后遇到直接来这里搜。 定位操作 定位操作都在Page类下。养成看源码的习惯&#xff0c;结合官方文档&#xf…

这场科技巨变,有生之年有希望

见到一文&#xff0c;遂分享欲爆棚&#xff0c;总结如下。 具有人类水平的人工智能大约什么时候可以出现&#xff1f; 人类水平的人工智能&#xff0c;指的是&#xff0c;不需要借助人类&#xff0c;机器能够比人类更好地完成每项任务。 针对这个问题&#xff0c;有家机构在201…

Redis高效、安全的不停机数据迁移方案

Redis是目前最流行的键值对存储数据库&#xff0c;凭借高性能和丰富的数据类型的特性&#xff0c;不仅可以作为缓存&#xff0c;还可以作为一个可持久化的数据库存储。随着业务的发展和版本的迭代&#xff0c;必然会遇到内存不足、集群节点不够和BUG等一系列问题。为了防止这些…

四川百幕晟科技有限公司:抖音名称最多多少字?

在抖音上&#xff0c;用户可以为其帐户选择昵称&#xff0c;该昵称显示在用户的个人资料中。不过&#xff0c;很多人好奇&#xff0c;一个抖音昵称到底能有多少个字&#xff1f;本文将深入探讨抖音昵称长度限制以及一些最吸引人的昵称示例。 1、抖音昵称长度限制 抖音昵称的长度…

经典逝去,三方确认:iPhone15系列取消静音拨片,改用Action按钮

苹果公司将在9月13日凌晨1点举办秋季特别活动&#xff0c;这次活动将推出许多新产品&#xff0c;其中之一备受关注的是iPhone 15系列。在数月前&#xff0c;关于iPhone 15系列机型的消息早已传出&#xff0c;而最值得一提的变化就是取消自2007年初代iPhone发布以来一直存在的静…

【大数据环境安装】虚拟机安装操作

虚拟机安装操作 创建虚拟机 添加linux的iso镜像文件 开启虚拟机, 进行安装 正在校验, 可直接选择esc退出, 或者等待一会也是OK的 直到出现以下界面,开始选择语言: 结束后 , 点击重启, 然后进入系统, 到此, 虚拟机搭建工作结束 登录, 进入系统