今天,新买的机械到手,很开心,用得很爽,所以决定再写一篇,话说这是我第一次买机械键盘,我现在也支持程序员可以没有一个好的电脑,但必须有一个好的键盘的说法了。。。
接着,开始我们的游戏吧。
建工程分成5个阶段:
建目录——复制文件——MDK建工程——下载器设置
第一个阶段——建目录
1、在一个干净的文件夹里,见一个新文件夹F407,然后把下载好的固件库复制过来
2、在F407里面建5个目录(我们先来必须的,具体工程应用时目录更多,随着这系列的教程的继续会持续增加。。)
CMSIS:用于存放STM32的CPU核心相关的文件
Library:存放STM32的外设库,这是STM32好入门的关键,大大简化了编程
Driver:存放芯片级的驱动文件,如Bsp.c(板级支持包)、中断处理函数的文件、外设库的配置文件
User:用户的文件夹,存放如main..c、Global.h、用户新建的其他文件
Prj:MDK工程相关的目录,存放编译生成的中间文件,KEIL工程相关的文件
然后在Prj目录下新建Output目录和List目录,把编译生成的临时文件放在Output里面,备份或者拷给别人的时候,把Output里面的文件删掉可以大大减小压缩包的容量。
3、解压缩固件库到当且目录
这个目录里面我们主要用Libraries和Project里面的文件,那个chm是这个固件库的说明文档,里面有大量的例程。
然后,把我们的工程目录和固件库目录在桌面上并排方便操作
然后进入下一个阶段
第二阶段——复制文件
1、复制CMSIS里面的文件,也就是CPU相关的文件
都在固件库的\Libraries\CMSIS目录下
\Libraries\CMSIS\Device\ST\STM32F4xx\Include下的system_stm32f4xx.h和stm32f4xx.h
\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates下的system_stm32f4xx.c
\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm下的startup_stm32f40xx.s,这个目录下文件要根据所用的芯片选择,我们用的是F407所以。。。
\Libraries\CMSIS\Include\下的core_cm4.h和core_cm4_simd.h和core_cmFunc.h和core_cmInstr.h,STM32F1XX的小伙伴们注意选带cm3的。。。
这样CMSIS目录下共有8个文件
2、复制Library里的文件
这个简单,把\Libraries\STM32F4xx_StdPeriph_Driver下的src目录和inc目录复制过去就可以了
3、复制到Driver里的文件
\Project\STM32F4xx_StdPeriph_Templates下的stm32f4xx_conf.h和stm32f4xx_it.c和stm32f4xx_it.h
并且在目录下新建文件Bsp.c和Bsp.h(暂时不用,也可以不建)
4、复制到User里的文件
\Project\STM32F4xx_StdPeriph_Templates下的main.c和main.h
这个就不用截图了吧,复制结束,进入下一关
第三阶段——MDK建工程
1、启动MDK,也就是KEIL,我用是MDK5.1,并点击Project->New u.......不打了
2、目录选择到我们的工程的Prj目录下,敲入工程名F407,点确定
3、芯片选择F407VG,脑残级操作,把后来弹出来的窗口关了,没有弹出来的就算了
4、点工具栏上那个三个正方形的图标
5、添加目录,并添加响应文件夹里的文件,
注意添加CMSIS里面的文件的时候要把文件类型选成.*,避免漏掉.s文件,Library目录只需要添加src里面的文件就行了,那个Bsp就不用加了,还没写呢。。
6、工程设置,点击工具栏上的魔术棒图标
7、设置Output到Output目录,List到List目录
8、切换到C/C++选项卡,填入define内容
USE_STDPERIPH_DRIVER STM32F40XX(注意XX是大写的,就是跟CMSIS里面的.s文件一样,后来发现截图错了,懒得改了)
然后,点include paths后面的按钮,进入include设置窗口
9、添加工程的所有目录,除了Prj以外,Library里添加的是inc目录等其他目录,然后点OK
10、编译,点工具栏上的编译按钮
应该是没有错误或者有两个错误,用官方的纯净的固件库是没有错误的,如果用disvovery的包的话是会有两个错误的。就是没有选用是那块板子。。
这个时候,把main.h里面的
#if defined (USE_STM324xG_EVAL)
#include "stm324xg_eval.h"
#include "stm324xg_eval_lcd.h"
#elif defined (USE_STM324x7I_EVAL)
#include "stm324x7i_eval.h"
#include "stm324x7i_eval_lcd.h"
#else
#error "Please select first the Evaluation board used in your application (in Project Options)"
#endif
删了,注释比较保险。。
把main.c里面的
#if defined (USE_STM324xG_EVAL)
#define MESSAGE1 " STM32F40xx "
#define MESSAGE2 " Device running on "
#define MESSAGE3 " STM324xG-EVAL "
#else /* USE_STM324x7I_EVAL */
#define MESSAGE1 " STM32F427x "
#define MESSAGE2 " Device running on "
#define MESSAGE3 " STM324x7I-EVAL "
#endif
删了,main函数也删了,重新写一个,哪些代码都是用官方的板子实现的,我们一般不用哪些代码
重新写一个main函数
int main(void)
{
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);
while(1)
{
}
}
重新编译,不会报错了吧,可能有一个waring,暂时忽略。
这样一个工程就建好了。
第四阶段——下载器设置
我用的是st-LINK,jlink同理,但是jlink一般用jtag接口下载,而st-link一般用swd接口下载。jlink也是支持swd的。。。
1、点那个工具栏上的魔术棒按钮,然后点debug选项卡,选择合适的下载器,jlink之类的,然后点setting
2、选择swd模式,看自己需求,用jtag接口的就不用改了,jtag一般用20pin那种,swd只有4-6根线。。
3、点flash download选项卡,把reset打上勾,然后点adding
4、选择合适的flash,看芯片说明
5、然后一路oK就OK了。
最后点工具栏上的下载按钮,下进去了,是不是很有成就感。哇咔咔。
最后,说一点,STM32F4一般配8M或者25M的晶振,这个需要根据实际情况修改库文件
在CMSIS下的stm32f4xx.h和system_stm32f4xx.c,有一个是只读的需要设置属性,去掉只读。
stm32f4xx.h第100行
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
我的板子是8M的,所以把25改成8
system_stm32f4xx.c的第155行
#define PLL_M 25
我的板子是8M的,所以把25改成8
OK,这样就差不多了。好累啊。。。
有空把我工程发上来。。
工程链接: