使用MDK开发STM32程序从零开始的探索:
领导突然告诉我说,公司马上要上一个STM32平台的监控模块,要我尽快熟悉下,然后开始做。一声令下如山倒,马上开始。
虽然接触单片机,嵌入式这些概念的时间不短了,有些认识,不敢说是高手,精通,至少也该算是入门了吧,但是,虽然泛泛的来讲,嵌入式都是差不多的,从细节来看,每个平台还是有它独有的技术特点在里面的,不然世界上不会出现那么多种类,那么多内核,那么多型号不同的处理器了。所以,开始接触一个新平台的时候要适当的摒弃一些以前所掌握的知识,因为可能在你手上的这个新的平台他的某个理念和你之前所接触到的芯片是完全不同的一种实现方式,又或者他们一共的例程的格式,写法和习惯和以前的不一样,可能是更加先进了,但是和以前的思路完全不一样,如果你按照老套路去看待新问题的话,会让自己陷入死循环,无法自拔,当然,凭你的聪明才智我相信最终会转出来,但是走这么一段痛苦的弯路的经历似乎不是我们愿意的。废话了这么多,开始进入主题,从0开始到第一个程序跑起来的过程。
由于以前用过51的芯片,所以在考虑做STM32的时候首选还是决定用KEIL,不过现在KEIL被ARM公司收购了,改名叫MDK。 用过KEIL的都知道,建立一个工程,选择芯片,他会自动加载一个对应所选芯片的启动代码,像51的就会生成startup文件,可能有的人不会注意到。当然大多数时候我们不需要去管这个启动文件,他会自动跳转到你的_main文件去执行的。同样的,当你选择了STM32的型号之后他会加载一个启动文件。我用的处理器为 STM32F103VB,他自动加载了一个"STM32F10X.S"的启动文件,呵呵,和我想象中的一样,这点还是蛮厚道的。马上开始进入_main的世界?NO,问题来了,以前用51的时候编译器自动加载了启动文件,我直接开始进入main了,程序跑得很happy,我以为STM32也是一样的。谁知道根本不是这么回事。痛苦了很久,过程就不讲了,不愿意把痛苦加载给大家。原来MDK下的启动代码有两个,"STM32F10X.S"和"cortexm3_macro.s",用查找搜索的方法把keil目录下的"cortexm3_macro.s"找到,然后手动加载到工程里,这时候启动代码才算完整了,否则,你即使威胁它,如果不跑你去死它也是不会转起来的。
现在可以开始进入main的世界了。
有一点要特别注意,STM32提供了丰富的例程,升级了很多个版本。一定要让所有的文件都是同一个版本的,否则会出现大量的编译错误和冲突。比如说,以前的老版本的寄存器定义都是按照以前的通用方式,"stm32f10x.h"里面定义 #define usart (unsigned int 0x40000000),现在最新版本的例程不是这样的了,他的定义在一个叫"stm32f10x_map.h"的文件里,而且定义的方式也大不一样,都是用的指针的方式定义的。这点一定要注意,否则,又要走弯路了。
我碰到了这些问题就跑起来了,呵呵,应该还算顺利。祝大家玩STM32开心... |