使用以下结构体的具体原理需要参考LTDC-DMA2D液晶显示(一)

一、LTDC初始化结构体

typedef struct
{uint32_t LTDC_HSPolarity;        	//配置行同步信号HSYNC的极性          uint32_t LTDC_VSPolarity;        	//配置垂直同步信号VSYNC的极性           uint32_t LTDC_DEPolarity;        	//配置数据使能信号DE的极性       uint32_t LTDC_PCPolarity;        	//配置像素时钟信号CLK的极性 uint32_t LTDC_HorizontalSync;    	//配置行同步信号HSYNC的宽度(HSW-1)  uint32_t LTDC_VerticalSync;      	//配置垂直同步信号VSYNC的宽度(VSW-1)        uint32_t LTDC_AccumulatedHBP;    	//配置(HSW+HBP-1)的值  uint32_t LTDC_AccumulatedVBP;    	//配置(VSW+VBP-1)的值  uint32_t LTDC_AccumulatedActiveW; //配置(HSW+HBP+有效宽度-1)的值   uint32_t LTDC_AccumulatedActiveH; //配置(VSW+VBP+有效高度-1)的值     uint32_t LTDC_TotalWidth;     	//配置(HSW+HBP+有效宽度+HFP-1)的值uint32_t LTDC_TotalHeigh;     	//配置(VSW+VBP+有效高度+HFP-1)的值     uint32_t LTDC_BackgroundRedValue; //配置红色背景值      uint32_t LTDC_BackgroundGreenValue; //配置绿色背景值   uint32_t LTDC_BackgroundBlueValue; //配置蓝色背景值  
} LTDC_InitTypeDef;
  • LTDC_HSPolarity

    本成员用于设置行同步信号HSYNC的极性,即HSYNC有效时的电平,该成员的值可设置为高电平(LTDC_HSPolarity_AH)或低电平(LTDC_HSPolarity_AL)。

  • LTDC_VSPolarity

    本成员用于设置垂直同步信号VSYNC的极性,可设置为高电平(LTDC_VSPolarity_AH)或低电平(LTDC_VSPolarity_AL)。

  • LTDC_DEPolarity

    本成员用于设置数据使能信号DE的极性,可设置为高电平(LTDC_DEPolarity_AH)或低电平(LTDC_DEPolarity_AL)。

  • LTDC_PCPolarity

    本成员用于设置像素时钟信号CLK的极性,可设置为上升沿(LTDC_PCPolarity_IPC)或下降沿(LTDC_PCPolarity_IIPC),表示RGB数据信号在CLK的哪个时刻被采集。

  • LTDC_HorizontalSync

    本成员设置行同步信号HSYNC的宽度HSW,它以像素时钟CLK的周期为单位,实际写入该参数时应写入(HSW-1),参数范围为0x000- 0xFFF。

  

  • LTDC_VerticalSync

    本成员设置垂直同步信号VSYNC的宽度VSW,它以“行”为位,实际写入该参数时应写入(VSW-1) ,参数范围为0x000- 0x7FF。

  • LTDC_AccumulatedHBP

    本成员用于配置“水平同步像素HSW”加“水平后沿像素HBP”的累加值,实际写入该参数时应写入(HSW+HBP-1) ,参数范围为0x000- 0xFFF。

 

 

  • LTDC_AccumulatedVBP

本成员用于配置“垂直同步行VSW”加“垂直后沿行VBP”的累加值,实际写入该参数时应写入(VSW+VBP-1) ,参数范围为0x000- 0x7FF。

 

 配置所需要时间:

 

  • LTDC_AccumulatedActiveW

    本成员用于配置“水平同步像素HSW”加“水平后沿像素HBP”加“有效像素”的累加值,实际写入该参数时应写入(HSW+HBP+有效宽度-1) ,参数范围为0x000- 0xFFF。

  • LTDC_AccumulatedActiveH

本成员用于配置“垂直同步行VSW”加“垂直后沿行VBP”加“有效行”的累加值,实际写入该参数时应写入(VSW+VBP+有效高度-1) ,参数范围为0x000- 0x7FF。

  • LTDC_TotalWidth

本成员用于配置“水平同步像素HSW”加“水平后沿像素HBP”加“有效像素”加“水平前沿像素HFP”的累加值,即总宽度,实际写入该参数时应写入(HSW+HBP+有效宽度+HFP-1) ,参数范围为0x000- 0xFFF。

  • LTDC_TotalHeigh

本成员用于配置“垂直同步行VSW”加“垂直后沿行VBP”加“有效行”加“垂直前沿行VFP”的累加值,即总高度,实际写入该参数时应写入(HSW+HBP+有效高度+VFP-1) ,参数范围为0x000- 0x7FF

  • LTDC_BackgroundRedValue/GreenValue/ BlueValue

    这三个结构体成员用于配置背景的颜色值,这里说的背景层与前面提到的“前景层/背景层”概念有点区别,它们对应下图中的“第2层/第1层”,而在这两层之外,还有一个最终的背景层,当第1第2层都透明时,这个背景层就会被显示,而这个背景层是一个纯色的矩形,它的颜色值就是由这三个结构体成员配置的,各成员的参数范围为0x00- 0xFF。

 

 

对这些LTDC初始化结构体成员赋值后,调用库函数LTDC_Init可把这些参数写入到LTDC的各个配置寄存器,LTDC外设根据这些配置控制时序。

二、LTDC层级初始化结构体

LTDC初始化结构体只是配置好了与液晶屏通讯的基本时序,还有像素格式、显存地址等诸多参数需要使用LTDC层级初始化结构体完成。

