STM32F1+SSD1963+4.58寸TFT屏幕移植FreeRTOS+ENWIM(已移植完,抽空补文章)

2023-12-14 08:40

本文主要是介绍STM32F1+SSD1963+4.58寸TFT屏幕移植FreeRTOS+ENWIM(已移植完,抽空补文章),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         最近正在进行一个项目的开发,屏幕使用的是4.58寸长条屏幕,驱动是ST7701,该屏幕接口有点特殊,既有SPI接口,又有RGB接口,说实话刚拿到这款屏幕,我竟无从下手,问询了厂家技术支持,了解到这个屏幕需要先用SPI进行ST7701的配置,再通过RGB数据线写像素点。

                                                            HYS-4.58UT4S2P001
屏幕的实物图以及接口定义如上图所示,接下来就进行电路设计了,使用主控芯片型号是STM32103VET6(这个芯片有些啥功能就不介绍了,大家可以下载datasheet自行查看)主要是支持FSMC接口,引脚足够多,屏幕控制器使用SSD1963,设计之初想的使用8080模式,RGB565来实现屏幕的驱动。
再提一嘴,这个屏幕背光供电是12V,整个硬件系统是3.3V,SSD1963某些引脚需要1.2V供电,我这边引入了两路电,一路是5V,通过两个LDO分别转3.3V和1.2V,另一路12V输入仅供给屏幕背光,这样整套系统的“血管”就建立完成了。
接下来进行电路的设计,SSD1963部分原理图如下,这个芯片好是好,就是电源引脚太多了,画原理图的时候还好一点,等到了画PCB的时候,真的会原地裂开,SSD1963上半部分引脚连到了主控芯片,下半部分连到了屏幕,所以在画PCB布局的时候,SSD1963介于主控芯片和屏幕之间再好不过了。

我也是第一次在CSDN上发表自己的文章,插入的图片不知道是否可以单击放大,先发表试试看,如果不能放大的话我会再发一篇文章,上图是主控芯片及SSD1963的引脚连接图,大家可以按照我这样来接线,注意一下SSD1963第128引脚,该引脚功能是CONF,通过电平高低来确定SSD1963工作在哪种模式( 6800 or 8080 )数据手册给出CONF引脚接VDDIO也就是3.3V可以配置为8080工作模式,因此R10电阻不焊接,仅焊接R2即可。SSD1963数据命令引脚,第122号引脚连接到了主控芯片FSMC_A16,了解过FSMC大家可以知道,我这套连接方式使用了NE1,基地址为0x60000000,通过A16来确定命令还是数据地址
//    地址线接A16  其中高4位固定为6
//    0110  0000  0000  0001       0110  0000  0000  0000
//    0000  0000  0000  0000       0000  0000  0000  0000
又因为涉及对齐问题,需要左移一位

//    当A17为1时表示数据读写地址  当A17为0时表示指令读写地址
//    0110  0000  0000  0010       0110  0000  0000  0000
//    0000  0000  0000  0000       0000  0000  0000  0000
因此我们可以在头文件中定义数据读写地址和指令读写地址
#define  SSD1963_DATA_RW_ADDR      ( ( uint32_t ) 0x60020000 )  //数据读写地址
#define  SSD1963_CMD_W_ADDR         ( ( uint32_t ) 0x60000000 )  //指令读写地址
在C文件中封装具体读写函数

//SSD1963写命令
void SSD1963_Write_Cmd ( uint16_t usCmd )
{
    * ( __IO uint16_t * ) ( SSD1963_CMD_W_ADDR ) = usCmd;

}
//SSD1963写数据
void SSD1963_Write_Data ( uint16_t usData )
{
    * ( __IO uint16_t * ) ( SSD1963_DATA_RW_ADDR ) = usData;
}

到这里主机给SSD1963写命令及写数据就实现了,主要就是地址对齐这里会有点问题,接下来在附上FSMC的IO初始化及FSMC初始化代码(完整版)

