目录
前言
这篇是根据教学视频《原子教你玩STM32》第五讲写出。
一.开发环境
本来Keil下载的是最新版,结果发现给的教学代码工程不能正常编译,又选择的是公司给的版本,这真的很奇怪。教学视频里提到的版本是下图,反正用公司给的可以正常编译,先凑活用吧,后面再研究研究。
软件安装包链接:https://pan.baidu.com/s/1zx14GFNEdcskZ_CUA_IOzw
提取码:3232
二.固件库
固件库分享链接:https://pan.baidu.com/s/1Y_S8ro4UQVG3bLP3nXLN4w
提取码:3232
三.具体步骤
1.创建文件夹
新建 Template工程,在Template目录下新建三个文件夹CORE,OBJ,以及STM32F10x_FWLib。
CORE文件夹用来存放核心文件和启动文件。
OBJ文件夹用来存放编译过程文件以及hex文件。
STM32F10x_FWLib文件夹用来存放ST官方提供的库函数源码文件。
USER文件夹除了用来存放工程文件外,还用来存放main.c主函数文件,以及其他,包括system_stm32f10x.c等等。
2.复制固件库文件夹
将目标文件夹复制粘贴到目标路径下。
2.1STM32F10x_FWLIB文件夹下的配置
(1)目标文件夹:固件库文件夹STM32F10x_StdPeriph_Lib_V3.5.0(前面有分享链接,提取码3232)➡Libraries➡STM32F10x_StdPeriph_Driver➡inc和src
目标路径:Template➡STM32F_FWLIB
2.2CORE文件夹下的配置
(1) 目标文件夹:固件库文件夹➡Libraries➡CMSIS➡CM3➡CoreSupport➡core_crm.c和core_crm3.h
目标路径:Template➡CORE
(2)目标文件: 固件库文件夹➡Libraries➡CMSIS➡CM3➡DeviceSupport➡ST➡STM32F10x➡startup➡arm➡startup_stm32f10x_hd.s(战舰开发板选这个)或者startup_stm32f10x_md.s(迷你开发板选这个)
目标路径:Template➡CORE
2.3USER文件夹下的配置
(1)目标文件:固件库文件夹➡Project➡STM32F10x_StdPeriph_Template➡main.c和stm32f10x_conf.h和stm32f10x_it.c和stm32f10x_it.h和system_stm32f10x.c,一共五个。
目标路径:Template➡USER
(2)目标文件:固件库文件夹➡Libraries➡CMSIS➡CM3➡DeviceSupport➡ST➡STM32F10x➡stm32f10x_it.h和system_stm32f10x.c和system_stm32f10x.h
目标路径:Template➡USER
这一步在复制过程中会有下面提示,跳过和替换都可以,没有影响。
3. 在keil中配置
3.1确定路径,选择文件夹
Project➡New Project➡选择之前创建的文件夹Template➡USERA➡选择芯片STM32F103ZE(战舰版选择这个)或者STM32F103RB(MINI版选择这个)
3.2将源文件添加到工程里
选中Target右击➡点击Manage Project Items➡自定义➡ok
正确添加后目录如下:
3.2.1将源文件添加到USER文件夹中
还是刚才的步骤,打开Manage Project Items,点击USER,添加需要的文件,具体步骤如下:
在USER文件夹下正确添加源文件的界面如下:
3.2.2将源文件添加到FWLIB文件夹下
添加文件:打开Template➡STM32F10x_FWLIB➡src➡Ctrl+A全选➡添加Add➡OK
在FWLIB文件夹下正确添加源文件的界面如下:
3.2.3将源文件添加到CORE文件夹下
添加文件:打开Template➡CORE➡选择添加的文件(将文件类型默认的.c改成All files)➡OK
(战舰开发板需要将startup_stm32f10x_md.s文件移除,mini开发板需要将startup_stm32f10x_md.s文件移除)
在CORE文件夹下正确添加源文件的界面如下:
3.3将头文件添加到Path
将存放了.h头文件的目录全部都加进Include Paths,注意,FWLIB里添加的是inc文件!!!
3.4配置输出路径
创建HEX文件要点√➡存放文件的路径选择OBJ,具体步骤如下:
3.5编译并解决报错
编译工程,可以看到有很多错误,这是因为3.5版本的库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配置一个全局的宏定义变量。
3.5.1没有定义宏定义
解决办法具体如下,其中步骤②的那串字符串是:“STM32F10X_HD,USE_STDPERIPH_DRIVER”(战舰版选择这串)和“STM32F10X_MD,USE_STDPERIPH_DRIVER”(MINI版选择这串字符串)
(补充:如果你用的是中容量那么STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD. 然后点击 OK。 因为我们的 miniSTm32 开发板是大容量,所以要选择“STM32F10X_HD”。)
3.5.2main主程序错误
#include "stm32f10x.h"
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置, 推挽输出
GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高
while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
Delay(3000000);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
Delay(3000000);
}
}
解决以上两个问题后再次进行编译,正确编译的界面如下:
总结
代码一直报错真的会心烦!
教学视频链接:https://pan.baidu.com/s/185Y5AN0NZF6ZC76QKoAT1g
提取码:3232
新建工程的目录和路径其实都可以自定义,本篇是关于视频《新建基于V3.5创建工程库模板》的记录,如果用这种方式看起来会稍微清爽些,后面再抓紧时间去学习下例程吧。