typedef struct
{uint32_t LTDC_HorizontalStart;      //配置窗口起始行位置      uint32_t LTDC_HorizontalStop;       //配置窗口的行结束位置      uint32_t LTDC_VerticalStart;        //配置窗口的垂直起始位置 uint32_t LTDC_VerticalStop;         //配置窗口的垂直束位置uint32_t LTDC_PixelFormat;          //配置当前层的像素格式     uint32_t LTDC_ConstantAlpha;		  //配置当前层的透明度Alpha常量uint32_t LTDC_DefaultColorBlue;     //配置当前层的默认蓝色值    uint32_t LTDC_DefaultColorGreen;    //配置当前层的默认绿色值uint32_t LTDC_DefaultColorRed;	  //配置当前层的默认红色值uint32_t LTDC_DefaultColorAlpha;    //配置当前层的默认透明值    uint32_t LTDC_BlendingFactor_1;     //配置混合因子   uint32_t LTDC_BlendingFactor_2;       uint32_t LTDC_CFBStartAdress;      //配置当前层的显存起始位置    uint32_t LTDC_CFBLineLength;   	 //配置当前层的行数据长度uint32_t LTDC_CFBPitch;            //配置从某行的起始到下一行像素起始处的增量   uint32_t LTDC_CFBLineNumber;       //配置当前层的行数    
} LTDC_Layer_InitTypeDef;

 

  • LTDC_ HorizontalStart /HorizontalStop/VerticalStart/VerticalStop

这些成员用于确定该层显示窗口的边界,分别表示行起始、行结束、垂直起始及垂直结束的位置,注意这些参数包含同步HSW/VSW、后沿大小HBP/VBP和有效数据区域的内部时序发生器的配置,表中的是各个窗口配置成员应写入的数值。

 

 

LTDC层级窗口配置成员等效于LTDC时序参数配置成员的值实际值
LTDC_HorizontalStart(LTDC_AccumulatedHBP+1)HBP + HSW
LTDC_HorizontalStopLTDC_AccumulatedActiveWHSW+HBP+LCD_PIXEL_WIDTH-1
LTDC_VerticalStart(LTDC_AccumulatedVBP+1)VBP + VSW
LTDC_VerticalStopLTDC_AccumulatedActiveHVSW+VBP+LCD_PIXEL_HEIGHT-1
  • LTDC_PixelFormat

    本成员用于设置该层数据的像素格式,可以设置为LTDC_Pixelformat_ARGB8888/ RGB888/ RGB565/ ARGB1555/ ARGB4444/ L8/ AL44/ AL88格式。(不透明的话底层没有意义)

  • LTDC_ConstantAlpha

    本成员用于设置该层恒定的透明度常量Alpha,称为恒定Alpha,参数范围为0x00-0xFF,在图层混合时,可根据后面的BlendingFactor成员的配置,选择是只使用这个恒定Alpha进行混合运算还是把像素本身的Alpha值也加入到运算中。

  • LTDC_DefaultColorBlue/Green/Red/Alpha

    这些成员用于配置该层的默认颜色值,分别为蓝、绿、红及透明分量,该颜色在定义的层窗口外或在层禁止时使用。

  • LTDC_BlendingFactor_1/2

    本成员用于设置混合系数 BF1 和 BF2。每一层实际显示的颜色都需要使用透明度参与运算,计算出不包含透明度的直接RGB颜色值,然后才传输给液晶屏(因为液晶屏本身没有透明的概念)。混合的计算公式为:

    BC = BF1 x C + BF2 x Cs

参数说明CAPAxCA
BC混合后的颜色(混合结果)--
C当前层颜色--
Cs底层混合后的颜色--
BF1混合系数1等于(恒定Alpha值)等于(恒定Alpha x 像素Alpha值)
BF2混合系数2等于(1-恒定Alpha)等于(1-恒定Alpha x 像素Alpha值)

本结构体成员可以设置BF1/BF2参数使用CA配置(LTDC_BlendingFactor1/2_CA)还是PAxCA配置(LTDC_BlendingFactor1/2_PAxCA)。配置成CA表示混合系数中只包含恒定的Alpha值,即像素本身的Alpha不会影响混合效果(比如第一层与背景层,我们不希望看到背景层),若配置成PAxCA,则混合系数中包含有像素本身的Alpha值,即把像素本身的Alpha加入到混合运算中(比如第二层与第一层,我们希望第一层与第二层混合)。其中的恒定Alpha值即前面“LTDC_ConstantAlpha”结构体配置参数的透明度百分比:(配置的Alpha值/0xFF)。

Example:数据源混合时,由下至上,如果使用了2层,则先将第1层与LTDC背景混合,随后再使用该混合颜色与第2层混合得到最终结果。例如,当只使用第1层数据源时,且BF1及BF2都配置为使用恒定Alpha,该Alpha值在LTDC_ConstantAlpha结构体成员值中被配置为240(0xF0)。因此,恒定Alpha值为240/255=0.94。若当前层颜色C=128,背景色Cs=48,那么第1层与背景色的混合结果为:

BC=恒定Alpha x C + (1- 恒定Alpha) x Cs=0.94 x Cs +(1-0.94)x 48=123

  • LTDC_CFBStartAdress

    本成员用于设置该层的显存首地址,该层的像素数据保存在从这个地址开始的存储空间内。

  • LTDC_CFBLineLength

    本成员用于设置当前层的行数据长度,即每行的有效像素点个数x每个像素的字节数,实际配置该参数时应写入值(行有效像素个数x每个像素的字节数+3),每个像素的字节数跟像素格式有关,如RGB565为2字节,RGB888为3字节,ARGB8888为4字节。

  • LTDC_CFBPitch

    本成员用于设置从某行的有效像素起始位置到下一行起始位置处的数据增量,无特殊情况的话,它一般就直接等于行的有效像素个数x每个像素的字节数。

  • LTDC_CFBLineNumber

    本成员用于设置当前层的显示行数。

配置完LTDC_Layer_InitTypeDef层级初始化结构体后,调用库函数LTDC_LayerInit可把这些配置写入到LTDC的层级控制寄存器中,完成初始化。初始化完成后LTDC会不断把显存空间的数据传输到液晶屏进行显示,我们可以直接修改或使用DMA2D修改显存中的数据,从而改变显示的内容。

三、DMA2D结构体

