前天終于收到板子,只能說這快遞太給力了!雖然包裝的不是很嚴實不過經過長途顛簸來到這偏僻的小城市慶幸沒啥問題,那就上電試試吧!可是一看接口發現竟是老式的USB接口,現在很少用這種接口了啊!不過走運的是幸好室友的老古董MP4還有這種接口的線,拿來試了下發現還是好使的,個人建議以后制作板子還是改用那種mini口的吧,這樣我們用起來也方便。好了廢話不多說了,下面進入正題。 以前用過STM32F103開發過小四軸,當時用的是ST公司提供的STM32 Standard Peripheral Libraries(標準外設庫)開發的,不過當我拿到這款開發板的時候發現ST公司已經不提供這款庫了取而代之的是HAL庫,基本上新出來的MCU提供的都是HAL庫,而且我用的MDK版本也跟不上時代的腳步根本不支持這款MCU。于是經過一番的倒騰,重新安裝軟件、下載HAL庫,具體方法我就不多說了,別的帖子有很詳細的教程不會的可以去參考下,這里有STM32固件庫的鏈接www點st點com/web/cn/catalog/tools/FM147/CL1794/SC961/SS1743
里面有各種MCU的固件庫和資料手冊,需要的可以去里面下載。HAL庫和標準外設庫有些許的不同,習慣標準外設庫開發的人突然接觸HAL庫會感到很不適應,不過用著用著慢慢就好了。當然ST公司也提供了更便捷的開發方式,STM32CubeMx這個軟件就可以直接利用圖形化的方式配置MCU完成初始化十分便捷,而且NUCLEO-L053R8支持mbed功能可以直接使用在線資源也很便捷。這些開發方式的方法我也不介紹了,別的帖子有很詳細的介紹可以參考。下面我主要介紹使用HAL庫搭建項目工程的方法,當是由團隊共同開發一個項目的話一個清晰的項目工程可以便于管理提高開發效率,顯然這是十分重要的。 首先我們新建一個文件夾可以命名為你的項目名稱,再在這個文件下新建7個子文件夾如下圖所示Doc為項目說明文檔,Driver為外設驅動程序,Lib為HAL庫文件,MDK為工程編譯輸出的信息,Startup為啟動文件,STM32L053R8T6為開發板的支持文件只針對開發板開發時使用具體項目可以不需要,User為用戶文件編寫的應用程序可以放在此處。接下來我們把從官網下載的HAL庫里的文件移植到這個項目中,前兩個文件夾里的文件是用戶自己編寫的,主要就是把庫文件移植到Lib中。在Lib中我又新建了兩個文件夾CMSIS和STM32L0xx_HAL_Driver,CMSIS是和MCU芯片內核相關的一些頭文件等如下圖所示里面的文件是根據所用的芯片而變化的,我們用的芯片STM32L053是Cortex-M0+內核所以從庫中移植相對應的頭文件過來。 STM32L0xx_HAL_Driver即是HAL庫中關于MCU外設的封裝庫函數,直接從庫中將此文件復制過來即可。 Startup里是MCU的啟動文件,文件名是startup_stm32l053xx.s從庫里找到添加到此處即可。 STM32L053R8T6是開發板對應的BSP文件如下圖User即是用戶文件里面存放開發者編寫的應用程序、中斷服務程序、外設使能頭文件,如下圖所示至此相關文件也就移植好了,接下來我們開始新建工程并將工程保存在MDK文件夾里。此時會出現如圖所示的界面我們選擇對應的MCU類型,如果沒有相應的MCU是因為你沒下載對應的PACK包,去官網下載安裝后即可這里不再贅述接著出現如下圖所示界面,讓我們選擇項目文件這里可以點取消,因為我們自己已經將文件移植好了在項目中添加這些組及剛才移植的文件如下圖所示 STM32L0xx_HAL_Driver中添加C文件即可。 接下來配置頭文件路徑,點擊按鈕如下圖所示接著點擊C/C++如圖所示 至此項目就配置好了,接下來只需根據自己所用的調試器在Debug中選擇相應的下載器即可,下面是我編寫的一段小燈測試代碼,測試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);
.
}
|