模板目录
1 . Doc:内含功能说明和更新日志txt文件
2 . Libraries:存放需要用到的芯片配置文件
ST公司官网搜索STM32CubeF1,获取软件包,解压得到en.stm32cubef1
en.stm32cubef1\STM32Cube_FW_F1_V1.8.0\Drivers文件夹复制进来,留下CMSIS和STM32F1xx_HAL_Drive。(STM32F1xx_HAL_Driver中有HAL库帮助文档)
en.stm32cubef1\STM32Cube_FW_F1_V1.8.0\Middlewares复制进来,里面有ST的GUI,以及FreeRTOS等第三方件。
3.Project:keil工程文件
4.User:用户文件,包括bsp,segger,main
Keil配置
1.新建工程在project文件夹下,选择芯片stm32f103ze,叉掉RTE配置
2.项目文件分组
2.1User添加main文件
2.2BSP添加和板子适配的驱动
2.3MDK-ARM添加启动文件
F103ZEtemplate\Libraries\Drivers\CMSIS\Device\ST\STM32F1xx\Include中找到stm32f1xx.h,打开发现f103ze对应的是STM32F103xE。
故在
路径:F103ZEtemplate\Libraries\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm
找到F103ZEtemplate\Libraries\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm(注意是arm不是gcc,iar)
下的startup_stm32f103xe.s,添加进去(找不到文件,将搜索框改成all files)
2.4 HAL_Driver文件夹
F103ZEtemplate\Libraries\Drivers\STM32F1xx_HAL_Driver\Inc下找到stm32f1xx_hal_conf_template.h这个头文件里面设置自己需要引用的hal库头文件
F103ZEtemplate\Libraries\Drivers\STM32F1xx_HAL_Driver\Src下添加c文件(尽量全加,除了template文件。里面的函数重复定义,编译会不通过)
stm32f1xx_hal.c,用来初始化hal库
添加rcc和gpio
2.4 CMSIS文件夹配置
F103ZEtemplate\Libraries\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates下的system_stm32f1xx.c,主要用于复位 RCC 相关寄存器和中断向量表位置设置
2.5 SEGGER/HardFault文件夹
2.6 Doc文件夹
添加Doc下的更新日志和功能说明txt进去
Keil魔术棒配置
过程说明
1.复位
2.根据boot选择启动方式
3.调用启动文件,跳转执行SystemInit
4.到system_stm32f1xx.c中执行SystemInit
(该c文件#include “stm32f1xx.h”),而"stm32f1xx.h"又根据C/C++选项卡的define选择stm32f103xe.h和stm32f1xx_hal.h
而hal.h又include stm32f1xx_hal_conf.h,(stm32f1xx_hal_conf.h里定义用到的hal库,默认都用上)
5.SystemInit执行完回到启动文件,执行_main,然后跳转到main函数,从汇编来到c的世界
6.main函数上#include “stm32f1xx.h”
问题待解决:#include “EventRecorderConf.h” printf("%c",‘A’);
ST 库函数使用了 C 编译器的断言功能,如果定义了 USE_FULL_ASSERT,那么所有的 ST 库函数将检查函数形参
CC 局限性:
使能了外设时钟后,不能立即操作对应的寄存器,要加延迟。 不同外设延迟不同:
如果是 AHB 的外设,使能了时钟后,需要等待 2 个 AHB 时钟周期才可以操作这个外设的寄存器。
如果是 APB 的外设,使能了时钟后,需要等待 2 个 APB 时钟周期才可以操作这个外设的寄存器。
当前 HAL 库的解决方案是在使能了外设时钟后,再搞一个读操作,算是当做延迟用