最近因为需要学习研究一下FDCANFD\quad CANFDCAN模块,所以买了一块野火的STM32H750XBH6STM32H750XBH6STM32H750XBH6的开发板。拿到开发板之后准备像STM32F103STM32F103STM32F103开发板那样到这里先下载对应的标准库,新建一个小的工程开始。可是我却发现没有H7H7H7系列的标准库了,如图1所示,最后查找资料了解到,STSTST公司目前普遍已经开始使用HALHALHAL库,LLLLLL库等,并且STSTST公司提出了STM32CUBESTM32\quad CUBESTM32CUBE这个概念,希望通过提高软件的可重用性来减少开发时间,节约开发成本。因此在学习STM32H750XBH6STM32H750XBH6STM32H750XBH6的开发板开发板之前,我需要简单的先了解一下以上概念,下面将是我的一个学习的记录。

图1.

图2.

我们先来了解一下HALHALHAL库和LLLLLL库,这部分内容主要参考图2所示的文档,该文档也可以作为我们以后在使用H7H7H7系列芯片的HALHALHAL库和LLLLLL库的时候的参考文档。既然要学习,那我们还是得先把HALHALHAL库和LLLLLL库下载下载看看到底是个什么样子的,我们先定位到图3所示的页面,这时你会发现这个页面就是STM32CubeMXSTM32\quad Cube\quad MXSTM32CubeMX的页面,这个不用惊奇,因为STM32CubeMXSTM32\quad Cube\quad MXSTM32CubeMX和HALHALHAL库,LLLLLL库都是属于STM32CubeSTM32\quad CubeSTM32Cube的一部分。然后我们找到图4里面红圈所标示的STM32CubeH7STM32CubeH7STM32CubeH7,然后点进入就是我们所要找的HALHALHAL库和LLLLLL库的下载地址了,如图5中的红圈所示。然后选择我们所要下载的版本即可,至于图5里面的那个Patch_CubeH7Patch\_CubeH7Patch_CubeH7,我也不知道是个什么软件包,反正是和H7H7H7系列有关的,但是你把它下载下来解压之后,发现它里面的内容和STM32CubeH7STM32CubeH7STM32CubeH7里面的内容基本是一样的。

图3.

图4.

图5.

这个STM32CubeH7STM32CubeH7STM32CubeH7软件包除了有HALHALHAL库和LLLLLL库,还有很多其它的内容,比如STM32STM32STM32的H7H7H7系列的相关开发板的模板工程,示例工程,如图6和图7所示。图8是HALHALHAL库和LLLLLL库的源文件所在目录。

图6.

图7.

图8.

从图8中可以看出,HALHALHAL库和LLLLLL库通过文件名里面的_hal_\_hal\__hal_和_ll_\_ll\__ll_来进行区别,还可以看到的是有些外设的HALHALHAL库驱动不止一个源文件,比如stm32h7xx_hal_spi.cstm32h7xx\_hal\_spi.cstm32h7xx_hal_spi.c和stm32h7xx_hal_spi_ex.cstm32h7xx\_hal\_spi\_ex.cstm32h7xx_hal_spi_ex.c,按照官方文档的描述带有exexex后缀的源文件是外设或模块驱动的扩展文件,它里面包含了某些特定家族或系列芯片所特有功能的驱动,它也有可能包含了对某些通用驱动文件的重写。不带有exexex后缀的源文件驱动是通用的驱动且对于所有的系列都一样,都适用,具有很高的可移植性。HALHALHAL库综上来说被分为了两类,通用驱动和扩展驱动。还有就是针对通用驱动或扩展驱动,对应的驱动源文件也不止一个,比如我们知道USARTUSARTUSART模块有智能卡的功能,在图8中我们可以看到针对USARTUSARTUSART模块的智能卡功能,还专门有驱动源文件stm32h7xx_hal_smartcard.cstm32h7xx\_hal\_smartcard.cstm32h7xx_hal_smartcard.c和stm32h7xx_hal_smartcard_ex.cstm32h7xx\_hal\_smartcard\_ex.cstm32h7xx_hal_smartcard_ex.c对应。LLLLLL库就没有通用驱动和扩展驱动之分,LLLLLL库和HALHALHAL库相比没有那么高的抽象性,LLLLLL库都是直接操作寄存器,因此需要对硬件有比较深的了解,可以说是面向专家级别的,因此LLLLLL库和HALHALHAL库相比移植性也较差。并不是每一种模块或外设都提供了LLLLLL库,对于那些优化不是关键特性,或者需要大量软件配置,或者需要上层协议栈的模块或外设就没有对应的LLLLLL库。