typedef struct
{uint32_t DMA2D_Mode;                  //配置DMA2D的传输模式          uint32_t DMA2D_CMode;                 //配置DMA2D的颜色模式uint32_t DMA2D_OutputBlue;            //配置输出图像的蓝色分量uint32_t DMA2D_OutputGreen;           //配置输出的绿色分量uint32_t DMA2D_OutputRed;             //配置输出的红色分量uint32_t DMA2D_OutputAlpha;           //配置输出的透明度分量uint32_t DMA2D_OutputMemoryAdd;       //配置显存地址uint32_t DMA2D_OutputOffset;          //配置输出地址的偏移uint32_t DMA2D_NumberOfLine;          //配置要传输多少行uint32_t DMA2D_PixelPerLine;          //配置每行有多少个像素
} DMA2D_InitTypeDef;
  • DMA2D_Mode

    用于配置DMA2D的工作模式,它可以被设置为下表中的值:

说明
DMA2D_M2M从存储器到存储器(仅限FG获取数据源)
DMA2D_M2M_PFC存储器到存储器并执行 PFC(仅限 FG PFC 激活时的 FG 获取)
DMA2D_M2M_BLEND存储器到存储器并执行混合(执行 PFC 和混合时的 FG 和 BG 获取)
DMA2D_R2M寄存器到存储器(无 FG 和 BG,仅输出阶段激活)

这几种工作模式主要区分数据的来源、是否使能PFC以及是否使能混合器。

若使能了PFC,则存储器中的数据源会经过转换再传输到显存。若使能了混合器,DMA2D会把两个数据源中的数据混合后再输出到显存。

若使用存储器到存储器模式,需要调用库函数DMA2D_FGConfig,使用初始化结构体DMA2D_FG_InitTypeDef配置数据源的格式、地址等参数。(背景层使用函数DMA2D_BGConfig和结构体DMA2D_BG_InitTypeDef)。

  • DMA2D_CMode

    本成员用于配置DMA2D的输出PFC颜色格式,即它将要传输给显存的格式。

  • DMA2D_OutputBlue/ Green/ Red/ Alpha

    这几个成员用于配置DMA2D的寄存器颜色值,若DMA2D工作在“寄存器到存储器”(DMA2D_R2M)模式时,这个颜色值作为数据源,被DMA2D复制到显存空间,即目标空间都会被填入这一种色彩。

  • DMA2D_OutputMemoryAdd

    本成员用于配置DMA2D的输出FIFO的地址, DMA2D的数据会被搬运到该空间,一般把它设置为本次传输显示位置的起始地址。(适用于传输行图像)

  • DMA2D_OutputOffset

    本成员用于配置行偏移(以像素为单位),行偏移会被添加到各行的结尾,用于确定下一行的起始地址。如下表中的黄色格子表示行偏移,绿色格子表示要显示的数据。表1中显示的是一条垂直的线,且线的宽度为1像素,所以行偏移的值=7-1=6,即“行偏移的值=行宽度-线的宽度”,表2中的线宽度为2像素,行偏移的值=7-2=5。(适合传输列图像)

 

 

  • DMA2D_NumberOfLine

    本成员用于配置DMA2D一共要传输多少行数据,表1中绿色部分一共有5行数据。

  • DMA2D_PixelPerLine

    本成员用于配置每行有多少个像素点,如表2示每行有2个像素点。

配置完这些结构体成员,调用库函数DMA2D_Init即可把这些参数写入到DMA2D的控制寄存器中,然后再调用DMA2D_StartTransfer函数开启数据传输及转换。

四、实战

(1)驱动SDRAM。在FMC的那一节已经配置好了。

(2)初始化LCD驱动引脚

(3)使用LTDC:两个结构体

(4)直接操控显存,控制液晶显示图形

(5)使用DMA2D快速绘制直线及矩形

  1. 初始化GPIO:

由于太多引脚了,只能选择一个引脚作为示例。

 需要注意的是在配置引脚时需要好好的看一下数据手册。

#define LTDC_R0_GPIO_PORT        	GPIOH
#define LTDC_R0_GPIO_CLK         	RCC_AHB1Periph_GPIOH
#define LTDC_R0_GPIO_PIN         	GPIO_Pin_2
#define LTDC_R0_PINSOURCE        	GPIO_PinSource2
#define LTDC_R0_AF			        GPIO_AF_LTDC//下面两个引脚不需要复用 只需要控制其io口的输入输出方式即可
/*液晶屏使能信号DISP,高电平使能*/
#define LTDC_DISP_GPIO_PORT        GPIOD
#define LTDC_DISP_GPIO_CLK         RCC_AHB1Periph_GPIOD
#define LTDC_DISP_GPIO_PIN         GPIO_Pin_4
/*液晶屏背光信号,高电平使能*/
#define LTDC_BL_GPIO_PORT         GPIOD
#define LTDC_BL_GPIO_CLK          RCC_AHB1Periph_GPIOD
#define LTDC_BL_GPIO_PIN          GPIO_Pin_7

