找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1054|回复: 0
收起左侧

基于HAL库项目工程的搭建教程-STM32L053的进程

[复制链接]
ID:1034553 发表于 2022-6-15 00:24 | 显示全部楼层 |阅读模式
前天终于收到板子,只能说这快递太给力了!虽然包装的不是很严实不过经过长途颠簸来到这偏僻的小城市庆幸没啥问题,那就上电试试吧!可是一看接口发现竟是老式的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);  
.           
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表