/** @defgroup I2C_Configuration_Structure_definition I2C Configuration Structure definition* @brief  I2C Configuration Structure definition* @{*/
typedef struct
{uint32_t Timing;              /*!< Specifies the I2C_TIMINGR_register value.This parameter calculated by referring to I2C initialization sectionin Reference manual */uint32_t OwnAddress1;         /*!< Specifies the first device own address.This parameter can be a 7-bit or 10-bit address. */uint32_t AddressingMode;      /*!< Specifies if 7-bit or 10-bit addressing mode is selected.This parameter can be a value of @ref I2C_ADDRESSING_MODE */uint32_t DualAddressMode;     /*!< Specifies if dual addressing mode is selected.This parameter can be a value of @ref I2C_DUAL_ADDRESSING_MODE */uint32_t OwnAddress2;         /*!< Specifies the second device own address if dual addressing mode is selectedThis parameter can be a 7-bit address. */uint32_t OwnAddress2Masks;    /*!< Specifies the acknowledge mask address second device own address if dual addressingmode is selected.This parameter can be a value of @ref I2C_OWN_ADDRESS2_MASKS */uint32_t GeneralCallMode;     /*!< Specifies if general call mode is selected.This parameter can be a value of @ref I2C_GENERAL_CALL_ADDRESSING_MODE */uint32_t NoStretchMode;       /*!< Specifies if nostretch mode is selected.This parameter can be a value of @ref I2C_NOSTRETCH_MODE */} I2C_InitTypeDef;

上面的结构体定义是我从文件stm32h7xx_hal_i2c.hstm32h7xx\_hal\_i2c.hstm32h7xx_hal_i2c.h里面复制过来的,用过标准库的应该还是有一种似曾相识的感觉,在标准库中我们就是用这种结构体来对整个模块或外设进行初始化,但是HALHALHAL库相对于标准库具有更高的抽象性,更高的可移植性,为了做到这一点,HALHALHAL库在上面这种结构体的基础之上又包装了一层结构体(GPIO,SYSTICK,NVIC,PWR,RCC,FLASHGPIO,SYSTICK , NVIC, PWR,RCC, FLASHGPIO,SYSTICK,NVIC,PWR,RCC,FLASH等模块没有这种结构体):