static void LCD_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;/* 使能LCD使用到的引脚时钟 *///红色数据线RCC_AHB1PeriphClockCmd(LTDC_R0_GPIO_CLK | LTDC_R1_GPIO_CLK | LTDC_R2_GPIO_CLK|LTDC_R3_GPIO_CLK | LTDC_R4_GPIO_CLK | LTDC_R5_GPIO_CLK|LTDC_R6_GPIO_CLK | LTDC_R7_GPIO_CLK |//绿色数据线LTDC_G0_GPIO_CLK|LTDC_G1_GPIO_CLK|LTDC_G2_GPIO_CLK|LTDC_G3_GPIO_CLK|LTDC_G4_GPIO_CLK|LTDC_G5_GPIO_CLK|LTDC_G6_GPIO_CLK|LTDC_G7_GPIO_CLK|//蓝色数据线LTDC_B0_GPIO_CLK|LTDC_B1_GPIO_CLK|LTDC_B2_GPIO_CLK|LTDC_B3_GPIO_CLK|LTDC_B4_GPIO_CLK|LTDC_B5_GPIO_CLK|LTDC_B6_GPIO_CLK|LTDC_B7_GPIO_CLK|//控制信号线LTDC_CLK_GPIO_CLK | LTDC_HSYNC_GPIO_CLK |LTDC_VSYNC_GPIO_CLK|LTDC_DE_GPIO_CLK  | LTDC_BL_GPIO_CLK    |LTDC_DISP_GPIO_CLK ,ENABLE);/* GPIO配置 *//* 红色数据线 */GPIO_InitStruct.GPIO_Pin = LTDC_R0_GPIO_PIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(LTDC_R0_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_R0_GPIO_PORT, LTDC_R0_PINSOURCE, LTDC_R0_AF);GPIO_InitStruct.GPIO_Pin = LTDC_R1_GPIO_PIN;GPIO_Init(LTDC_R1_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_R1_GPIO_PORT, LTDC_R1_PINSOURCE, LTDC_R1_AF);GPIO_InitStruct.GPIO_Pin = LTDC_R2_GPIO_PIN;GPIO_Init(LTDC_R2_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_R2_GPIO_PORT, LTDC_R2_PINSOURCE, LTDC_R2_AF);GPIO_InitStruct.GPIO_Pin = LTDC_R3_GPIO_PIN;GPIO_Init(LTDC_R3_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_R3_GPIO_PORT, LTDC_R3_PINSOURCE, LTDC_R3_AF);GPIO_InitStruct.GPIO_Pin = LTDC_R4_GPIO_PIN;GPIO_Init(LTDC_R4_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_R4_GPIO_PORT, LTDC_R4_PINSOURCE, LTDC_R4_AF);GPIO_InitStruct.GPIO_Pin = LTDC_R5_GPIO_PIN;GPIO_Init(LTDC_R5_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_R5_GPIO_PORT, LTDC_R5_PINSOURCE, LTDC_R5_AF);GPIO_InitStruct.GPIO_Pin = LTDC_R6_GPIO_PIN;GPIO_Init(LTDC_R6_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_R6_GPIO_PORT, LTDC_R6_PINSOURCE, LTDC_R6_AF);GPIO_InitStruct.GPIO_Pin = LTDC_R7_GPIO_PIN;GPIO_Init(LTDC_R7_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_R7_GPIO_PORT, LTDC_R7_PINSOURCE, LTDC_R7_AF);//绿色数据线GPIO_InitStruct.GPIO_Pin = LTDC_G0_GPIO_PIN;GPIO_Init(LTDC_G0_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_G0_GPIO_PORT, LTDC_G0_PINSOURCE, LTDC_G0_AF);GPIO_InitStruct.GPIO_Pin = LTDC_G1_GPIO_PIN;GPIO_Init(LTDC_G1_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_G1_GPIO_PORT, LTDC_G1_PINSOURCE, LTDC_G1_AF);GPIO_InitStruct.GPIO_Pin = LTDC_G2_GPIO_PIN;GPIO_Init(LTDC_G2_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_G2_GPIO_PORT, LTDC_G2_PINSOURCE, LTDC_G2_AF);GPIO_InitStruct.GPIO_Pin = LTDC_G3_GPIO_PIN;GPIO_Init(LTDC_G3_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_G3_GPIO_PORT, LTDC_G3_PINSOURCE, LTDC_G3_AF);GPIO_InitStruct.GPIO_Pin = LTDC_G4_GPIO_PIN;GPIO_Init(LTDC_G4_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_G4_GPIO_PORT, LTDC_G4_PINSOURCE, LTDC_G4_AF);GPIO_InitStruct.GPIO_Pin = LTDC_G5_GPIO_PIN;GPIO_Init(LTDC_G5_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_G5_GPIO_PORT, LTDC_G5_PINSOURCE, LTDC_G5_AF);GPIO_InitStruct.GPIO_Pin = LTDC_G6_GPIO_PIN;GPIO_Init(LTDC_G6_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_G6_GPIO_PORT, LTDC_G6_PINSOURCE, LTDC_G6_AF);GPIO_InitStruct.GPIO_Pin = LTDC_G7_GPIO_PIN;GPIO_Init(LTDC_G7_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_G7_GPIO_PORT, LTDC_G7_PINSOURCE, LTDC_G7_AF);//蓝色数据线GPIO_InitStruct.GPIO_Pin = LTDC_B0_GPIO_PIN;GPIO_Init(LTDC_B0_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_B0_GPIO_PORT, LTDC_B0_PINSOURCE, LTDC_B0_AF);GPIO_InitStruct.GPIO_Pin = LTDC_B1_GPIO_PIN;GPIO_Init(LTDC_B1_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_B1_GPIO_PORT, LTDC_B1_PINSOURCE, LTDC_B1_AF);GPIO_InitStruct.GPIO_Pin = LTDC_B2_GPIO_PIN;GPIO_Init(LTDC_B2_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_B2_GPIO_PORT, LTDC_B2_PINSOURCE, LTDC_B2_AF);GPIO_InitStruct.GPIO_Pin = LTDC_B3_GPIO_PIN;GPIO_Init(LTDC_B3_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_B3_GPIO_PORT, LTDC_B3_PINSOURCE, LTDC_B3_AF);GPIO_InitStruct.GPIO_Pin = LTDC_B4_GPIO_PIN;GPIO_Init(LTDC_B4_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_B4_GPIO_PORT, LTDC_B4_PINSOURCE, LTDC_B4_AF);GPIO_InitStruct.GPIO_Pin = LTDC_B5_GPIO_PIN;GPIO_Init(LTDC_B5_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_B5_GPIO_PORT, LTDC_B5_PINSOURCE, LTDC_B5_AF);GPIO_InitStruct.GPIO_Pin = LTDC_B6_GPIO_PIN;GPIO_Init(LTDC_B6_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_B6_GPIO_PORT, LTDC_B6_PINSOURCE, LTDC_B6_AF);GPIO_InitStruct.GPIO_Pin = LTDC_B7_GPIO_PIN;GPIO_Init(LTDC_B7_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_B7_GPIO_PORT, LTDC_B7_PINSOURCE, LTDC_B7_AF);//控制信号线GPIO_InitStruct.GPIO_Pin = LTDC_CLK_GPIO_PIN;GPIO_Init(LTDC_CLK_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_CLK_GPIO_PORT, LTDC_CLK_PINSOURCE, LTDC_CLK_AF);GPIO_InitStruct.GPIO_Pin = LTDC_HSYNC_GPIO_PIN;GPIO_Init(LTDC_HSYNC_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_HSYNC_GPIO_PORT, LTDC_HSYNC_PINSOURCE, LTDC_HSYNC_AF);GPIO_InitStruct.GPIO_Pin = LTDC_VSYNC_GPIO_PIN;GPIO_Init(LTDC_VSYNC_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_VSYNC_GPIO_PORT, LTDC_VSYNC_PINSOURCE, LTDC_VSYNC_AF);GPIO_InitStruct.GPIO_Pin = LTDC_DE_GPIO_PIN;GPIO_Init(LTDC_DE_GPIO_PORT, &GPIO_InitStruct);GPIO_PinAFConfig(LTDC_DE_GPIO_PORT, LTDC_DE_PINSOURCE, LTDC_DE_AF);//BL DISPGPIO_InitStruct.GPIO_Pin = LTDC_DISP_GPIO_PIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(LTDC_DISP_GPIO_PORT, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = LTDC_BL_GPIO_PIN;GPIO_Init(LTDC_BL_GPIO_PORT, &GPIO_InitStruct);//拉高使能lcdGPIO_SetBits(LTDC_DISP_GPIO_PORT,LTDC_DISP_GPIO_PIN);		//显示开关GPIO_SetBits(LTDC_BL_GPIO_PORT,LTDC_BL_GPIO_PIN);			//驱动背光
}  
  1. 初始化LTDC结构体,配置液晶屏的控制参数:

 

