找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1468|回復(fù): 0
收起左側(cè)

基于HAL庫(kù)項(xiàng)目工程的搭建教程-STM32L053的進(jìn)程

[復(fù)制鏈接]
ID:1034553 發(fā)表于 2022-6-15 00:24 | 顯示全部樓層 |閱讀模式
前天終于收到板子,只能說(shuō)這快遞太給力了!雖然包裝的不是很?chē)?yán)實(shí)不過(guò)經(jīng)過(guò)長(zhǎng)途顛簸來(lái)到這偏僻的小城市慶幸沒(méi)啥問(wèn)題,那就上電試試吧!可是一看接口發(fā)現(xiàn)竟是老式的USB接口,現(xiàn)在很少用這種接口了!不過(guò)走運(yùn)的是幸好室友的老古董MP4還有這種接口的線,拿來(lái)試了下發(fā)現(xiàn)還是好使的,個(gè)人建議以后制作板子還是改用那種mini口的吧,這樣我們用起來(lái)也方便。好了廢話不多說(shuō)了,下面進(jìn)入正題。 以前用過(guò)STM32F103開(kāi)發(fā)過(guò)小四軸,當(dāng)時(shí)用的是ST公司提供的STM32 Standard Peripheral Libraries(標(biāo)準(zhǔn)外設(shè)庫(kù))開(kāi)發(fā)的,不過(guò)當(dāng)我拿到這款開(kāi)發(fā)板的時(shí)候發(fā)現(xiàn)ST公司已經(jīng)不提供這款庫(kù)了取而代之的是HAL庫(kù),基本上新出來(lái)的MCU提供的都是HAL庫(kù),而且我用的MDK版本也跟不上時(shí)代的腳步根本不支持這款MCU。于是經(jīng)過(guò)一番的倒騰,重新安裝軟件、下載HAL庫(kù),具體方法我就不多說(shuō)了,別的帖子有很詳細(xì)的教程不會(huì)的可以去參考下,這里有STM32固件庫(kù)的鏈接www點(diǎn)st點(diǎn)com/web/cn/catalog/tools/FM147/CL1794/SC961/SS1743
里面有各種MCU的固件庫(kù)和資料手冊(cè),需要的可以去里面下載。HAL庫(kù)和標(biāo)準(zhǔn)外設(shè)庫(kù)有些許的不同,習(xí)慣標(biāo)準(zhǔn)外設(shè)庫(kù)開(kāi)發(fā)的人突然接觸HAL庫(kù)會(huì)感到很不適應(yīng),不過(guò)用著用著慢慢就好了。當(dāng)然ST公司也提供了更便捷的開(kāi)發(fā)方式,STM32CubeMx這個(gè)軟件就可以直接利用圖形化的方式配置MCU完成初始化十分便捷,而且NUCLEO-L053R8支持mbed功能可以直接使用在線資源也很便捷。這些開(kāi)發(fā)方式的方法我也不介紹了,別的帖子有很詳細(xì)的介紹可以參考。下面我主要介紹使用HAL庫(kù)搭建項(xiàng)目工程的方法,當(dāng)是由團(tuán)隊(duì)共同開(kāi)發(fā)一個(gè)項(xiàng)目的話一個(gè)清晰的項(xiàng)目工程可以便于管理提高開(kāi)發(fā)效率,顯然這是十分重要的。 首先我們新建一個(gè)文件夾可以命名為你的項(xiàng)目名稱,再在這個(gè)文件下新建7個(gè)子文件夾如下圖所示Doc為項(xiàng)目說(shuō)明文檔,Driver為外設(shè)驅(qū)動(dòng)程序,Lib為HAL庫(kù)文件,MDK為工程編譯輸出的信息,Startup為啟動(dòng)文件,STM32L053R8T6為開(kāi)發(fā)板的支持文件只針對(duì)開(kāi)發(fā)板開(kāi)發(fā)時(shí)使用具體項(xiàng)目可以不需要,User為用戶文件編寫(xiě)的應(yīng)用程序可以放在此處。接下來(lái)我們把從官網(wǎng)下載的HAL庫(kù)里的文件移植到這個(gè)項(xiàng)目中,前兩個(gè)文件夾里的文件是用戶自己編寫(xiě)的,主要就是把庫(kù)文件移植到Lib中。在Lib中我又新建了兩個(gè)文件夾CMSIS和STM32L0xx_HAL_Driver,CMSIS是和MCU芯片內(nèi)核相關(guān)的一些頭文件等如下圖所示里面的文件是根據(jù)所用的芯片而變化的,我們用的芯片STM32L053是Cortex-M0+內(nèi)核所以從庫(kù)中移植相對(duì)應(yīng)的頭文件過(guò)來(lái)。 STM32L0xx_HAL_Driver即是HAL庫(kù)中關(guān)于MCU外設(shè)的封裝庫(kù)函數(shù),直接從庫(kù)中將此文件復(fù)制過(guò)來(lái)即可。 Startup里是MCU的啟動(dòng)文件,文件名是startup_stm32l053xx.s從庫(kù)里找到添加到此處即可。 STM32L053R8T6是開(kāi)發(fā)板對(duì)應(yīng)的BSP文件如下圖User即是用戶文件里面存放開(kāi)發(fā)者編寫(xiě)的應(yīng)用程序、中斷服務(wù)程序、外設(shè)使能頭文件,如下圖所示至此相關(guān)文件也就移植好了,接下來(lái)我們開(kāi)始新建工程并將工程保存在MDK文件夾里。此時(shí)會(huì)出現(xiàn)如圖所示的界面我們選擇對(duì)應(yīng)的MCU類型,如果沒(méi)有相應(yīng)的MCU是因?yàn)槟銢](méi)下載對(duì)應(yīng)的PACK包,去官網(wǎng)下載安裝后即可這里不再贅述接著出現(xiàn)如下圖所示界面,讓我們選擇項(xiàng)目文件這里可以點(diǎn)取消,因?yàn)槲覀冏约阂呀?jīng)將文件移植好了在項(xiàng)目中添加這些組及剛才移植的文件如下圖所示 STM32L0xx_HAL_Driver中添加C文件即可。 接下來(lái)配置頭文件路徑,點(diǎn)擊按鈕如下圖所示接著點(diǎn)擊C/C++如圖所示 至此項(xiàng)目就配置好了,接下來(lái)只需根據(jù)自己所用的調(diào)試器在Debug中選擇相應(yīng)的下載器即可,下面是我編寫(xiě)的一段小燈測(cè)試代碼,測(cè)試OK
view plaincopy to clipboardprint?
.         #include "stm32l0xx_hal.h"  
.           
.         void SystemClock_Config(void);  
.         static void MX_GPIO_Init(void);  
.           
.         int main(void)  
.         {  
.           
.           HAL_Init();  
.           
.           SystemClock_Config();  
.           
.           MX_GPIO_Init();  
.           
.           while (1)  
.           {  
.         if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 1)  
.         {     
.         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);  
.         HAL_Delay(500);  
.         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);  
.         HAL_Delay(500);  
.         }  
.         else  
.         {  
.         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);  
.         }  
.         }  
.           
.         }  
.           
.         void SystemClock_Config(void)  
.         {  
.           
.           RCC_OscInitTypeDef RCC_OscInitStruct;  
.           RCC_ClkInitTypeDef RCC_ClkInitStruct;  
.           
.           __PWR_CLK_ENABLE();  
.           
.           __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);  
.           
.           RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;  
.           RCC_OscInitStruct.HSIState = RCC_HSI_ON;  
.           RCC_OscInitStruct.HSICalibrationValue = 16;  
.           RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;  
.           RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;  
.           RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;  
.           RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;  
.           HAL_RCC_OscConfig(&RCC_OscInitStruct);  
.           
.           RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;  
.           RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;  
.           RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  
.           RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  
.           RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  
.           HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);  
.           
.           HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  
.           
.           HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);  
.           
.           HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);  
.         }  
.           
.         void MX_GPIO_Init(void)  
.         {  
.           
.           GPIO_InitTypeDef GPIO_InitStruct;  
.           
.           __GPIOC_CLK_ENABLE();  
.           __GPIOA_CLK_ENABLE();  
.           
.           GPIO_InitStruct.Pin = GPIO_PIN_13;  
.           GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  
.           GPIO_InitStruct.Pull = GPIO_NOPULL;  
.           HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);  
.           
.           GPIO_InitStruct.Pin = GPIO_PIN_5;  
.           GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  
.           GPIO_InitStruct.Pull = GPIO_NOPULL;  
.           GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  
.           HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  
.           
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表