/** @defgroup I2C_handle_Structure_definition I2C handle Structure definition* @brief  I2C handle Structure definition* @{*/
typedef struct __I2C_HandleTypeDef
{I2C_TypeDef                *Instance;      /*!< I2C registers base address                */I2C_InitTypeDef            Init;           /*!< I2C communication parameters              */uint8_t                    *pBuffPtr;      /*!< Pointer to I2C transfer buffer            */uint16_t                   XferSize;       /*!< I2C transfer size                         */__IO uint16_t              XferCount;      /*!< I2C transfer counter                      */__IO uint32_t              XferOptions;    /*!< I2C sequantial transfer options, this parameter canbe a value of @ref I2C_XFEROPTIONS */__IO uint32_t              PreviousState;  /*!< I2C communication Previous state          */HAL_StatusTypeDef(*XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);/*!< I2C transfer IRQ handler function pointer */DMA_HandleTypeDef          *hdmatx;        /*!< I2C Tx DMA handle parameters              */DMA_HandleTypeDef          *hdmarx;        /*!< I2C Rx DMA handle parameters              */HAL_LockTypeDef            Lock;           /*!< I2C locking object                        */__IO HAL_I2C_StateTypeDef  State;          /*!< I2C communication state                   */__IO HAL_I2C_ModeTypeDef   Mode;           /*!< I2C communication mode                    */__IO uint32_t              ErrorCode;      /*!< I2C Error code                            */__IO uint32_t              AddrEventCount; /*!< I2C Address Event counter                 */#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Master Tx Transfer completed callback */void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Master Rx Transfer completed callback */void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Slave Tx Transfer completed callback  */void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Slave Rx Transfer completed callback  */void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Listen Complete callback              */void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Memory Tx Transfer completed callback */void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Memory Rx Transfer completed callback */void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Error callback                        */void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Abort callback                        */void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);/*!< I2C Slave Address Match callback */void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Msp Init callback                     */void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c);/*!< I2C Msp DeInit callback                   */#endif  /* USE_HAL_I2C_REGISTER_CALLBACKS */
} I2C_HandleTypeDef;

这种结构体被称之为HandleHandleHandle,可以看到这种HandleHandleHandle结构体把模块寄存器结构体,模块初始化结构体都包含在这个结构体之中,当然还有DMADMADMA的相关结构体。还有就是HALHALHAL库里面已经为我们实现了中断函数的初始版本,我们需要在I2Cx_EV_IRQHandlerI2Cx\_EV\_IRQHandlerI2Cx_EV_IRQHandler和I2Cx_ER_IRQHandlerI2Cx\_ER\_IRQHandlerI2Cx_ER_IRQHandler等函数中调用下面的初始版本函数。HALHALHAL库里面也有大量的回调函数,至于这种回调函数的具体使用,我现在也不是太清楚,只有在具体使用过HALHALHAL库之后才能对这一机制有比较清晰的了解,我只知道这种回调函数主要在中断机制中被调用。文件stm32h7xx_hal_i2c.hstm32h7xx\_hal\_i2c.hstm32h7xx_hal_i2c.h中,初始版本的中断函数以及回调函数声明如图9所示。还有这些回调函数一般都是被声明为__weak\_\_weak__weak属性,如图10所示,也就是用户可以定义一个同名的函数,且最后调用这个名字的函数时,如果用户重新定义了这个函数,则实际调用的是用户定义的这个函数。

void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c);
void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c);

图9.

图10.

图11是HALHALHAL库中头文件的包含结构示意图。虽然HALHALHAL库和LLLLLL库的头文件和源文件都各自的在同一个文件夹中,但是HALHALHAL库和LLLLLL库都是相互独立的,相互之间没有依赖关系。虽然如此,HALHALHAL库和LLLLLL库都可以各自独立使用,但是也可以结合使用。我们前面提到过LLLLLL库基本都是直接操作寄存器的,有朋友可能会想到LLLLLL库是不是就是和标准库差不多,但是等你打开LLLLLL库的源文件和头文件之后你就不会有这样的想法了。文件stm32h7xx_ll_i2c.cstm32h7xx\_ll\_i2c.cstm32h7xx_ll_i2c.c里面只有和初始化和恢复默认值的几个接口函数,如图12所示,但是我看单独使用LLLLLL库的例子中基本可以不用这几个函数。然后其它的接口函数都定义在文件stm32h7xx_ll_i2c.hstm32h7xx\_ll\_i2c.hstm32h7xx_ll_i2c.h中,且这些接口都是直接操作寄存器的,并都定义为__inline\_\_inline__inline,即内联,函数类型。如图13所示。

图11.

图12.

图13.

