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

相关文章

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

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