一.资料下载
<1>芯片驱动下载
打开Keil官网,选择驱动;
选择芯片厂家和内核型号;
找到对应的pack点击下载即可,下载完成后双击下载即可。
温馨提示:下载速度可能比较慢,建议科学上网。
<2>HAL固件库下载
打开ST官网
先选择产品选择器,再搜索对应的系列;
将鼠标悬停在对应系列上就可找到该页面;
进入这个页面后往下翻;
选择对应的版本进行下载即可。
二.创建工程文件夹
创建工程文件夹,并且新建相应文件夹;
文件夹名称 | 作用 |
Drivers | 存放与硬件相关的驱动层文件 |
Middlewares | 存放中间层文件组件文件和第三方中间层文件 |
Output | 存放工程编译输出文件 |
Projects | 存放MDK工程文件 |
User | 存放HAL库用户配置文件、main.c、中断处理文件,以及分散加载文件 |
<1>Drivers文件夹
文件夹名称 | 作用 |
BSP | 存放开发板板级支持包驱动代码,如各种外设驱动(暂为空) |
CMSIS | 存放CMSIS底层代码,如启动文件(.S文件)等 |
SYSTEM | 存放系统级核心驱动代码,如sys.c、delay.c和usart.c等(暂为空) |
STM32F1xx_HAL_Driver | 存放ST提供的F1系列HAL库驱动源码 |
<2>Middlewares文件夹(暂为空)
该文件用于存放中间层代码(组件/Lib)等,如:USMART、MALLOC、TEXT、FATFS、USB、LWIP、各种OS、各种GUI等。
<3>Output文件夹 (暂为空)
该文件用于存放编译器编译工程输出的中间文件,比如:.hex、.bin、.o文件等。
<4>Projects文件夹
该文件用于存放编译器(MDK、IAR等)工程文件,我们主要用到MAK,为了方便区分,我们在该文件下新建:MDK-ARM文件夹,用于存放MDK的工程文件。
<5>User文件夹
该文件用于存放用户编写的代码,如:HAL库用户配置文件、main.c文件、中断处理文件,以及分散加载文件等。
三.Keil5新建工程
新建工程,保存到创建的Projects文件夹;
选择对应的型号;
点击取消;
删除Projects里的这两个文件夹;
添加分组;
添加启动文件,启动文件看自己MCU的型号选择对应的启动文件,路径为:Template\Drivers\CMSIS_F103\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm;
添加这两个文件,路径分别为:Template\User 和 Template\Drivers\CMSIS_F103\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates;
添加HAL库驱动文件,可裁剪添加:Template\Drivers\STM32F1xx_HAL_Driver\Src;
设置保存位置为Output文件夹;
设置保存位置为Output文件夹;
添加头文件路径;
设置完这些就差不多了,然后写一个系统时钟初始化函数,别忘了在main.c里写一个主函数,要不然可能会报错。
#include "stm32f1xx_hal.h"
void sys_stm32_clock_init(uint32_t plln);
int main()
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
while(1)
{
}
}
void sys_stm32_clock_init(uint32_t plln)
{
HAL_StatusTypeDef ret = HAL_ERROR;
RCC_OscInitTypeDef rcc_osc_init = {0};
RCC_ClkInitTypeDef rcc_clk_init = {0};
rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE; /* 选择要配置HSE */
rcc_osc_init.HSEState = RCC_HSE_ON; /* 打开HSE */
rcc_osc_init.HSEPredivValue = RCC_HSE_PREDIV_DIV1; /* HSE预分频系数 */
rcc_osc_init.PLL.PLLState = RCC_PLL_ON; /* 打开PLL */
rcc_osc_init.PLL.PLLSource = RCC_PLLSOURCE_HSE; /* PLL时钟源选择HSE */
rcc_osc_init.PLL.PLLMUL = plln; /* PLL倍频系数 */
ret = HAL_RCC_OscConfig(&rcc_osc_init); /* 初始化 */
if (ret != HAL_OK)
{
while (1); /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */
}
/* 选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2*/
rcc_clk_init.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
rcc_clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 设置系统时钟来自PLL */
rcc_clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB分频系数为1 */
rcc_clk_init.APB1CLKDivider = RCC_HCLK_DIV2; /* APB1分频系数为2 */
rcc_clk_init.APB2CLKDivider = RCC_HCLK_DIV1; /* APB2分频系数为1 */
ret = HAL_RCC_ClockConfig(&rcc_clk_init, FLASH_LATENCY_2); /* 同时设置FLASH延时周期为2WS,也就是3个CPU周期。 */
if (ret != HAL_OK)
{
while (1); /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */
}
}