STM32CubeSTM32\quad CubeSTM32Cube是STSTST公司的一项原始创新,这一项原始创新通过减少开发成本,时间来提高开发者的效率。STM32CubeSTM32\quad CubeSTM32Cube基本上涵盖了所有的STSTST公司的系列信号芯片。STM32CubeSTM32\quad CubeSTM32Cube包含几部分内容,STM32CubeMXSTM32\quad CubeMXSTM32CubeMX是STM32CubeSTM32\quad CubeSTM32Cube其中的一部分,STM32CubeSTM32\quad CubeSTM32Cube所包含的内容如图14所示。

图14.

图15.

图16.

STM32CubeMXSTM32\quad CubeMXSTM32CubeMX是一种图形化工具,我开始听说它的时候,我以为从此之后STM32STM32STM32所有的代码开发都可以通过简单的点点鼠标就可以了,但是通过我的了解之后我还是觉得我想多了。下面我对STM32CubeMXSTM32\quad CubeMXSTM32CubeMX的介绍都是基于图15的文档。STM32CubeMXSTM32\quad CubeMXSTM32CubeMX具有图16所示的特性,但是向我们这种初学者话,用的比较多的可能就是图16中红圈中的功能,也就是构建初始化工程,以及生成时钟配置函数(这里要注意的是HALHALHAL库在芯片上电复位调用的voidSystemInit(void)void\quad SystemInit (void)voidSystemInit(void)函数里面是没有调用像标准库里面那样的配置时钟的函数,voidSetSysClock(void)void\quad SetSysClock (void)voidSetSysClock(void),的,这种时钟配置函数要么我们自己实现或者使用STM32CubeMXSTM32\quad CubeMXSTM32CubeMX来生成,当然使用STM32CubeMXSTM32\quad CubeMXSTM32CubeMX来生成还是方便很多)。

图17.

图18.

STM32CubeMXSTM32\quad CubeMXSTM32CubeMX的下载地址如图18所示,选择相应的版本下载就可以。这里因为我也是初学,我就不详细的去介绍STM32CubeMXSTM32\quad CubeMXSTM32CubeMX,具体的细节可以参考图15的文档。下面我直接介绍一下一个最基础的构建工程模板的过程。STM32CubeMXSTM32\quad CubeMXSTM32CubeMX打开之后的界面如图19所示,这时可以通过点击红框中的ACCESSTOMCUSELECTORACCESS\quad TO\quad MCU\quad SELECTORACCESSTOMCUSELECTOR或FileFileFile下拉菜单的NewProjectNew\quad ProjectNewProject来开始新建STM32CubeMXSTM32\quad CubeMXSTM32CubeMX工程。之后的页面如图20所示,这时我们需要根据自己的芯片型号来选择对应的芯片型号,图20左边的是搜索你的预期芯片的一些过滤选项,设置好之后就会出现相关的芯片型号,如图20的右下角所示,因为我这边的开发板的芯片的型号为STM32H750XBH6STM32H750XBH6STM32H750XBH6,所以我这里点击选中该型号(注意这里鼠标一定要点击,不然右上角的StartProjectStart\quad ProjectStartProject将会是灰色的),然后点击StartProjectStart\quad ProjectStartProject。

图19.

图20.

接下来将会出现图21所示的界面,这个提示应该是和MPUMPUMPU相关的,这里关系应该不太大,选YesYesYes或NoNoNo应该都可以,但是它建议你选择YesYesYes。接下来就会出现图22所示的界面,这时我们先点击一下ProjectManagerProject\quad ManagerProjectManager配置一下工程的名字,存放位置,生成的模板工程使用的IDEIDEIDE(这里我使用的是KEILKEILKEIL,因此这里我选择的是MDK−ARMMDK-ARMMDK−ARM),模板工程堆和栈空间的大小等等,当然还有其它一些选项,大家可以参考图15的文档。

图21.

图22.

图23.

