
今天我们介绍一下如何移植标准的官网代码(裸机,无OS)到iBox开发板上,控制LED闪烁。如此简单的试验,还是希望给你不一样的体验。 【一、安装编译工具Keil】 1、为什么选择keil 在这个操作之前,原本应该解释为什么选择“Cortex-M”,为什么选择“M3”、为什么选择“ST”。这样容易扯远了。所以简单说下,原因无非以下几个维度: 1、成本 2、功耗 3、开发工作量 4、生态 5、易学性、普及度 5 `8 V* A. y, \" C& u* A) b5 M- z 至于为什么选择Keil 没选择 IAR、GCC,是因为配置简单。从支持的芯片的丰富度来说,IAR是不错的选择。对于熟练工来说,工具的差异不大;如同硬件熟练工一样,绘图工具差异不大。 * |6 W2 H9 J. M0 m+ ]4 ?1 b KEIL 和 IAR Systems都是嵌入式领域系统开发工具和服务商(IDE)的供应商,前者成立于-1986年,总部在德国(如今已被大名鼎鼎的英国ARM公司收购);后者于成立1983年,公司总部位于北欧的瑞典。 二者的最著名的产品分别是 KEIL uVision IDE 和 IAR Embeded Workbench。 估计大部分的开发人员都用过。因为他们都可以很好的支持各种不同版本的MCU。对于不同的开发环境,用久了,便会日久生情。用得顺不顺手,快不快乐,或喜欢,或讨厌等等,都因人而异的。然而我们不能不考虑这个问题:能选择到最适合自己,更有效率的工具,才是最好的。 ; P! u3 \; v: d/ l9 v KEIL的IDE界面比较通俗易懂,属于平易近人的那种。 IAR呢,界面简洁明了,整体感觉——专业。入门不易,一旦入门还是尽在掌握的感觉。 % }- C; ^! [& Z2 z 我们选择的KEIL版本是 ![]() 2、下载安装包 百度网盘自从“360网盘”停用,就开始限速。 所以我们可以使用其他不限速的下载工具进行下载。 将上面的内容存到自己的网盘,然后用下面这个工具进行下载。 ![]() pandownload 工具下载地址: http://pandownload.com/ / [, d) p9 i' o! [ 3、安装 下载的压缩包分成三个part,全部下载完成之后解压缩,文件夹中有五个文件。 先安装MDK523这个737MB的安装包,然后安装MDKCM523的安装包。 ![]() 安装过程没有注意点,一路NEXT。 安装完成之后,点击菜单Project之Manage,选择Pack Install ![]() ![]() . g+ Y6 g) o. c" ^* k3 ?$ m, m8 W Pack Installer窗口打开之后,选择File菜单之 Import,然后选择导入刚刚下载的三个PACK后缀名的文件。 ![]() ' H0 j5 l* u" q+ k 4、破解 安装完成后,只剩下破解了。 破解工具只用于学习交流,不用于商业用途。 http://www.hw100k.com/forum.php?mod=viewthread&tid=3506&extra= ![]() 破解统共分7步 1、点击菜单Flie ->License management 获取CID 2、CID复制到破解工具中。 3、选择Target 为ARM 4、点击Generate按钮生成序列号 5、复制序列号 6、粘贴到LIC空格中 7点击ADD LIC 完成破解。 重要,破解时,运行keil,需要用管理员身份运行。 , w2 u: V$ s& G 如果你没有破解,就急急忙忙运行工程,试图编译,则给你一个error,提示如下: Check that your license details are correct in the License Management dialog of MDK. Additional information is available at: # I# r) h& f: {1 C/ Q5 L( ^6 U 至此,安装破解完成。 安装好之后,我们就可以拿出我们的开发板硬件iBox了。 # ]) e8 K! z3 R6 Q) l/ g【二、下载和使用ST官方源代码】 我们学习的过程,最好要学习使用官方的源码。其他开发板的代码,建议都只作为参考。因为每个人有每个人的编码习惯,可能一些差异。 不同公司对代码规范、代码结构的要求会有不同。 所以,我们从官方代码作为开始。按照自己公司的要求,和自己能够理解的习惯进行编码,在实践中提升。 总之,对代码还是要尽在掌握,熟练驾驭、不能囫囵吞枣。 1、MCU 简单介绍一下我们的 iBox物联网开发板的硬件系统: 核心芯片是STM32F103ZET6 ![]() 1 {. q# h" l' p; g9 d! _* D 原理图pdf下载地址: http://www.hw100k.com/forum.php?mod=viewthread&tid=3501&extra=page%3D1 2、使用 ST 官网 如果你很熟悉,可以跳过这个章节。但是根据本人观察,很多长期使用STM32的工程师其实没有仔细看过官网。 8 ?; ? V9 N0 L6 H6 ?! K9 r http://www.st.com 进入之后,我们进入Tool&Software去下载STM32标准库 ![]() 进入嵌入式软件页面之后,可以看到左下角 For STM32 MCUs ![]() 提醒:如果你没有注册、可以注册账号后登陆。下载代码,需要登陆之后才可以下载。 7 T! s" t1 z6 q- m7 x 进入之后,在页面最下面,有个“Download”。点击之后,可以下载。 ![]() 点击“Download”之后,下载一个压缩包。: A8 t% X2 n f* _7 ~7 z' [. e 文件名为:en.stsw-stm32054.zip 解压缩之后,文件夹名称:STM32F10x_StdPeriph_Lib_V3.5.0 你也可以用下面链接粘贴到浏览器,直接下载: http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries.html?querycriteria=productId=LN1939%20 选择你对应的MCU类别,比如我们iBox选择F1 ![]() 现在我们就已经下载下来一个完整的STM32的官方标准外设库文件包。 $ T' w) m* @6 a/ _( y我们现在直接进入MDK-ARM文件夹,打开Keil的工程。 文件目录如下: STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\MDK-ARM ![]() 双击打开。 我们可以尝试一下编译(Build)和下载程序(Download) ![]() 当我们电机 Download那个图标时,我们发现下载不了,找不到你的下载工具。 0 A, o$ M3 h/ i3 Q' n. e' T 3、使用Jlink进行代码烧写 那么,我们需要做几个准备工作,才可以进行代码烧写: 1、把Jlink连上 2、安装Jlink 3、配置芯片等烧写环境 * t8 C8 P1 t. Q2 G 1、看图 ![]() 2、首先我们安装Jlink 下载安装包,下载地址如下: http://www.hw100k.com/forum.php?mod=viewthread&tid=3507&extra= 安装注意事项:无;一路 next " P" I' b& z5 ? 测试一下,我们的工具是否可以连接上我们的MCU 点击开始菜单:SEGGER- Jlink-FLASH 8 x- T% U( N+ ]7 N$ R 打开JLINK软件,它可能会提示建了工程,随便建立一个就行 R& N, l* ?! S2 O 打开配置页面,点击Options->Project settings,会进入到配置页面 ) r5 K+ n, I# B/ _# N2 A; R 配置页面如下图所示,下面进行选择单片机 ![]() : X# X4 |: r2 F3 Y 点击CPU,选择STM32单片机 ![]() # Y4 k$ x- M, a8 H+ ~# L 点击Target Connect 将JLINK和目标板进行连接。 ![]() 如果连接成功,说明单片机和Jlink烧写器都是好的,驱动也安装成功啦。 然后我们可以尝试用Keil5里面的Download试下,应该可以少写了。 (至于用J-Flash如何烧写,按下不表) 3、先别急,我们需要配置芯片,让编译工具和电脑知道我们电路板上面芯片的型号。 + _: W4 J. J3 ^& U5 }) X% u* h 选择Flash里面的Configure Flash Tools ![]() 4 [8 h0 H0 k/ O7 F6 G 我们需要在Device里面选择我们的芯片型号,如下: ![]() 选择Debug 选择Jlink4 p0 [2 w S6 R ![]() 选择Utilities,选择Jlink ![]() 点击Debug里面的 右边的Settings ![]() 选择Debug里面的Port 修改JTAG为 SW ![]() $ j3 v7 V7 ~4 m& D. y3 _ 现在,我们就可以下载啦。 4、修改源码,实现闪灯 4.1删除不需要的功能 至此,我们并没有关心官方的源码到底写了什么内容。 那么我们看下main函数 5 Q6 `( A& d$ A/ { E这个工程是基于STM32 官方的EVM板,这套代码为了支持4套开发板,所以做了4组宏定义,选择。我们在此暂时忽略。 我们将UART、LCD等于我们实验目的无关的代码删除,则,只保留两段代码,如下,一段是LEDInit、一段是LEDOn 我们根据函数的定义,可以顾名思议:LEDInit是LED初始化,LEDOn是LED点亮。 ![]() 4.2 研究 一下LED相关的函数和变量 $ B {0 \, ~3 y. U 我们研究一下这STM_EVAL_LEDInit() LED初始化函数 鼠标放在这个函数上面,右键选择 跳转到 “STM_EVAL_LEDInit” 1 n8 y1 Z3 e( v U8 z, U c. i3 S跳转过去之后,我们可以看到这个就是一个标准的GPIO初始化的函数。 7 E% D4 T) v# i; | M我们去查看一下这几个数组,是如何定义的。 ![]() 由此,我们可以看到,在原始代码里面定义了四个LED的控制GPIO,分别是: F6、F7、F8、F9 0 E2 k. f9 K! L- X 我们查看一下原理图,看看iBox上面的控制LED的GPIO分别是哪几个。 ![]() iBox上面一共有四个LED,红色LED是电源指示灯,不能用GPIO控制。 我们可以看下原理图: ![]() 红色LED的正极接3V3,负极通过一个电阻接GND。 另外三个颜色的灯分别接到GPIO进行控制。 & Q, @( x* d* k 通过查阅MCU的管脚连接,我们可以看到4 U+ e+ b) V. A' \( } PE9控制绿灯 PE10控制黄灯 PE12控制白灯 我们可以修改代码里面LED1、LED2、LED3的管脚号,对我们电路板上的LED控制GPIO进行控制。 ![]() 将上面的LED1的几个值修改为: GPIOE GPIO_Pin_9 RCC_APB2Periph_GPIOE 同样方法,我们修改LED2、LED3 修改完成之后,我们的初始、以及对LED进行控制的代码,就是我们iBox电路板上面的几个LED对应的管脚了。 . K- m) F% B( H) n# ?) e3 g) H 研究完初始化代码之后,我们研究一下 STM_EVAL_LEDOn函数,我们用右键跳转的方式,查看函数定义。 ![]() STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置'1'或置'0'。 GPIOx_BSRR的高16位中每一位对应端口x的每个位,对高16位中的某位置'1'则端口x的对应位被清'0';寄存器中的位置'0',则对它对应的位不起作用。 GPIOx_BSRR的低16位中每一位也对应端口x的每个位,对低16位中的某位置'1'则它对应的端口位被置'1';寄存器中的位置'0',则对它对应的端口不起作用。 此处,我们先简单理解: 比如希望快速地对GPIOE的位7进行翻转,则可以: GPIOE->BSRR = 0x80; // 置'1' GPIOE->BRR = 0x80; // 置'0' 库文件里面已经对各个管脚进行了二进制的对应位进行了定义。 ![]() 7 Q$ _9 Q3 f0 r 所以,我们想让GPIO为低,则运行 GPIO_PORT[Led]->BRR = GPIO_PIN[Led]; 8 }2 K6 j& C1 }- f: i% D0 b* V( Q 如果我们想让GPIO为高,则运行 GPIO_PORT[Led]->BSRR = GPIO_PIN[Led]; : o6 \2 g6 [1 w; n 按照我们的原理图,我的GPIO为低时,LED亮、GPIO为高时,LED灭。 所以我们需要修改函数,如下: ![]() 编译,烧录。我们就可以看到,咱么iBox上的LED按照我们的预期点亮。 至此,咱们的第一个实验完成。 : L d7 v; T' S! { |