/******************配置FSMC有关的宏定义-开头****************************/
//地址线接A16  其中高4位固定为6
//   当A17为1时表示数据读写地址  当A17为0时表示指令读写地址
//    0110  0000  0000  0001       0110  0000  0000  0000
//    0000  0000  0000  0000       0000  0000  0000  0000
//涉及对齐 须左移一位
#define  SSD1963_DATA_RW_ADDR      ( ( uint32_t ) 0x60020000 )  //数据读写地址
#define  SSD1963_CMD_W_ADDR         ( ( uint32_t ) 0x60000000 )  //指令读写地址

/*A地址信号线*/    
#define SSD1963FSMC_A16_GPIO_PORT        GPIOD
#define SSD1963FSMC_A16_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_A16_GPIO_PIN            GPIO_Pin_11

/*D 数据信号线*/
#define SSD1963FSMC_D0_GPIO_PORT          GPIOD
#define SSD1963FSMC_D0_GPIO_CLK             RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D0_GPIO_PIN              GPIO_Pin_14

#define SSD1963FSMC_D1_GPIO_PORT          GPIOD
#define SSD1963FSMC_D1_GPIO_CLK             RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D1_GPIO_PIN              GPIO_Pin_15

#define SSD1963FSMC_D2_GPIO_PORT          GPIOD
#define SSD1963FSMC_D2_GPIO_CLK             RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D2_GPIO_PIN              GPIO_Pin_0

#define SSD1963FSMC_D3_GPIO_PORT          GPIOD
#define SSD1963FSMC_D3_GPIO_CLK             RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D3_GPIO_PIN              GPIO_Pin_1

#define SSD1963FSMC_D4_GPIO_PORT          GPIOE
#define SSD1963FSMC_D4_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D4_GPIO_PIN              GPIO_Pin_7

#define SSD1963FSMC_D5_GPIO_PORT          GPIOE
#define SSD1963FSMC_D5_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D5_GPIO_PIN              GPIO_Pin_8

#define SSD1963FSMC_D6_GPIO_PORT          GPIOE
#define SSD1963FSMC_D6_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D6_GPIO_PIN              GPIO_Pin_9

#define SSD1963FSMC_D7_GPIO_PORT          GPIOE
#define SSD1963FSMC_D7_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D7_GPIO_PIN              GPIO_Pin_10

#define SSD1963FSMC_D8_GPIO_PORT          GPIOE
#define SSD1963FSMC_D8_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D8_GPIO_PIN              GPIO_Pin_11

#define SSD1963FSMC_D9_GPIO_PORT          GPIOE
#define SSD1963FSMC_D9_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D9_GPIO_PIN              GPIO_Pin_12

#define SSD1963FSMC_D10_GPIO_PORT        GPIOE
#define SSD1963FSMC_D10_GPIO_CLK           RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D10_GPIO_PIN            GPIO_Pin_13

#define SSD1963FSMC_D11_GPIO_PORT        GPIOE
#define SSD1963FSMC_D11_GPIO_CLK           RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D11_GPIO_PIN            GPIO_Pin_14

#define SSD1963FSMC_D12_GPIO_PORT        GPIOE
#define SSD1963FSMC_D12_GPIO_CLK           RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D12_GPIO_PIN            GPIO_Pin_15

#define SSD1963FSMC_D13_GPIO_PORT        GPIOD
#define SSD1963FSMC_D13_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D13_GPIO_PIN            GPIO_Pin_8

#define SSD1963FSMC_D14_GPIO_PORT        GPIOD
#define SSD1963FSMC_D14_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D14_GPIO_PIN            GPIO_Pin_9

#define SSD1963FSMC_D15_GPIO_PORT        GPIOD
#define SSD1963FSMC_D15_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D15_GPIO_PIN            GPIO_Pin_10