接下来我们来配置一下系统的时钟,因为我们这里准备使用HSEHSEHSE作为时钟源,因此这里我们首先要在图23所在的PinoutConfigurationPinout\quad ConfigurationPinoutConfiguration界面使能HSEHSEHSE,然后我们切换到图25所示的时钟配置界面,因为野火的开发板的HSEHSEHSE时钟为25MHZ25MHZ25MHZ,因此这里HSEHSEHSE时钟的输入频率方框我们填25MHZ25MHZ25MHZ。我们这里配置HSEHSEHSE时钟5分频,然后160倍频之后再除以2,PLLPLLPLL时钟源选择HSEHSEHSE,系统时钟源选择PLLPLLPLL,因此配置的系统时钟,SYSCLKSYSCLKSYSCLK,的频率为400MHZ400MHZ400MHZ,HCLKHCLKHCLK的频率为200MHZ200MHZ200MHZ,APB1APB1APB1,APB2APB2APB2,APB,3APB,3APB,3和APB4APB4APB4的频率都为100MHZ100MHZ100MHZ。这里的模板工程我想用简单的USARTUSARTUSART模块的通信来验证,因此这里我在图25的界面也简单的配置了一下USART1USART1USART1模块,这些配置好之后,我们点击一下图25中右上角的GENERATECODEGENERATE\quad CODEGENERATECODE就可以生成我们的模板工程了。

图24.

图25.

当然我们也可以自己手动构建模板工程。这个过程其实和STM32F103STM32F103STM32F103的标准库的手动构建工程模板的工程基本一样,可以参考一下我的这篇文章,只是在细节上会有一些差别。首先我们还是先新建一些文件夹来把需要的各个源文件放置好,我们首先将图26的文件夹中的所有文件放在一个新建的名字位corecorecore的文件夹中,这个文件夹里面基本都是和内核有关的文件,虽然这里面有很多文件,但是实际的工程里面用到可能就几个而已,但是为了方便我这里把他们全部都放进来了。然后新建一个叫useruseruser的文件夹,然后找到H750H750H750的模板工程,并将图26和图27里面的main.cmain.cmain.c和main.hmain.hmain.h文件复制到这个文件夹里面,当然你也可以自己生成这两个文件。然后新建一个叫halhalhal的文件夹,将图28里面的IncIncInc文件夹和SrcSrcSrc文件夹放到这个文件夹里面,这两个文件夹里面分别是HALHALHAL库和LLLLLL库的头文件和源文件。然后新建一个叫做start_upstart\_upstart_up的文件夹并将图29中红圈标示的启动文件放在这个文件夹里面。然后分别新建projectprojectproject,obj_outputobj\_outputobj_output以及listinglistinglisting三个文件夹,这三个文件夹分别用来放项目配置文件,编译输出的中间文件以及listlistlist文件。然后新建一个stmstmstm文件夹,这个文件夹里面又新建了两个文件夹,IncludeIncludeInclude和SourceSourceSource,然后将图30和图31的头文件放到IncludeIncludeInclude文件夹里面。然后将图32里面的三个红圈标示的源文件放到SourceSourceSource文件夹里面。图31和图32的目录和前面取main.cmain.cmain.c和main.hmain.hmain.h文件得目录都是同一个模板工程。

的文件也是STSTST公司提供的一个模板工程的目录里面。但是其实这里

图26.

图27.

图28.

图29.

图30.

图31.

图32.

