目錄
1. 前言
2. Hal庫(kù)特點(diǎn)
3. 獲取方法
3.1 下載
3.2 所在目錄
4. HAL庫(kù)用戶手冊(cè)結(jié)構(gòu)
4.1 用戶手冊(cè)的文檔
4.2 “ADC”外設(shè)解析
4.3 Exported Functions
4.4 Exported Types
4.5 Exported Constants
4.6 Exported Macros
4.6 Private Contants
4.7 Private Macros
4.8 Private Functions
5. 結(jié)論
1. 前言
????????ST 為開(kāi)發(fā)者提供了非常方便的開(kāi)發(fā)庫(kù):有標(biāo)準(zhǔn)外設(shè)庫(kù)(SPL庫(kù))、HAL 庫(kù)(Hardware Abstraction Layer,硬件抽象層庫(kù))、LL 庫(kù)(Low-Layer,底層庫(kù))三種。前者是ST的老庫(kù)已經(jīng)停更了,后兩者是ST現(xiàn)在主推的開(kāi)發(fā)庫(kù)。
????????相比標(biāo)準(zhǔn)外設(shè)庫(kù),STM32Cube HAL庫(kù)表現(xiàn)出更高的抽象整合水平,HAL API集中關(guān)注各外設(shè)的公共函數(shù)功能,這樣便于定義一套通用的用戶友好的API函數(shù)接口,從而可以輕松實(shí)現(xiàn)從一個(gè)STM32產(chǎn)品移植到另一個(gè)不同的STM32系列產(chǎn)品。HAL庫(kù)是ST未來(lái)主推的庫(kù),ST新出的芯片已經(jīng)沒(méi)有STD庫(kù)了。目前,HAL庫(kù)已經(jīng)支持STM32全線產(chǎn)品。
2. Hal庫(kù)特點(diǎn)
- 最大可移植性。
- 提供了一整套一致的中間件組件,如RTOS,USB,TCP / IP和圖形等。
- 通用的用戶友好的API函數(shù)接口。
- ST新出的芯片已經(jīng)沒(méi)有標(biāo)準(zhǔn)庫(kù)。
- HAL庫(kù)已經(jīng)支持STM32全線產(chǎn)品。
3. 獲取方法
3.1 下載
3.2 所在目錄
????????選擇Drivers。
選擇Stm32F4xx_HAL_Driver。
選擇STM32F417xx_User_Manual,STM32F407也應(yīng)用該文檔。
4. HAL庫(kù)用戶手冊(cè)結(jié)構(gòu)
4.1 用戶手冊(cè)的文檔
????????用戶手冊(cè)文檔結(jié)構(gòu)如下圖所示。
4.2 “ADC”外設(shè)解析
????????選擇“STM32F4xx_HAL_Driver”,并選擇“ADC”外設(shè),文檔結(jié)構(gòu)如下圖所示。
????????圖中圈出的兩部分中,相對(duì)于HAL庫(kù)來(lái)說(shuō),含有“Exported”的對(duì)外,可供我們使用,含有 “Private”的對(duì)內(nèi),為HAL庫(kù)的私有內(nèi)容,我們不可以使用。
????????以ADC外設(shè)為例,對(duì)外的有Function(函數(shù))、Types(類型)、Constants(常量)和Macros(宏定義),對(duì)內(nèi)有Constants、Macros、Functions。下面在看看各部分具體內(nèi)容。
4.3 Exported Functions
????????主要包括初始化、運(yùn)行、外設(shè)控制、外設(shè)狀態(tài)等相關(guān)的函數(shù),可供用戶使用。如下:
HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc)
{
HAL_StatusTypeDef tmp_hal_status = HAL_OK;
/* Check ADC handle */
if(hadc == NULL)
{
return HAL_ERROR;
}
/* Check the parameters */
assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler));
assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution));
assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ScanConvMode));
assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
assert_param(IS_ADC_EXT_TRIG(hadc->Init.ExternalTrigConv));
assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign));
assert_param(IS_ADC_REGULAR_LENGTH(hadc->Init.NbrOfConversion));
assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
assert_param(IS_ADC_EOCSelection(hadc->Init.EOCSelection));
assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode));
if(hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
{
assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
}
if(hadc->State == HAL_ADC_STATE_RESET)
{
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
/* Init the ADC Callback settings */
hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; /* Legacy weak callback */
hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback; /* Legacy weak callback */
hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback; /* Legacy weak callback */
hadc->ErrorCallback = HAL_ADC_ErrorCallback; /* Legacy weak callback */
hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback; /* Legacy weak callback */
if (hadc->MspInitCallback == NULL)
{
hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
}
/* Init the low level hardware */
hadc->MspInitCallback(hadc);
#else
/* Init the low level hardware */
HAL_ADC_MspInit(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
/* Initialize ADC error code */
ADC_CLEAR_ERRORCODE(hadc);
/* Allocate lock resource and initialize it */
hadc->Lock = HAL_UNLOCKED;
}
/* Configuration of ADC parameters if previous preliminary actions are */
/* correctly completed. */
if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL))
{
/* Set ADC state */
ADC_STATE_CLR_SET(hadc->State,
HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
HAL_ADC_STATE_BUSY_INTERNAL);
/* Set ADC parameters */
ADC_Init(hadc);
/* Set ADC error code to none */
ADC_CLEAR_ERRORCODE(hadc);
/* Set the ADC state */
ADC_STATE_CLR_SET(hadc->State,
HAL_ADC_STATE_BUSY_INTERNAL,
HAL_ADC_STATE_READY);
}
else
{
tmp_hal_status = HAL_ERROR;
}
/* Release Lock */
__HAL_UNLOCK(hadc);
/* Return function status */
return tmp_hal_status;
}
4.4 Exported Types
????????Hal庫(kù)中用到的宏定義、自定義類型、枚舉、結(jié)構(gòu)體等,可供用戶使用。
4.5 Exported Constants
????????Hal庫(kù)中用到的常量,可供用戶使用。
4.6 Exported Macros
????????用define方式定義的函數(shù),可供用戶使用。
4.6 Private Contants
????????Hal庫(kù)自用的常量,不對(duì)外。
4.7 Private Macros
????????Hal庫(kù)自用的宏定義,不對(duì)外。
4.8 Private Functions
????????Hal庫(kù)自用的函數(shù),一般函數(shù)前加static,不對(duì)外。如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-528641.html
static void ADC_Init(ADC_HandleTypeDef* hadc)
{
ADC_Common_TypeDef *tmpADC_Common;
/* Set ADC parameters */
/* Pointer to the common control register to which is belonging hadc */
/* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */
/* control register) */
tmpADC_Common = ADC_COMMON_REGISTER(hadc);
/* Set the ADC clock prescaler */
tmpADC_Common->CCR &= ~(ADC_CCR_ADCPRE);
tmpADC_Common->CCR |= hadc->Init.ClockPrescaler;
/* Set ADC scan mode */
hadc->Instance->CR1 &= ~(ADC_CR1_SCAN);
hadc->Instance->CR1 |= ADC_CR1_SCANCONV(hadc->Init.ScanConvMode);
/* Set ADC resolution */
hadc->Instance->CR1 &= ~(ADC_CR1_RES);
hadc->Instance->CR1 |= hadc->Init.Resolution;
/* Set ADC data alignment */
hadc->Instance->CR2 &= ~(ADC_CR2_ALIGN);
hadc->Instance->CR2 |= hadc->Init.DataAlign;
/* Enable external trigger if trigger selection is different of software */
/* start. */
/* Note: This configuration keeps the hardware feature of parameter */
/* ExternalTrigConvEdge "trigger edge none" equivalent to */
/* software start. */
if(hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
{
/* Select external trigger to start conversion */
hadc->Instance->CR2 &= ~(ADC_CR2_EXTSEL);
hadc->Instance->CR2 |= hadc->Init.ExternalTrigConv;
/* Select external trigger polarity */
hadc->Instance->CR2 &= ~(ADC_CR2_EXTEN);
hadc->Instance->CR2 |= hadc->Init.ExternalTrigConvEdge;
}
else
{
/* Reset the external trigger */
hadc->Instance->CR2 &= ~(ADC_CR2_EXTSEL);
hadc->Instance->CR2 &= ~(ADC_CR2_EXTEN);
}
/* Enable or disable ADC continuous conversion mode */
hadc->Instance->CR2 &= ~(ADC_CR2_CONT);
hadc->Instance->CR2 |= ADC_CR2_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode);
if(hadc->Init.DiscontinuousConvMode != DISABLE)
{
assert_param(IS_ADC_REGULAR_DISC_NUMBER(hadc->Init.NbrOfDiscConversion));
/* Enable the selected ADC regular discontinuous mode */
hadc->Instance->CR1 |= (uint32_t)ADC_CR1_DISCEN;
/* Set the number of channels to be converted in discontinuous mode */
hadc->Instance->CR1 &= ~(ADC_CR1_DISCNUM);
hadc->Instance->CR1 |= ADC_CR1_DISCONTINUOUS(hadc->Init.NbrOfDiscConversion);
}
else
{
/* Disable the selected ADC regular discontinuous mode */
hadc->Instance->CR1 &= ~(ADC_CR1_DISCEN);
}
/* Set ADC number of conversion */
hadc->Instance->SQR1 &= ~(ADC_SQR1_L);
hadc->Instance->SQR1 |= ADC_SQR1(hadc->Init.NbrOfConversion);
/* Enable or disable ADC DMA continuous request */
hadc->Instance->CR2 &= ~(ADC_CR2_DDS);
hadc->Instance->CR2 |= ADC_CR2_DMAContReq((uint32_t)hadc->Init.DMAContinuousRequests);
/* Enable or disable ADC end of conversion selection */
hadc->Instance->CR2 &= ~(ADC_CR2_EOCS);
hadc->Instance->CR2 |= ADC_CR2_EOCSelection(hadc->Init.EOCSelection);
}
5. 結(jié)論
????????看過(guò)本文后,相信您對(duì)HAL庫(kù)的結(jié)構(gòu)有了初步了解,將來(lái)的編程中不再迷茫。要學(xué)習(xí)更多實(shí)戰(zhàn)經(jīng)驗(yàn),請(qǐng)關(guān)注博主,后續(xù)會(huì)陸續(xù)推出更多實(shí)戰(zhàn)經(jīng)驗(yàn),還請(qǐng)多多關(guān)注、批評(píng)指正!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-528641.html
到了這里,關(guān)于【STM32】HAL庫(kù)入門學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!