/*控制信号线*/  
/*CS片选*/
#define SSD1963FSMC_CS_GPIO_PORT         GPIOD
#define SSD1963FSMC_CS_GPIO_CLK            RCC_APB2Periph_GPIOD
#define SSD1963FSMC_CS_GPIO_PIN             GPIO_Pin_7

/*WE写使能*/
#define SSD1963FSMC_WE_GPIO_PORT        GPIOD
#define SSD1963FSMC_WE_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_WE_GPIO_PIN            GPIO_Pin_5

/*OE读使能*/
#define SSD1963FSMC_OE_GPIO_PORT         GPIOD
#define SSD1963FSMC_OE_GPIO_CLK            RCC_APB2Periph_GPIOD
#define SSD1963FSMC_OE_GPIO_PIN             GPIO_Pin_4


/*FSMC_NWAIT*/
#define SSD1963FSMC_NWAIT_GPIO_PORT     GPIOD
#define SSD1963FSMC_NWAIT_GPIO_CLK        RCC_APB2Periph_GPIOD
#define SSD1963FSMC_NWAIT_GPIO_PIN         GPIO_Pin_6

/*FSMC_RESET*/
#define SSD1963FSMC_RESET_GPIO_PORT     GPIOD
#define SSD1963FSMC_RESET_GPIO_CLK        RCC_APB2Periph_GPIOD
#define SSD1963FSMC_RESET_GPIO_PIN         GPIO_Pin_3


//RES设置高低
#define   SSD1963FSMC_RES_LOW      GPIO_ResetBits( SSD1963FSMC_RESET_GPIO_PORT, SSD1963FSMC_RESET_GPIO_PIN )
#define   SSD1963FSMC_RES_HIGH     GPIO_SetBits( SSD1963FSMC_RESET_GPIO_PORT, SSD1963FSMC_RESET_GPIO_PIN )
/******************配置FSMC有关的宏定义-结尾****************************/

/*******************FSMC初始化相关函数-开头******************/
//FSMC的GPIO初始化
void FSMC_GPIO_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
 
    /* 使能SRAM相关的GPIO时钟 */
    RCC_APB2PeriphClockCmd(SSD1963FSMC_A16_GPIO_CLK|
         SSD1963FSMC_D0_GPIO_CLK | SSD1963FSMC_D1_GPIO_CLK | SSD1963FSMC_D2_GPIO_CLK | 
         SSD1963FSMC_D3_GPIO_CLK | SSD1963FSMC_D4_GPIO_CLK | SSD1963FSMC_D5_GPIO_CLK |
         SSD1963FSMC_D6_GPIO_CLK | SSD1963FSMC_D7_GPIO_CLK | SSD1963FSMC_D8_GPIO_CLK |
         SSD1963FSMC_D9_GPIO_CLK | SSD1963FSMC_D10_GPIO_CLK| SSD1963FSMC_D11_GPIO_CLK|
         SSD1963FSMC_D12_GPIO_CLK| SSD1963FSMC_D13_GPIO_CLK| SSD1963FSMC_D14_GPIO_CLK|
         SSD1963FSMC_D15_GPIO_CLK|


         /*控制信号线*/
         SSD1963FSMC_CS_GPIO_CLK | SSD1963FSMC_WE_GPIO_CLK | SSD1963FSMC_OE_GPIO_CLK |
         SSD1963FSMC_NWAIT_GPIO_CLK | SSD1963FSMC_RESET_GPIO_CLK, ENABLE);


     /*-- GPIO 配置 -----------------------------------------------------*/

    /* 通用 GPIO 配置 */
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;       //配置为推挽复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     

    /*A地址信号线 针对引脚配置*/
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_A16_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_A16_GPIO_PORT, &GPIO_InitStructure);

    /*DQ数据信号线 针对引脚配置*/
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D0_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D0_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D1_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D1_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D2_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D2_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D3_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D3_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D4_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D4_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D5_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D5_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D6_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D6_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D7_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D7_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D8_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D8_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D9_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D9_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D10_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D10_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D11_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D11_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D12_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D12_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D13_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D13_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D14_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D14_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D15_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D15_GPIO_PORT, &GPIO_InitStructure);

    /*控制信号线*/
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_CS_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_CS_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_WE_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_WE_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_OE_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_OE_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;    //NWAIT配置为浮空输入
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_NWAIT_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_NWAIT_GPIO_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_RESET_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;              //配置为推挽复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SSD1963FSMC_RESET_GPIO_PORT, &GPIO_InitStructure);
}

