)
文章目录一、创建工程目录1、创建工程目录2、创建子目录3、目录文件说明二、拷贝HAL库相关文件1、拷贝HAL库Libraries2、拷贝启动文件CMSIS\Include3、拷贝源文件CMSYS\Source4、添加中断文件5、更改hal配置文件三、Keil创建工程1、创建工程2、添加组文件夹3、导入文件四、配置工程1、Target中选中微库“ Use MicroLib”为的是在日后编写串口驱动的时候可以使用printf函数。2、在Output选项卡中把输出文件夹定位到我们工程目录下的“output”文件夹如果想在编译的过程中生成hex文件那么那Create HEX File选项勾上。3、在Listing选项卡中把输出文件夹定位到我们工程目录下的“Listing”文件夹。4、在C/C选项卡中添加处理宏及编译器编译的时候查找的头文件路径。1、测试源代码2、下载测试一、创建工程目录1、创建工程目录确定一个存储位置存放工程文件。(HAL_Template)2、创建子目录在工程目录中添加Doc、 User、Libraries、 CMSIS、Project文件夹Doc:Usermain.cLibrariesIncludeSourceCMSIS IncludeSourceProject:OutputListing3、目录文件说明二、拷贝HAL库相关文件1、拷贝HAL库Libraries进入\STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver 把头文件夹 Inc 和源文件夹 Src 移动到自己的Libraries的对应的文件中。2、拷贝启动文件CMSIS\Include1、先进入内核文件\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS2、进入头文件\CMSIS\Include 把所有文件拷贝到自己的CMSIS/Include文件中。3、再进入\CMSIS\Device\ST\STM32F1xx\Include 把所有文件拷贝到自己的CMSIS/Include文件中3、拷贝源文件CMSYS\Source1、进入\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates2、把\Templates 文件的的system_stm32f1xx.c拷贝到自己的CMSIS/Source文件中3、再进入/arm文件下把所有文件拷贝到自己的CMSIS/Source文件中4、添加中断文件在User文件夹创建stm32f1xx_it.c 和stm32f1xx_it.h文件。stm32f1xx_it.c/*-------------------------------------------------*//* *//* 实现各种中断服务函数的源文件 *//* *//*-------------------------------------------------*/#includestm32f1xx_hal.h#includestm32f1xx_it.h/*-------------------------------------------------*//*函数名不可屏蔽中断处理函数 *//*参 数无 *//*返回值无 *//*-------------------------------------------------*/voidNMI_Handler(void){}/*-------------------------------------------------*//*函数名硬件出错后进入的中断处理函数 *//*参 数无 *//*返回值无 *//*-------------------------------------------------*/voidHardFault_Handler(void){}/*-------------------------------------------------*//*函数名软中断SWI 指令调用的处理函数 *//*参 数无 *//*返回值无 *//*-------------------------------------------------*/voidSVC_Handler(void){}/*-------------------------------------------------*//*函数名可挂起的系统服务处理函数 *//*参 数无 *//*返回值无 *//*-------------------------------------------------*/voidPendSV_Handler(void){}/*-------------------------------------------------*//*函数名SysTic系统嘀嗒定时器处理函数 *//*参 数无 *//*返回值无 *//*-------------------------------------------------*/voidSysTick_Handler(void){HAL_IncTick();}stm32f1xx_it.h/** ****************************************************************************** * file GPIO/GPIO_IOToggle/Inc/stm32f1xx_it.h * author MCD Application Team * brief This file contains the headers of the interrupt handlers. ****************************************************************************** * attention * * h2centercopy; Copyright (c) 2016 STMicroelectronics. * All rights reserved./center/h2 * * This software component is licensed by ST under BSD 3-Clause license, * the License; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** *//* Define to prevent recursive inclusion -------------------------------------*/#ifndef__STM32F1xx_IT_H#define__STM32F1xx_IT_H#ifdef__cplusplusexternC{#endif/* Includes ------------------------------------------------------------------*//* Exported types ------------------------------------------------------------*//* Exported constants --------------------------------------------------------*//* Exported macro ------------------------------------------------------------*//* Exported functions ------------------------------------------------------- */voidNMI_Handler(void);voidHardFault_Handler(void);voidMemManage_Handler(void);voidBusFault_Handler(void);voidUsageFault_Handler(void);voidSVC_Handler(void);voidDebugMon_Handler(void);voidPendSV_Handler(void);voidSysTick_Handler(void);#ifdef__cplusplus}#endif#endif/* __STM32F1xx_IT_H *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/5、更改hal配置文件把自己的Libraries文件中的Include 文件中的stm32f1xx_hal_conf_template.h 更名为 stm32f1xx_hal_conf.h 。否则编译会找不到这个头文件。三、Keil创建工程1、创建工程选择Project为工程目录。2、添加组文件夹3、导入文件STM32F1xx_HAL_Driver stm32f1xx_hal.cstm32f1xx_hal_cortex.cstm32f1xx_hal_gpio.cstm32f1xx_hal_gpio_ex.cstm32f1xx_hal_rcc.cstm32f1xx_hal_rcc_ex.cSTARTUPsystem_stm32f1xx.cstartup_stm32f103xe.sUsermain.cstm32f1xx_it.c四、配置工程1、Target中选中微库“ Use MicroLib”为的是在日后编写串口驱动的时候可以使用printf函数。2、在Output选项卡中把输出文件夹定位到我们工程目录下的“output”文件夹如果想在编译的过程中生成hex文件那么那Create HEX File选项勾上。3、在Listing选项卡中把输出文件夹定位到我们工程目录下的“Listing”文件夹。4、在C/C选项卡中添加处理宏及编译器编译的时候查找的头文件路径。如果头文件路径添加有误则编译的时候会报错找不到头文件。选中C99 Mode。在编译器中添加宏的好处就是只要用了这个模版就不用源文件中修改代码。STM32F103xE宏为了告诉STM32HAL库我们使用的芯片类型是STM32型号是大容量的使STM32HAL库根据我们选定的芯片型号来配置。USE_HAL_DRIVER宏为了让stm32f1xx.h包含stm32f1xx_hal_conf.h这个头文件。四、编译测试1、测试源代码#includestm32f1xx_hal.h#defineLED_PINGPIO_PIN_8#defineLED_PORTGPIOAvoidSystemClock_Config(void);intmain(void){/* 1. HAL库核心初始化移植最关键的第一步 */HAL_Init();/* 2. 系统时钟配置必须和你的硬件匹配 */SystemClock_Config();/* 3. 极简GPIO初始化仅配置LED引脚 */// 使能GPIO时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 配置LED引脚为推挽输出GPIO_InitTypeDef gpio_conf{0};gpio_conf.PinLED_PIN;gpio_conf.ModeGPIO_MODE_OUTPUT_PP;// 推挽输出gpio_conf.PullGPIO_NOPULL;// 无上下拉gpio_conf.SpeedGPIO_SPEED_FREQ_LOW;// 低速HAL_GPIO_Init(LED_PORT,gpio_conf);/* 4. 测试主循环LED闪烁验证移植成功 */while(1){HAL_GPIO_TogglePin(LED_PORT,LED_PIN);// 翻转LED电平HAL_Delay(500);// 延时500ms}}/** * brief 系统时钟配置根据你的芯片修改 * 示例STM32F103 72MHz / STM32F407 168MHz / 无晶振则用HSI */voidSystemClock_Config(void){// 极简版用内部HSI时钟无需外部晶振适配所有板子RCC_OscInitTypeDef osc_init{0};RCC_ClkInitTypeDef clk_init{0};// 启用HSI内部高速时钟8MHzosc_init.OscillatorTypeRCC_OSCILLATORTYPE_HSI;osc_init.HSIStateRCC_HSI_ON;osc_init.HSICalibrationValueRCC_HSICALIBRATION_DEFAULT;if(HAL_RCC_OscConfig(osc_init)!HAL_OK){while(1);// 时钟配置失败卡死}// 配置系统时钟 HSI8MHzclk_init.ClockTypeRCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;clk_init.SYSCLKSourceRCC_SYSCLKSOURCE_HSI;clk_init.AHBCLKDividerRCC_SYSCLK_DIV1;clk_init.APB1CLKDividerRCC_HCLK_DIV1;clk_init.APB2CLKDividerRCC_HCLK_DIV1;if(HAL_RCC_ClockConfig(clk_init,FLASH_LATENCY_0)!HAL_OK){while(1);// 时钟配置失败卡死}}/** * brief 错误处理函数移植失败时触发 */voidError_Handler(void){while(1){// 若移植失败LED快速闪烁100ms一次HAL_GPIO_TogglePin(LED_PORT,LED_PIN);HAL_Delay(100);}}// 以下是CubeMX自动生成的弱函数按需保留#ifdefUSE_FULL_ASSERTvoidassert_failed(uint8_t*file,uint32_tline){}#endif2、下载测试