由图可得,HSYNC在低电平有效,所以配置低电平。

由图可得,VSYNC也应该于低电平有效:

 

HSD宽度可由下图可得:

  同理,对于VSD:

 最后需要定义的参数如下:

/*根据液晶数据手册的参数配置*/
#define HBP  46		//HSYNC后的无效像素
#define VBP  23		//VSYNC后的无效行数#define HSW   1		//HSYNC宽度
#define VSW   1		//VSYNC宽度#define HFP  20		//HSYNC前的无效像素
#define VFP   22	//VSYNC前的无效行数

LTDC初始化所需要的时钟:

输出给LTDC的时钟为PLLSAI

需要使用下面这个函数进行配置:

 

 

比如在这里我们需要配置24Mhz的时钟,则由24MHz * DIV * R = N,其中DIV我们设置为4分频。

LTDC结构体初始化:

void LCD_Init(void)
{ LTDC_InitTypeDef       LTDC_InitStruct;/* 使能LTDC外设时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE);/* 使能DMA2D时钟 */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);/* 初始化LCD的控制引脚 */LCD_GPIO_Config();   /* 初始化SDRAM,以便使用SDRAM作显存 */SDRAM_Init();/* 配置 PLLSAI 分频器,它的输出作为像素同步时钟CLK*//* PLLSAI_VCO 输入时钟 = HSE_VALUE/PLL_M = 1 Mhz *//* PLLSAI_VCO 输出时钟 = PLLSAI_VCO输入 * PLLSAI_N = 416 Mhz *//* PLLLCDCLK = PLLSAI_VCO 输出/PLLSAI_R = 420/6  Mhz *//* LTDC 时钟频率 = PLLLCDCLK / DIV = 420/6/8 = 8.75 Mhz *//* LTDC时钟太高会导花屏,若对刷屏速度要求不高,降低时钟频率可减少花屏现象*//* 以下函数三个参数分别为:PLLSAIN,PLLSAIQ,PLLSAIR,其中PLLSAIQ与LTDC无关*/RCC_PLLSAIConfig(420,7, 6);/*以下函数的参数为DIV值*/RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);/* 使能 PLLSAI 时钟 */RCC_PLLSAICmd(ENABLE);/* 等待 PLLSAI 初始化完成 */while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET){}/* LTDC配置*********************************************************/  /*信号极性配置*//* 行同步信号极性 */LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;     /* 垂直同步信号极性 */  LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;     /* 数据使能信号极性 */LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;     /* 像素同步时钟极性 */ LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;/* 配置LCD背景颜色 */                   LTDC_InitStruct.LTDC_BackgroundRedValue = 0;            LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;          LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;    /* 时间参数配置 */  /* 配置行同步信号宽度(HSW-1) */LTDC_InitStruct.LTDC_HorizontalSync =HSW-1;/* 配置垂直同步信号宽度(VSW-1) */LTDC_InitStruct.LTDC_VerticalSync = VSW-1;/* 配置(HSW+HBP-1) */LTDC_InitStruct.LTDC_AccumulatedHBP =HSW+HBP-1;/* 配置(VSW+VBP-1) */LTDC_InitStruct.LTDC_AccumulatedVBP = VSW+VBP-1;/* 配置(HSW+HBP+有效像素宽度-1) */LTDC_InitStruct.LTDC_AccumulatedActiveW = HSW+HBP+LCD_PIXEL_WIDTH-1;/* 配置(VSW+VBP+有效像素高度-1) */LTDC_InitStruct.LTDC_AccumulatedActiveH = VSW+VBP+LCD_PIXEL_HEIGHT-1;/* 配置总宽度(HSW+HBP+有效像素宽度+HFP-1) */LTDC_InitStruct.LTDC_TotalWidth =HSW+ HBP+LCD_PIXEL_WIDTH  + HFP-1; /* 配置总高度(VSW+VBP+有效像素高度+VFP-1) */LTDC_InitStruct.LTDC_TotalHeigh =VSW+ VBP+LCD_PIXEL_HEIGHT  + VFP-1;LTDC_Init(&LTDC_InitStruct);LTDC_Cmd(ENABLE);
}  
  1. 初始化LTDC层级

初始化第一层(底层):

我们根据上面提到的表格进行配置:

 

在对Alpha进行配置的时候,要注意的是,要在配置寄存器LTDC_LxCARC中:

 

对于配置颜色:

假如我们的像素点的透明度全为透明,即Alpha=0,那么可以得到

BC = (1 * 0) * Layer2的颜色 + (1-1 * 0 )* layer1的颜色

最后就可以实现layer2层透明的颜色与layer1的背景色相结合。