因为main.cmain.cmain.c和main.hmain.hmain.h文件这两个文件是我们从模板工程里面复制出来的,可能编译会有错误,因此我们需要根据自己的需求做相应的修改。还有就是图33中的stm32h7xx_hal_msp_template.cstm32h7xx\_hal\_msp\_template.cstm32h7xx_hal_msp_template.c,这个文件在使用的时候需要去掉templatetemplatetemplate关键字,然后复制到对应的目录并根据需求做相应的修改,从这个文件的名字我们也可以看出,这是一个模板文件,由于我们已经从模板工程里面获取了这个文件,因此这个文件就不要参与编译了,同样图34中那几个红圈中的文件名带有templatetemplatetemplate关键字的文件也都不要参与编译了,否则可能会有错误,在有相应需求的时候再把它们修改之后再参与编译。另外还要注意一下systemstm32h7xx.csystem_stm32h7xx.csystems​tm32h7xx.c这个文件,前面也提到过了这个文件是从STM32CubeH7STM32CubeH7STM32CubeH7固件包里面的H750H750H750模板工程复制过来的,STM32CubeH7STM32CubeH7STM32CubeH7固件包里面有很多的H750有很多的H750有很多的H750示例工程,每一个工程里面都有这个文件,如果你仔细去看的话有些工程的这个文件与其它的工程有一定的差异,主要是voidSystemInit(void)void\quad SystemInit (void)voidSystemInit(void)这个函数,比如QSPIQSPIQSPI的示例工程,或者是从外部存储器启动的示例工程,这应该是这些工程的特殊目的造成的,所以如果我们有相应的特殊需求的时候systemstm32h7xx.csystem_stm32h7xx.csystems​tm32h7xx.c这个文件可以参考相应的工程,对于一般的工程我们直接从图32的模板工程里面去取。这里要注意的是在我构建的这个模板工程中,文件systemstm32h7xx.csystem_stm32h7xx.csystems​tm32h7xx.c中的voidSystemInit(void)void\quad SystemInit (void)voidSystemInit(void)函数的一个位置需要注意一下,如图35所示,这里有一个宏需要定义一下,这个宏定义了你预期的程序代码放置的首地址,因为我这里预期从内部FLASHFLASHFLASH启动,所以在图36中这个宏我定义位内部FLASHFLASHFLASH的起始地址0x080000000x080000000x08000000,在图36里面的PreprocessorSymbolsPreprocessor\quad SymbolsPreprocessorSymbols的位置我还加上了宏USE_HAL_DRIVERUSE\_HAL\_DRIVERUSE_HAL_DRIVER,USE_FULL_LL_DRIVERUSE\_FULL\_LL\_DRIVERUSE_FULL_LL_DRIVER以及STM32H750xxSTM32H750xxSTM32H750xx因为这样就可以同时使用HALHALHAL库和LLLLLL库,当然你也可以根据你自己的需求定义宏USE_HAL_DRIVERUSE\_HAL\_DRIVERUSE_HAL_DRIVER和宏USE_FULL_LL_DRIVERUSE\_FULL\_LL\_DRIVERUSE_FULL_LL_DRIVER中的一个。因为我这里使用的芯片是STM32H750XBH6STM32H750XBH6STM32H750XBH6,因此需要定义宏STM32H750xxSTM32H750xxSTM32H750xx。有了以上准备再参考一下我用STM32F103STM32F103STM32F103的标准库的手动构建工程模板的流程,看这里,基本上建立一个工程模板是没有问题的。我的模板工程在这里。

图34.

图35.

图36.

