1.代码的移植
首先,新建一个文件夹,命名为01Template,在此文件夹下新建5个文件夹,分别命名为:CORE,HALLIB,OBJ,SYSTEM,USER。
然后,针对部分文件夹进行代码移植:(1)针对CORE,存放启动文件和关键头文件(图1.1.1);(2)针对HALLIB,存放HAL库的全部代码(图1.1.2),当然也可以只存放使用到的部分代码,比如使用最简单的跑马灯,可以只放stm32l4xx_hal_gpio.c(和.h);(3)针对OBJ,这里不移植代码,用于Keil;(4)针对SYSTEM,放置一些系统代码,比如时钟初始化、串口打印等(图1.1.3);(5)针对USER,放置非常关键的头文件的main函数(图1.1.4)
图1.1.1 CORE 图1.1.2 HALLIB 图1.1.3 SYSTEM 图1.1.4 USER
当然,这部分代码以后新建工程时可以直接copy使用了
2.在Keil中新建工程
首先,点击菜单Project –>New Uvision Project,然后将目录定位到刚才建立的文件夹01Template之下的USER之下,工程取名为Template 之后点击保存,工程文件就都保存到USER文件夹下面了。
然后,选择芯片STM32L496VETx,关闭Manage Run-Time Environment对话框,USER目录下将新增3个文件夹和3个文件(图1.2.1),其中有两个空白文件夹可以删除,因为它们的作用将被上文的OBJ代替。
3.将.c和.h文件加入工程
3.1:新建文件夹
首先,右键Target1,选择Manage Project Items,完成改名和新建文件夹的任务(图1.3.1)。注意,不需要建立OBJ的文件夹。
3.2:导入.c和.h文件
针对HALLIB,我们只需要导入.c文件。首先,右键01Template,选择Manage Project Items,选择HALLIB,点击Add Files,进入\HALLIB\STM32L4xx_HAL_Driver\Src,将所有的.c文件导入工程(图1.3.2)。当然,也可以只导入部分所需的文件。
针对CORE,这里我们需要导入CORE目录下的全部文件,点击Add Files,进入CORE目录,文件类型选All Files,导入全部文件(图1.3.3),含.h和.s文件。
针对USER和SYSTEM,都是只导入.c文件,见图1.3.4和图1.3.5。
图1.3.2 HALLIB 图1.3.3 CORE
图1.3.4 SYSTEM 图1.3.5 USER
3.3:设置头文件存放路径
首先,依次点击“魔法棒”,“C/C++”,Include path(头文件路径)后的三个点“…”,在弹出的页面点击虚线正方形“
”,三个点“…”。选取头文件所在的最深入路径(图1.3.6)。
图1.3.7 全局宏定义 图1.3.6 头文件路径
3.4:其他设置
添加全局宏定义:首先,依次点击“魔法棒”,“C/C++,”,在Define框键入“USE_HAL_DRIVER,STM32L496xx”(图1.3.7),注意不要输入双引号。
添加c99标准:首先,依次点击“魔法棒”,“C/C++,”,在此页面勾选“c99 Mode”。
处理烧录问题中的“Cortex-M4”:首先,依次点击“魔法棒”,“Debug”ST-LINK后的“settings”,“Flash Download”,勾选“Reset and Run。
4.工程编译
首先,使用OBJ存放编译后的中间文件,这一步我们依次点击“魔法棒”,“Output”“Select folder for objects…”,选择OBJ文件夹。
然后,在“Output”界面,(1)勾选“Debug Information”和“Create HEX File”,(2)取消勾选“Brows Information”。
接下来,将USER中的main.c的内容覆盖为:
#include "sys.h"
#include "delay.h"
#include "usart.h"
void Delay(__IO uint32_t nCount);
void Delay(__IO uint32_t nCount){
while(nCount--) {};
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
HAL_Init(); //初始化HAL库
SystemClock_Config(); //初始化系统时钟为80M
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启GPIOE时钟
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
while(1)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); //PE7 置1
Delay(0x7FFFFF);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET); //PE7 置0
Delay(0x7FFFFF);
}
}
然后,我们通过编译处理报错
(1)我们删除main.h中42行的 #include “stm32l475e_iot01.h”。
(2)在Keil删除HALLIB中的“stm32l4_hal_msp_template.c”和“stm32l4xx_hal_timebase_tim_template.c”。
5.修改中断优先级分组组号
在“stm32l4xx_hal.c”的188行,将入口参数NVIC_PRIORITYGROUP_4 修改为NVIC_PRIORITYGROUP_2。