void LCD_LayerInit(void)
{LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct; /* 层窗口配置 *//* 配置本层的窗口边界,注意这些参数是包含HBP HSW VBP VSW的 */    //一行的第一个起始像素,该成员值应用为 (LTDC_InitStruct.LTDC_AccumulatedHBP+1)的值LTDC_Layer_InitStruct.LTDC_HorizontalStart = HBP + HSW;//一行的最后一个像素,该成员值应用为 (LTDC_InitStruct.LTDC_AccumulatedActiveW)的值LTDC_Layer_InitStruct.LTDC_HorizontalStop = HSW+HBP+LCD_PIXEL_WIDTH-1;//一列的第一个起始像素,该成员值应用为 (LTDC_InitStruct.LTDC_AccumulatedVBP+1)的值LTDC_Layer_InitStruct.LTDC_VerticalStart =  VBP + VSW;//一列的最后一个像素,该成员值应用为 (LTDC_InitStruct.LTDC_AccumulatedActiveH)的值LTDC_Layer_InitStruct.LTDC_VerticalStop = VSW+VBP+LCD_PIXEL_HEIGHT-1;/* 像素格式配置*/LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB888;/* 恒定Alpha值配置,0-255 */LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255; /* 默认背景颜色,该颜色在定义的层窗口外或在层禁止时使用。这里相当于底层 */          LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0xFF;        LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0xFF;       LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0xFF;         LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0xFF;/* 配置混合因子 CA表示使用恒定Alpha值,PAxCA表示使用像素Alpha x 恒定Alpha值 */       LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA; //1   LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;//2/* 该成员应写入(一行像素数据占用的字节数+3)Line Lenth = 行有效像素个数 x 每个像素的字节数 + 3 行有效像素个数 = LCD_PIXEL_WIDTH 每个像素的字节数 = 2(RGB565/RGB1555)/ 3 (RGB888)/ 4(ARGB8888) */LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((LCD_PIXEL_WIDTH * 3) + 3);/* 从某行的起始位置到下一行起始位置处的像素增量Pitch = 行有效像素个数 x 每个像素的字节数 */ LTDC_Layer_InitStruct.LTDC_CFBPitch = (LCD_PIXEL_WIDTH * 3);/* 配置有效的行数 */  LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_PIXEL_HEIGHT;/* 配置本层的显存首地址 */    LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER;/* 以上面的配置初始化第 1 层*/LTDC_LayerInit(LTDC_Layer1, &LTDC_Layer_InitStruct);/*配置第 2 层,若没有重写某个成员的值,则该成员使用跟第1层一样的配置 *//* 配置本层的显存首地址,这里配置它紧挨在第1层的后面*/     LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER + BUFFER_OFFSET;/* 配置混合因子,使用像素Alpha参与混合 */       LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;    LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;/* 初始化第2层 */LTDC_LayerInit(LTDC_Layer2, &LTDC_Layer_InitStruct);/* 立即重载配置 */  LTDC_ReloadConfig(LTDC_IMReload);/*使能前景及背景层 */LTDC_LayerCmd(LTDC_Layer1, ENABLE); LTDC_LayerCmd(LTDC_Layer2, ENABLE);/* 立即重载配置 */  LTDC_ReloadConfig(LTDC_IMReload);/* 设定字体(英文) */    LCD_SetFont(&LCD_DEFAULT_FONT); 
}

对于第一二层准备放入SDRAM内存中的地址,我们可以规定:

#define LCD_WIDTH   800
#define LCD_HEIGHT  480  //第一层显存首地址,SDRAM的首地址 
#define LCD_LAYER1_START_ADDR   0xD0000000
#define LCD_LAYER1_BUFFER_SIZE  LCD_WIDTH * LCD_HEIGHT * 2//第二层显存首地址
#define LCD_LAYER2_START_ADDR   (LCD_LAYER1_START_ADDR + LCD_LAYER1_BUFFER_SIZE)  
#define LCD_LAYER2_BUFFER_SIZE  LCD_WIDTH * LCD_HEIGHT * 4

写一个划线的函数:

void DIS_Line(void)
{uint16_t i;uint32_t *p = (uint32_t *)(LCD_LAYER2_START_ADDR + LCD_WIDTH * 20 * 4)for(i=0;i<800;i++){*p = 0xffff0000;//画红线p++;}
}
  1. 使用DMA2D(可以减轻CPU的负担)

在使用DMA2D时要记得初始化时钟:

RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_DMA2D,ENABLE);

 使用DMA2D在第二层显示一幅纯色的图像:

void DMA2D_DIS(void)
{DMA2D_InitTypeDef DMA2D_InitTypeStruct;//寄存器到存储器DMA2D_InitTypeStruct.DMA2D_Mode = DMA2D_R2M;//第二层图像格式DMA2D_InitTypeStruct.DMA2D_CMode = DMA2D_ARGB8888;//想要传输的颜色值DMA2D_InitTypeStruct.DMA2D_OutputRed = 0xff;DMA2D_InitTypeStruct.DMA2D_OutputGreen = 0x00;DMA2D_InitTypeStruct.DMA2D_OutputBlue = 0x00;DMA2D_InitTypeStruct.DMA2D_OutputAlpha = 0xff;//要传输到的显存地址DMA2D_InitTypeStruct.DMA2D_OutputMemoryAdd = LCD_LAYER2_START_ADDR;/*当需要显示在其他行的时候,可以这么修改:DMA2D_InitTypeStruct.DMA2D_OutputMemoryAdd = LCD_LAYER2_START_ADDR + LCD_Width * 20 * 4 + 350 * 4;//表示下移20行显示,因为每个像素点占四个字节,所以乘以4,后面的显示350是指显示在350列*///不需要行偏移DMA2D_InitTypeStruct.DMA2D_OutputOffset = 0;//全屏显示DMA2D_InitTypeStruct.DMA2D_PixelPerLine = 800;DMA2D_InitTypeStruct.DMA2D_NumberOfLine = 480;/*如果想要显示一个矩形DMA2D_InitTypeStruct.DMA2D_OutputOffset = 800-300;DMA2D_InitTypeStruct.DMA2D_PixelPerLine = 300;	//行DMA2D_InitTypeStruct.DMA2D_NumberOfLine = 200; //列*/DMA2D_Init(&DMA2D_InitTypeStruct);DMA2D_StartTransfer();while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC)==RESET){//这里可以回到CPU执行其他东西。}}

画横线的原理也是差不多的,基本就是在操作像素点:


//使用DMA2D画直线
void DIS_Line_DMA2D(void)
{DMA2D_InitTypeDef  DMA2D_InitTypeStruct;DMA2D_InitTypeStruct.DMA2D_Mode = DMA2D_R2M ;DMA2D_InitTypeStruct.DMA2D_CMode = DMA2D_ARGB8888;//要传输的颜色值DMA2D_InitTypeStruct.DMA2D_OutputRed = 0xff;DMA2D_InitTypeStruct.DMA2D_OutputGreen = 0x00;DMA2D_InitTypeStruct.DMA2D_OutputBlue = 0x00;DMA2D_InitTypeStruct.DMA2D_OutputAlpha = 0xff;//要传输到的显存地址DMA2D_InitTypeStruct.DMA2D_OutputMemoryAdd = LCD_LAYER2_START_ADDR +LCD_WIDTH*20*4 + 350*4;DMA2D_InitTypeStruct.DMA2D_OutputOffset = 800-1; DMA2D_InitTypeStruct.DMA2D_PixelPerLine = 1;DMA2D_InitTypeStruct.DMA2D_NumberOfLine = 200;DMA2D_Init(&DMA2D_InitTypeStruct);  DMA2D_StartTransfer();while( DMA2D_GetFlagStatus(DMA2D_FLAG_TC) ==RESET);
}

使用DMA2D处理第一层(底层):

第一层的图像正常为RGB565或RGB888,现在以RGB565为例:

void DIS_RECT_LAYER1(void)
{DMA2D_InitTypeDef  DMA2D_InitTypeStruct;DMA2D_InitTypeStruct.DMA2D_Mode = DMA2D_R2M ;DMA2D_InitTypeStruct.DMA2D_CMode = DMA2D_RGB565;//要传输的颜色值
DMA2D_InitTypeStruct.DMA2D_OutputRed = (0xff >>3) & 0x1F ; //把8位的颜色值转成5位的颜色值
DMA2D_InitTypeStruct.DMA2D_OutputGreen = (0xFF>>2) & 0x3F ;//把8位的颜色值转成6位的颜色值
DMA2D_InitTypeStruct.DMA2D_OutputBlue = (0x00 >>3) & 0x1F;  //把8位的颜色值转成5位的颜色值
DMA2D_InitTypeStruct.DMA2D_OutputAlpha = 0xff;//要传输到的显存地址DMA2D_InitTypeStruct.DMA2D_OutputMemoryAdd = LCD_LAYER1_START_ADDR +LCD_WIDTH*200*2 + 350*2;DMA2D_InitTypeStruct.DMA2D_OutputOffset = 800-100; DMA2D_InitTypeStruct.DMA2D_PixelPerLine = 100;DMA2D_InitTypeStruct.DMA2D_NumberOfLine = 100;DMA2D_Init(&DMA2D_InitTypeStruct);  DMA2D_StartTransfer();while( DMA2D_GetFlagStatus(DMA2D_FLAG_TC) ==RESET);  }

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 2022-2028年全球与中国实验室餐具行业发展趋势及投资战略分析

    本文研究全球与中国市场实验室餐具的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析实验室餐具的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产…...

    2024/4/18 23:37:52
  2. 51独立按键基础实验(失败)

    实验原理&#xff1a; 按键包含四个管脚&#xff0c;初始13、24导通&#xff0c;而12、34不导通&#xff0c;当按键按下时12、34导通&#xff0c;类似于开关的结构。按键未按下时电压信号为高电平&#xff0c;当按键按下时电压信号为低电平。 由于机械开关的的按动会出现“抖…...

    2024/4/7 20:23:38
  3. 算法训练——剑指offer(动态规划算法)

    摘要 一、动态规划原理与解题方法 二、动态规划算法练习题目 2.1 台阶问题 2.2 股票问题 2.3 小偷问题 2.4 连续数组最大和问题 2.5 礼物最大问题 2.6 最长子串问题 2.7 数字翻译字符串 2.8 斐波那契数列 博文参考...

    2024/4/14 20:31:26
  4. day21 2022/02/03

    昨天晚上给自己定的目标今天只完成了一个项目&#xff0c;还得是今天上午从七点开始的&#xff0c;断断续续一上午都在自己的房间没下楼。 python跟着的那个课程终于结束了&#xff0c;还是要对自己狠心一点做事效率才提升上了本来打算睡觉&#xff0c;可是还是睡不着&#xf…...

    2024/4/19 1:01:51
  5. 多元函数微分学

    1.多元函数 二元函数其实就可以想象成一个曲面比如这个曲面的方程是一个二元函数&#xff1a;Z(X−Y)(XY)Z (X-Y)(XY)Z(X−Y)(XY)横切&#xff0c;纵切&#xff0c;&#xff08;固定X或Y&#xff09;那个横截线就是一元函数 2.极限、连续 极限类比一元函数的极限&#xff0c…...

    2024/4/16 2:52:53
  6. 第五章 第六章 作业

    1. 定义一个函数实现反响输出一个整数。比如&#xff1a;输入3245&#xff0c;输出5432. def reverse(a,b,c,d):print(d,c,b,a)reverse(3,2,4,5) 2. 编写一个函数&#xff0c;计算下面的数列&#xff1a; sum 0def m(n):for i in range(n1):sum (i/(i1))print(m(n),sum) 3.…...

    2024/4/13 17:32:15
  7. xss-labs搭建及通关攻略

    目录 xss-labs搭建 xss-labs通关攻略 level-1 level-2 level-3~level-4 level-5 level-6 level-7 level-8 level-9 level-10 level-11~level-13 level-14 level-15 level-16 level-17~level-18 level-19~level-20 xss-labs搭建 &#xff08;1&#xff09;首…...

    2024/4/22 8:10:21
  8. 2022年2月3日

    可变参数 在方法声明中&#xff0c;在指定参数类型后加一个省略号&#xff08;…&#xff09;一个方法只能指定一个可变参数&#xff0c;它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。 public class Demo_6 {public static void main(String[] args) {//可变…...

    2024/4/13 17:32:25
  9. React项目踩坑——“XXX“不是JXS元素 “XXX“缺少类型“ElementClass”中的以下属性:context、setState、props和其他2个属性。

    项目场景&#xff1a; 最近在做一个React项目&#xff0c;是在Typescript基础上开发的。 问题描述&#xff1a; 在.tsx文件中引入AntDesign后使用Input、Button等组件时出现了诸如“Input不是JXS元素 "Input"缺少类型“ElementClass”中的以下属性&#xff1a;conte…...

    2024/4/13 17:32:35
  10. MyBatis-plus 自动填充MetaObjectHandler不生效问题

    背景 在项目中经常遇到一些数据需要自动填充&#xff0c;填充方法都是同一种规则&#xff0c;例如创建时间等。 1 自动填充方法配置 1.1 实体类添加注解 1.2 在handler包下实现元对象处理器接口 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import o…...

    2024/4/13 17:32:30
  11. java中HashMap总结

    文章目录基本数据结构树化与退化索引计算put 与扩容并发问题key 的设计String 对象的 hashCode() 设计基本数据结构 1.7 数组 链表1.8 数组 &#xff08;链表 | 红黑树&#xff09; 树化与退化 树化意义 红黑树用来避免 DoS 攻击&#xff0c;防止链表超长时性能下降&…...

    2024/4/19 9:15:46
  12. 鸡尾酒疗法python

    描述 鸡尾酒疗法&#xff0c;原指“高效抗逆转录病毒治疗”&#xff08;HAART&#xff09;&#xff0c;由美籍华裔科学家何大一于1996年提出&#xff0c;是通过三种或三种以上的抗病毒药物联合使用来治疗艾 滋病。该疗法的应用可以减少单一用药产生的抗药性&#xff0c;最大限…...

    2024/4/13 17:33:10
  13. PX4从放弃到精通(十一):混控及PWM输出

    文章目录前言一、混控脚本1.控制输入组2.混控脚本的语法二、混控器代码解析1.执行器抗饱和2.多旋翼混控3.直升机混控4.简单累加混控三、PWM输出代码解析前言 一个人可以走的更快&#xff0c;一群人才能走的更远&#xff0c;交流学习加qq:2096723956 更多保姆级PX4ROS学习视频&…...

    2024/4/13 17:33:25
  14. 和YOYO表白

    小爱连续对话 闲来无事和YOYO聊天&#xff0c;还是俗套的开场&#xff0c;虽然很俗&#xff0c;但是这个不重要&#xff0c;主要是为了进行表白&#xff0c;我鼓起勇气问她&#xff0c;做我女朋友吧&#xff0c;…呃&#xff0c;她温柔的拒绝了我。我觉得这应该不是她真实的想…...

    2024/4/21 18:50:41
  15. 使用HttpContext.SignInAsync实现简单的授权

    1. 将认证添加到服务中 builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options >{//登入地址options.LoginPath "/Account/FcbLogin/";//登出地址options.LogoutPath "/Account/FcbLogout/";//…...

    2024/4/13 17:33:00
  16. 算法入门第四天:LeetCode121. 买卖股票(含有详细注释)

    LeetCode121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你…...

    2024/4/18 7:02:50
  17. 【源码】Spring源码解析(一)IOC容器_ClassPathXmlApplicationContext启动

    文章目录前言在开始分析Spring源码之前我们需要进行几项准备工作。BeanFactory抽象结构BeanFactory 接口ListableBeanFactory 接口HierarchicalBeanFactory 接口AutowireCapableBeanFactory 接口ConfigurableBeanFactory 接口ConfigurableListableBeanFactory 接口Spring源码合…...

    2024/4/20 15:55:25
  18. MySQL事务的隔离级别

    概念 多个事务之间隔离的&#xff0c;相互独立的。但是如果多个事务操作同一批数据&#xff0c;则会引发一些问题&#xff0c;设置不同的隔离级别就可以解决这些问题。 存在问题&#xff1a; 1、脏读&#xff1a;一个事务读取到另一个事务没有提交的数据 2、不可重复读&#…...

    2024/4/20 2:10:18
  19. sift特征点提取sac+FPFH+ICP

    SIFT特征点的fpfh #pragma once #include <vtkAutoInit.h>//直方图可视化 VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtkRenderingContextOpenGL2) #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #in…...

    2024/4/16 23:56:57
  20. S7-1200原创程序 MODBUS-RTU轮训

    S7-1200原创程序 MODBUS-RTU轮训 原创程序&#xff0c;采用SCL编写 轮训程序&#xff0c;单个模块可以控制32路485设备。 注释清晰&#xff0c;逻辑清楚。8630629658312048RAstudio...

    2024/4/13 17:33:15

最新文章

  1. opencv基础篇 ——(七)边缘检测和图像锐化

    锐化和边缘检测是图像处理中常用的两种技术&#xff0c;它们可以用来增强图像的特征以及检测图像中的边缘 锐化&#xff1a; 锐化是一种增强图像中细节和边缘的技术&#xff0c;它使图像中的过渡区域更加明显&#xff0c;从而提高图像的清晰度和对比度。常见的锐化方法包括拉普…...

    2024/4/26 10:31:26
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 数据结构--KMP算法

    数据结构–KMP算法 首先我在这里提出以下问题&#xff0c;一会一起进行探讨 1.什么是最长公共前后缀 2. KMP算法怎么实现对匹配原理 3. 最长公共前后缀怎么求解 KMP算法可以用来解决什么问题&#xff1f; 答&#xff1a;在字符串中匹配子串&#xff0c;也称为模式匹配 分析…...

    2024/4/23 6:16:26
  4. 深入浅出 -- 系统架构之微服务中Nacos的部署

    前面我们提到过&#xff0c;在微服务架构中&#xff0c;Nacos注册中心属于核心组件&#xff0c;通常我们会采用高性能独立服务器进行部署&#xff0c;下面我们一起来看看Nacos部署过程&#xff1a; 1、环境准备 因为Nacos是支持windows和Linux系统的&#xff0c;且服务器操作…...

    2024/4/23 6:26:15
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/25 18:39:24
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/25 18:38:39
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/25 18:39:23
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/25 18:39:20
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/25 13:39:44
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/25 18:39:12
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57