STM32 Cube MX以及STM32 H750 XBH6新建工程,HAL库,LL库相关推荐

  1. STM32 Cube MX学习笔记——TOF 高速单线激光雷达 L10(usart)

    STM32 Cube MX学习笔记--TOF 高速单线激光雷达 L10_串口中断通信 1. TOF 高速单线激光雷达 L10 2. STM32 Cube MX配置 3.代码配置 4.编译 烧录 显示 ...

  2. STM32+Cube MX使用MPU6050 DMP时,在外部中断中调用read_dmp函数发生系统卡死问题的根本原因分析

    系统环境 硬件: MCU:STM32F405RGT6 IMU:MPU6050 软件: 开发环境:KEIL MDK-ARM uVision5 MPU6050使用DMP 复现步骤 程序中MPU6050 D ...

  3. STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用

    此为软件模拟IIC,可以直接移植到HAL库使用..h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论. 使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是 ...

  4. STM32 Cube mx的MDK项目编译报错与debug

    1.error while deleting file 解决步骤:项目路径不能有中文.  2."No section matches selector - no section to be ...

  5. stm32.cube介绍

    stm32.cube(一)--系统架构及目录结构 stm32.cube(二)--HAL结构及初始化 stm32.cube(三)--HAL.GPIO stm32.cube(四)--HAL.ADC stm ...

  6. har文件解析工具_嵌入式MCU也能跑AI?STM32 Cube.AI工具包使用初探

    STM32近日推出了Cube.AI人工智能神经网络开发工具包,目标是将AI引入微控制器供电的智能设备,位于节点边缘,以及物联网,智能建筑,工业和医疗应用中的深度嵌入式设备. 简而言之,以后就可以在嵌入 ...

  7. 使用STM32Cube MX为STM32 CAN总线快速配置上手教程_HAL库_CAN协议_STM32_附波特率计算工具

    使用STM32Cube MX为STM32 CAN总线快速上手教程_HAL库_CAN协议_STM32 前言 博主也是刚接触CAN协议的新手,如有不对的地方欢迎交流 本文旨在使用STM32Cube MX快 ...

  8. 使用STM32 CUBE IDE配置STM32F7 用DMA传输多通道ADC数据

    我的使用环境: 硬件:STM32F767ZGT6.串口1.ADC1.16MHz晶振.216MHz主频 软件:STM32 CUBE IDE 优点:不用定时触发采样,ADC数据是不停的实时更新,ADC数据 ...

  9. STM32 Cube IDE HAL库驱动 W25Q128 进行读、写、擦除操作

    一.W25Q128相关理论 W25Q128存储大小为128M-bit=16MB,可编程位(地址)为Flash_Size=16*1024*1024=16777216 B. W25Q128包含256个块. ...

最新文章

  1. 冒泡排序_python实现冒泡排序
  2. 年终收藏!吴恩达盘点2020年度AI热门事件
  3. Python Django 重写delete方法实现单个对象的删除
  4. Anytime项目开发记录3
  5. Android应用程序键盘(Keyboard)消息处理机制分析(19)
  6. NetScaler的cookieinsert和sourceip联合保持机制
  7. 图像增强—彩色增强技术
  8. P2627 [USACO11OPEN]Mowing the Lawn G(单调队列优化dp)
  9. 苹果设备的微信数据收集
  10. 【AE表达式】下载的模板表达式报错?大多数都是小问题!
  11. 关于MyBatis的分页
  12. 中国五大移动应用商店携手启动 64 位安卓生态迁移 | 开发者说·DTalk
  13. 全球与中国混合二甲苯市场深度研究分析报告
  14. 基于php鞋城的开发,基于SSH框架技术的B2C网上鞋城的设计和实现(MySQL)(精品)★
  15. Educational Codeforces Round 99 (Rated for Div. 2)
  16. STM32驱动十个步进电机
  17. 吸引170万人次看直播!戴尔科技峰会,玩儿真的
  18. ActiveMQ学习笔记07 - 优缺点
  19. 小程序分销平台商城开发系统
  20. 数论之求质数的几种方法

热门文章

  1. JAVA超市进销存管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  2. Vue3+springboot+mybatis-pius实现分页功能
  3. 粒子群算法优化的OTSU图像分割
  4. 解决微信小程序video属性controls失效问题
  5. linux显示全部字符集,linux 字符集 页面显示乱码
  6. Dalvik和ART的区别
  7. <JDBC> 获取数据库连接的五种方式:你真的get到了吗?
  8. 建筑施工借助物联网卡保障高楼安全
  9. mc服务器修改生物上限,MC修改最多的生物,无论是什么样子,我们都喜欢
  10. 化繁为简 海云捷迅为企业提供应用OpenStack新“姿势”