//初始化FSMC模式      时序结构体作为一个指针写进初始化结构体中
static void FSMC_Mode_Config(void)
{
    FSMC_NORSRAMTimingInitTypeDef  ReadTimInitStruct;
    FSMC_NORSRAMInitTypeDef        SRAMInitStruct;

    //使能AHB时钟  FSMC
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
    
    ReadTimInitStruct.FSMC_AccessMode = FSMC_AccessMode_B;
    ReadTimInitStruct.FSMC_AddressHoldTime = 0x00;
    ReadTimInitStruct.FSMC_AddressSetupTime = 0x01;
    ReadTimInitStruct.FSMC_BusTurnAroundDuration = 0x00;
    ReadTimInitStruct.FSMC_CLKDivision = 0x00;
    ReadTimInitStruct.FSMC_DataLatency = 0x00;
    ReadTimInitStruct.FSMC_DataSetupTime = 0x04;
    
    //使用的结构体
    SRAMInitStruct.FSMC_Bank = FSMC_Bank1_NORSRAM1;         //设置要控制的BANK区域
    SRAMInitStruct.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //设置数据宽度
    SRAMInitStruct.FSMC_MemoryType = FSMC_MemoryType_NOR;          //设置存储器的类型
    SRAMInitStruct.FSMC_WriteOperation = FSMC_WriteOperation_Enable;   //设置是否写使能
    
    //SSD1963未使用
    SRAMInitStruct.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;//突发访问模式
    SRAMInitStruct.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; 
    SRAMInitStruct.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //数据地址复用
    SRAMInitStruct.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   //是否使能等待状态插入
    SRAMInitStruct.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; 
    SRAMInitStruct.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;  //等待信号极性
    SRAMInitStruct.FSMC_WrapMode = FSMC_WrapMode_Disable; //是否支持对齐的突发模式
    SRAMInitStruct.FSMC_WriteBurst = FSMC_WriteBurst_Disable;      //是否使能写突发操作
    SRAMInitStruct.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;  //是否使能拓展模式
    
    //读写时序结构体
    SRAMInitStruct.FSMC_ReadWriteTimingStruct = &ReadTimInitStruct;
    SRAMInitStruct.FSMC_WriteTimingStruct = &ReadTimInitStruct;
    
    //配置写入到寄存器
    FSMC_NORSRAMInit(&SRAMInitStruct);
    //使能FSMC
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1,ENABLE);
}
//FSMC初始化
void FSMC_Init(void)
{
    //FSMC的GPIO初始化
    FSMC_GPIO_Init();
    //FSMC的模式初始化
    FSMC_Mode_Config();
    
    SSD1963FSMC_RES_LOW;
    Delay_1Ms(10);
    SSD1963FSMC_RES_HIGH;
}
/*******************FSMC初始化相关函数-结尾******************/

这篇关于STM32F1+SSD1963+4.58寸TFT屏幕移植FreeRTOS+ENWIM(已移植完,抽空补文章)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/491858

相关文章

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

FreeRTOS学习笔记(六)队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列的基本内容1.1 队列的引入1.2 FreeRTOS 队列的功能与作用1.3 队列的结构体1.4 队列的使用流程 二、相关API详解2.1 xQueueCreate2.2 xQueueSend2.3 xQueueReceive2.4 xQueueSendFromISR2.5 xQueueRecei

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.