足球投注app而一个串口设备它需要一个 MCU 来承载-足球直播app哪个好用
发布日期:2024-10-07 05:09 点击次数:158绪言足球投注app
比拟较早几年使用圭臬库开发来讲,最近几年HAL库的使用是越来越多,那么咱们开发应当使用哪一种呢,本文留神先容常用的几种开发方式及互相之间的区别,白猫也好、黑猫也好,握到耗子等于好猫。
STM32三种开发方式
平淡生手在初学STM32的时候,最初都要先采取一种要用的开发方式,不同的开发方式会导致你编程的架构是皆备不一样的。一般大多数都会选用圭臬库和HAL库,而少许部分东说念主融会过径直竖立寄存器进行开发。
网上对于圭臬库、HAL库的神情深信是恶积祸盈。然而一个对于许多刚初学的一又友照旧没法很直不雅的去确凿了解这些不同开发发方式相互之间的区别,是以笔者念念以一种十分直白的方式,用我方的解析去将这些东西表述出来,淌若有神情的不合的处所或者是不同见地的也不错环球提议。
1、径直竖立寄存器
不少先学了51的一又友可能会知说念,会有一小部分东说念主或是教程是通过汇编讲话径直操作寄存器兑现功能的,这种设施到了STM32就变得不太容易行得通了,因为STM32的寄存器数目是51单片机的十数倍,如斯多的寄存器根柢无法一皆牵记,开发时需要平淡的翻查芯片的数据手册,此时径直操作寄存器就变得十分的力图了。但照旧会有很小一部分东说念主,可爱去径直操作寄存器,因为这样更接近道理,知其然也知其是以然。
2、圭臬库
上头也提到了,STM32有十分多的寄存器,而导致了开发费劲,是以为此ST公司就为每款芯片都编写了一份库文献,也等于工程文献里stm32F1xx…之类的。在这些 .c .h文献中,包括一些常用量的宏界说,把一些外设也通过结构体变量封装起来,如GPIO口时钟等。是以咱们只需要竖立结构体变量成员就不错修改外设的竖立寄存器,从而采取不同的功能。亦然现时最多东说念主使用的方式,亦然学习STM32战斗最多的一种开发方式,我也就未几发达了。
3、HAL库
HAL库是ST公司现时主力推的开发方式,全称等于Hardware Abstraction Layer(概述印象层)。库如其名,很概述,一眼看上去不太容易知说念他的作用是什么。
它的出现比圭臬库要晚,但其实和圭臬库一样,都是为了节俭表率开发的技术,而且HAL库尤其的有用,淌若说圭臬库把兑现功能需要竖立的寄存器集成了,那么HAL库的一些函数以致不错作念到某些特定功能的集成。也等于说,相似的功能,圭臬库可能要用几句话,HAL库只需用一句话就够了。
况兼HAL库也很好的照顾了表率移植的问题,不同型号的stm32芯片它的圭臬库是不一样的,举例在F4上开发的表率移植到F3上是弗成通用的,而使用HAL库,只须使用的是重复的外设,表率基本不错皆备复制粘贴,珍贵是重复外设,真理也等于弗成口耳之学,举例F7比F3要多几个定时器,弗成明明莫得这个定时器却非要竖立,但其实这种情况未几,绝大多数都不错径直复制粘贴。是而且使用ST公司研发的STMcube软件,不错通过图形化的竖建功能,径直生成通盘使用HAL库的工程文献,不错说是便捷绝顶,但是便捷的同期也形成了它扩充成果的低下,在各式论坛帖子简直是被吐槽的恶积祸盈。
HAL库固件库安设与用户手册
1、最初确立让Cube不错自动联网下载联系固件库采取updater Settings
确立如下
2、字据芯片采取所需固件
版块是向下兼容的,不错径直采取最新版。但淌若合计最新版太大,不错阅读底下的Main Changes.粗略撑持你现时的芯片就好。
选好了,点击Install Now就行,过程可能有点长。建议径直官网下载到腹地,再安设文献会被下载到如下位置,建议改造此目次,不要选在C盘!!!
3、寻找用户匡助手册
插足固件所在文献夹,里面包含许多内容。
比如说 官方提供的开发板表率,每个型号底下都有对应功能的兑现,用户手册就在Drivers文献夹底下。
用户手册就在Drivers文献夹底下。
STM32 HAL库与圭臬库的区别
1、句柄
句柄(handle),有多种道理,其中第一种是指表率蓄意,第二种是指Windows编程。当今大部分都是指表率蓄意/表率开发这类。
第一种证明:句柄是一种迥殊的智能指针 。当一个应用表率要援用其他系统(如数据库、操作系统)所照顾的内存块或对象时,就要使用句柄。第二种证明:通盘Windows编程的基础。一个句柄是指使用的一个惟一的整数值,即一个4字节(64位表率中为8字节)长的数值,来标记应用表率中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,移动条,输出设备,控件或者文献等。应用表率粗略通过句柄拜谒相应的对象的信息,但是句柄不是指针,表率弗成期骗句柄来径直阅读文献中的信息。淌若句柄不在I/O文献中,它是毫无须处的。句柄是Windows用来符号应用表率中开发的或是使用的惟一整数,Windows大都使用了句柄来标记对象。
STM32的圭臬库中,句柄是一种迥殊的指针,平淡指向结构体!
在STM32的圭臬库中,假定咱们要启动化一个外设(这里以USART为例),咱们最初要启动化他们的各个寄存器。在圭臬库中,这些操作都是期骗固件库结构体变量+固件库Init函数兑现的:
USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据方法USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个罢手位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流甩手USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式USART_Init(USART3, &USART_InitStructure); //启动化串口1
不错看到,要启动化一个串口,需要:
1、对六个位置进行赋值2、然后盾用Init函数
USART_InitStructure并不是一个全局结构体变量,而是只在函数里面的局部变量,启动化完成之后,USART_InitStructure就失去了作用。而在HAL库中,相似是USART启动化结构体变量,咱们要界说为全局变量。
UART_HandleTypeDef UART1_Handler;
结构体成员
typedef struct{ USART_TypeDef *Instance; /*!< UART registers base address */ UART_InitTypeDef Init; /*!< UART communication parameters */uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */uint16_t TxXferSize; /*!< UART Tx Transfer size */uint16_t TxXferCount; /*!< UART Tx Transfer Counter */uint8_t *pRxBuffPtr; /*!< Pointer to UART Rx transfer Buffer */uint16_t RxXferSize; /*!< UART Rx Transfer size */uint16_t RxXferCount; /*!< UART Rx Transfer Counter */ DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ DMA_HandleTypeDef *hdmarx; /*!< UART Rx DMA Handle parameters */ HAL_LockTypeDef Lock; /*!< Locking object */ __IO HAL_UART_StateTypeDef State; /*!< UART communication state */ __IO uint32_t ErrorCode; /*!< UART Error code */}UART_HandleTypeDef;
咱们发现,与圭臬库不同的是,该成员不仅:
1、包含了之前圭臬库就有的六个成员(波特率,数据方法等),2、还包含过采样、(发送或接受的)数据缓存、数据指针、串口 DMA 联系的变量、各式符号位等等要在通盘姿色经过中都要确立的各个成员。该 UART1_Handler就被称为串口的句柄,它被衔接通盘USART收发的经过,比如开启中断:
HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);
比如后头要讲到的MSP与Callback回调函数:
void HAL_UART_MspInit(UART_HandleTypeDef *huart);void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
在这些函数中,只需要调用启动化时界说的句柄UART1_Handler就好。
2、MSP函数
MSP: MCU Specific Package 单片机的具体决议
MSP是指和MCU联系的启动化,援用一下正点原子的证明,个东说念主合计说的很澄澈:
咱们要启动化一个串口,最初要确立和 MCU 无关的东西,举例波特率,奇偶校验,罢手位等,这些参数确立和 MCU 莫得任何联系,不错使用 STM32F1,也不错是 STM32F2/F3/F4/F7上的串口。而一个串口设备它需要一个 MCU 来承载,举例用 STM32F4 来作念承载,PA9 作念为发送,PA10 作念为接受,MSP 等于要启动化 STM32F4 的 PA9,PA10,竖立这两个引脚。是以 HAL驱动方式的启动化经过等于:
HAL_USART_Init()—>HAL_USART_MspInit() ,先启动化与 MCU无关的串口条约,再启动化与 MCU 联系的串口引脚。在 STM32 的 HAL 驱动中HAL_PPP_MspInit()手脚回调,被 HAL_PPP_Init()函数所调用。当咱们需要移植表率到 STM32F1平台的时候,咱们只需要修改 HAL_PPP_MspInit 函数内容而不需要修改 HAL_PPP_Init 进口参数内容。
在HAL库中,简直每启动化一个外设就需要确立该外设与单片机之间的筹商,比如IO口,是否复用等等,可见,HAL库相对于圭臬库多了MSP函数之后,移植性十分强,但与此同期却加多了代码量和代码的嵌套层级。不错说各成心弊。
相似,MSP函数又不错合营句柄,达到十分强的移植性:
void HAL_UART_MspInit(UART_HandleTypeDef *huart);
3、Callback函数
访佛于MSP函数,个东说念主认为Callback函数主要匡助用户应用层的代码编写。
照旧以USART为例,在圭臬库中,串口中断了以后,咱们要先在中断中判断是否是接受中断,然后读出数据,趁便撤销中断符号位,然后再是对数据的处理,这样淌若咱们在一个中断函数中写这样多代码,就会显得很繁芜:
void USART3_IRQHandler(void) //串口1中断工作表率{ u8 Res;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接受中断(接受到的数据必须是0x0d 0x0a收尾) { Res =USART_ReceiveData(USART3); //读取接受到的数据/*数据处理区*/ } } }
而在HAL库中,插足串口中断后,径直由HAL库中断函数进行托管:
void USART1_IRQHandler(void) { HAL_UART_IRQHandler(&UART1_Handler); //调用HAL库中断处理公用函数 /***************不祥无关代码****************/ }
HAL_UART_IRQHandler这个函数完成了判断是哪个中断(接受?发送?或者其他?),然后读出数据,保存至缓存区,趁便撤销中断符号位等等操作。
比如我提前确立了,串口每接受五个字节,我就要对这五个字节进行处理。在一起先我界说了一个串口接受缓存区:
/*HAL库使用的串口接受缓冲,处理逻辑由HAL库甩手,接受完这个数组就会调用HAL_UART_RxCpltCallback进行处理这个数组*//*RXBUFFERSIZE=5*/u8 aRxBuffer[RXBUFFERSIZE];
在启动化中,我在句柄里确立好了缓存区的地址,缓存大小(五个字节)
/*该代码在HAL_UART_Receive_IT函数中,启动化时会援用*/ huart->pRxBuffPtr = pData;//aRxBuffer huart->RxXferSize = Size;//RXBUFFERSIZE huart->RxXferCount = Size;//RXBUFFERSIZE
则在接受数据中,每接受完五个字节,HAL_UART_IRQHandler才会扩充一次Callback函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
在这个Callback回调函数中,咱们只需要对这接受到的五个字节(保存在aRxBuffer[]中)进行处理就好了,皆备不消再去手动撤销符号位等操作。
是以说Callback函数是一个应用层代码的函数,咱们在一起先只确立句柄里面的各个参数,然后就等着HAL库把我方安排好的代码送笔直中就不错了~
综上,等于HAL库的三个与圭臬库不同的处所之个东说念目标解。个东说念主合计从这三个小点就不错看出HAL库的可移植性之众多,况兼用户不错皆备不去接待底层各个寄存器的操作,代码也更有逻辑性。但与此带来的是复杂的代码量,极慢的编译速率,稍许低下的成果。看何如遴选了。
STM32 HAL库结构
说到STM32的HAL库,就不得不提STM32CubeMX,其手脚一个可视化的竖立器具,对于开发者来说,如实大大节俭了开发时辰。联系推选:STM32CubeMX安设教程。STM32CubeMX等于以HAL库为基础的,且现时仅撑持HAL库及LL库!最初看一下,官方给出的HAL库的包含结构:
阅读:jianhu.sfangba.com阅读:jingjiang.sfangba.com阅读:peixian.sfangba.com阅读:yangzhong.sfangba.com阅读:qidong2.sfangba.com阅读:dafeng.sfangba.com阅读:shuyang.sfangba.com阅读:zhenjiang.sfangba.com阅读:lianyungang.sfangba.com阅读:yancheng.sfangba.com阅读:yangzhou.sfangba.com阅读:changzhou.sfangba.com阅读:suzhou2.sfangba.com阅读:jiangsu.sfangba.com阅读:luannan.sfangba.com阅读:guan.sfangba.com阅读:cangxian.sfangba.com
1、stm32f4xx.h主要包含STM32同系列芯片的不同具体型号的界说,是否使用HAL库等的界说,接着,其会字据界说的芯片信号包含具体的芯片型号的头文献:
#if defined(STM32F405xx)#include "stm32f405xx.h"#elif defined(STM32F415xx)#include "stm32f415xx.h"#elif defined(STM32F407xx)#include "stm32f407xx.h"#elif defined(STM32F417xx)#include "stm32f417xx.h"#else#error "Please select first the target STM32F4xx device used in your application (in stm32f2xx.h file)"#endif
紧接着,其会包含stm32f4xx_hal.h。
2、stm32f4xx_hal.h:stm32f4xx_hal.c/h 主要兑现HAL库的启动化、系统滴答联系函数、及CPU的调试模式竖立3、stm32f4xx_hal_conf.h :该文献是一个用户级别的竖立文献,用来兑现对HAL库的剪辑,其位于用户文献目次,不要放在库目次中。
接下来对于HAL库的源码文献进行一下阐发,HAL库文献名均以stm32f4xx_hal起原,后头加上_外设或者模块名(如:stm32f4xx_hal_adc.c):
4、库文献:stm32f4xx_hal_ppp.c/.h // 主要的外设或者模块的驱动源文献,包含了该外设的通用APIstm32f4xx_hal_ppp_ex.c/.h // 外围设备或模块驱动表率的彭胀文献。这组文献中包含特定型号或者系列的芯片的迥殊API。以及淌若该特定的芯片里面有不同的兑现方式,则该文献中的迥殊API将掩盖_ppp中的通用API。stm32f4xx_hal.c/.h // 此文献用于HAL启动化,况兼包含DBGMCU、重映射和基于systick的时辰延长等联系的API5、其他库文献用户级别文献:stm32f4xx_hal_msp_template.c // 只好.c莫得.h。它包含用户应用表率中使用的外设的MSP启动化和反启动化(主表率和回调函数)。使用者复制到我方目次下使用模板。stm32f4xx_hal_conf_template.h // 用户级别的库竖立文献模板。使用者复制到我方目次下使用system_stm32f4xx.c // 此文献主要包含SystemInit()函数,该函数在刚复位及跳到main之前的启动过程中被调用。它不在启动时竖立系统时钟(与圭臬库相背)。时钟的竖立在用户文献中使用HAL API来完成。startup_stm32f4xx.s // 芯片启动文献,主要包含堆栈界说,结尾向量表等 stm32f4xx_it.c/.h // 中断处理函数的联系兑现6 main.c/.h //
字据HAL库的定名端正,其API不错分为以下三大类:
启动化/反启动化函数:
HAL_PPP_Init(), HAL_PPP_DeInit()
IO 操作函数:
HAL_PPP_Read(),HAL_PPP_Write(),HAL_PPP_Transmit(), HAL_PPP_Receive()
甩手函数:
HAL_PPP_Set (), HAL_PPP_Get ().
景况和作假:
** HAL_PPP_GetState (), HAL_PPP_GetError ().
珍贵:
现时LL库是和HAL库绑缚发布的,是以在HAL库源码中,还有一些名为 stm32f2xx_ll_ppp的源码文献,这些文献等于新增的LL库文献。使用CubeMX出产姿色时,不错采取LL库。
HAL库最大的特色等于对底层进行了概述。在此结构下,用户代码的处理主要分为三部分:
处理外设句柄(兑现用户功能)处理MSP处理各式回调函数
联系常识如下:
1、外设句柄界说
用户代码的第一大部分:对于外设句柄的处理。HAL库在结构上,对每个外设概述成了一个称为ppp_HandleTypeDef的结构体,其中ppp等于每个外设的名字。*扫数的函数都是责任在ppp_HandleTypeDef指针之下。
多实例撑持:每个外设/模块实例都有我方的句柄。因此,实例资源是孤苦的
底下,以ADC为例
外围进度互换取讯:该句柄用于照顾进度例程之间的分享数据资源。
/** * @brief ADC handle Structure definition */typedef struct{ ADC_TypeDef *Instance; /*!< Register base address */ ADC_InitTypeDef Init; /*!< ADC required parameters */ __IO uint32_t NbrOfCurrentConversionRank; /*!< ADC number of current conversion rank */ DMA_HandleTypeDef *DMA_Handle; /*!< Pointer DMA Handler */ HAL_LockTypeDef Lock; /*!< ADC locking object */ __IO uint32_t State; /*!< ADC communication state */ __IO uint32_t ErrorCode; /*!< ADC Error code */}ADC_HandleTypeDef;
从上头的界说不错看出,ADC_HandleTypeDef中包含了ADC可能出现的扫数界说,对于用户念念要使用ADC只须界说一个ADC_HandleTypeDef的变量,给每个变量赋好值,对应的外设就概述结束。接下来等于具体使用了。
虽然,对于那些分享型外设或者说系统外设来说,他们不需要进行以上这样的概述,这些部分与原本的圭臬外设库函数基本一样。举例以下外设:
GPIOSYSTICKNVICRCCFLASH
以GPIO为例,对于HAL_GPIO_Init() 函数,其只需要GPIO 地址以尽头启动化参数即可。
2、 三种编程方式
HAL库对扫数的函数模子也进行了息争。在HAL库中,撑持三种编程模式:轮询模式、中断模式、DMA模式(淌若外设撑持)。其诀别对应如下三种类型的函数(以ADC为例):
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc); HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
其中,带_IT的暗示责任在中断模式下;带_DMA的责任在DMA模式下(珍贵:DMA模式下亦然开中断的);什么都没带的等于轮询模式(莫得开启中断的)。至于使用者使用何种方式,就看我方的采取了。
此外,新的HAL库架构下息争采取宏的式样对各式中断等进行竖立(原本圭臬外设库一般都是各式函数)。针对每种外设主要由以下宏:
__HAL_PPP_ENABLE_IT(HANDLE, INTERRUPT):使能一个指定的外设中断__HAL_PPP_DISABLE_IT(HANDLE, INTERRUPT):失能一个指定的外设中断__HAL_PPP_GET_IT (HANDLE, __ INTERRUPT __):赢得一个指定的外设中断景况__HAL_PPP_CLEAR_IT (HANDLE, __ INTERRUPT __):撤销一个指定的外设的中断景况__HAL_PPP_GET_FLAG (HANDLE, FLAG):获取一个指定的外设的符号景况__HAL_PPP_CLEAR_FLAG (HANDLE, FLAG):撤销一个指定的外设的符号景况__HAL_PPP_ENABLE(HANDLE) :使能外设__HAL_PPP_DISABLE(HANDLE) :失能外设__HAL_PPP_XXXX (HANDLE, PARAM) :指定外设的宏界说_HAL_PPP_GET IT_SOURCE (HANDLE, __ INTERRUPT __):检查中断源
3、 三大回调函数
在HAL库的源码中,到处可见一些以__weak起原的函数,而且这些函数,有些一经被兑现了,比如:
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority){/*Configure the SysTick to have interrupt in 1ms time basis*/ HAL_SYSTICK_Config(SystemCoreClock/1000U);/*Configure the SysTick IRQ priority */ HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0U);/* Return function status */return HAL_OK;}
有些则莫得被兑现,举例:
__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi){/* Prevent unused argument(s) compilation warning */ UNUSED(hspi);/* NOTE : This function should not be modified, when the callback is needed,the HAL_SPI_TxCpltCallback should be implemented in the user file */}
扫数带有__weak弊端字的函数暗示,就不错由用户我方来兑现。淌若出现了同名函数,且不带__weak弊端字,那么纠合器就会采取外部兑现的同名函数。
平淡来说,HAL库持重通盘处理和MCU外设的处理逻辑,并将必要部分以回调函数的式样给出到用户,用户只需要在对应的回调函数中作念修改即可。HAL库包含如下三种用户级别回调函数(PPP为外设名):
1、外设系统级启动化/清除启动化回调函数(用户代码的第二大部分:对于MSP的处理):
HAL_PPP_MspInit()和 HAL_PPP_MspDeInit**
举例:
__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)。
在HAL_PPP_Init() 函数中被调用,用来启动化底层联系的设备(GPIOs, clock, DMA, interrupt)
2、处理完成回调函数:HAL_PPP_ProcessCpltCallback*(Process指具体某种处理,如UART的Tx),
举例:
__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
当外设或者DMA责任完成后时,触发中断,该回调函数会在外设中断处理函数或者DMA的中断处理函数中被调用作假处理回调函数:
HAL_PPP_ErrorCallback
举例:
__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef hspi)*
3、当外设或者DMA出现作假时,触发结尾,该回调函数会在外设中断处理函数或者DMA的中断处理函数中被调用
作假处理回调函数:
HAL_PPP_ErrorCallback
举例:
__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef hspi)*
当外设或者DMA出现作假时,触发结尾,该回调函数会在外设中断处理函数或者DMA的中断处理函数中被调用。
绝大多数用户代码均在以上三大回调函数中兑现。
HAL库结构中,在每次启动化前(尤其是在屡次调用启动化前),先调用对应的反启动化(DeInit)函数瑕瑜常有必要的。
某些外设屡次启动化时不调用复返会导致启动化失败。完成回调函数有多中,举例串口的完成回调函数有
HAL_UART_TxCpltCallbackHAL_UART_TxHalfCpltCallback
(用户代码的第三大部分:对于上头第二点和第三点的各式回调函数的处理)在实质使用中,发现HAL仍有不少问题,举例在使用USB时,其库竖立存在问题。
HAL库移植使用
基本能力:
1、复制stm32f2xx_hal_msp_template.c,参照该模板,循序兑现用到的外设的HAL_PPP_MspInit()和 HAL_PPP_MspDeInit。2、复制stm32f2xx_hal_conf_template.h,用户不错在此文献中解放剪辑,竖立HAL库。3、在使用HAL库时,必须先调用函数:HAL_StatusTypeDef HAL_Init(void)(该函数在stm32f2xx_hal.c中界说,也就意味着第一丝中,必须最初兑现HAL_MspInit(void)和HAL_MspDeInit(void))4、HAL库与STD库不同,HAL库使用RCC中的函数来竖立系统时钟,用户需要单独写时钟竖立函数(STD库默许在system_stm32f2xx.c中)5、对于中断,HAL提供了中断处理函数,只需要调用HAL提供的中断处理函数。用户我方的代码,不建议先写到中断中,而应该写到HAL提供的回调函数中。6、对于每一个外设,HAL都提供了回调函数,回调函数用来兑现用户我方的代码。通盘调用结构由HAL库我方完成。
举例:
Uart中,HAL提供了
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
函数,用户只需要触发中断后,用户只需要调用该函数即可,同期,我方的代码写在对应的回调函数中即可!如下:
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
使用了哪种就用哪个回调函数即可!
基本结构
要而论之,使用HAL库编写表率(针对某个外设)的基本结构(以串口为例)如下:
1、 竖立外设句柄 举例,开发UartConfig.c,在其中界说串口句柄 UART_HandleTypeDef huart;接着使用启动化句柄(HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef huart))2、编写Msp 举例,开发UartMsp.c,在其中兑现void HAL_UART_MspInit(UART_HandleTypeDef huart) 和 void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)3、兑现对应的回调函数 举例足球投注app,开发UartCallBack.c,在其中兑现上文所阐发的三大回调函数中的完成回调函数和作假回调函数