说说我的教材吧

我使用的是原子的stm32的书, 手上暂时没有其他的书了,就只能将就着用这本了,听说口碑还是不错的。

配置开发环境

这两个是必要的开发程序,网上随便一搜一大把教程。MDK5是可以安装C51的库进行51单片机的开发的,MDK5还有实时语法检测,用起来很爽。

除了这两个软件以外,还要进行stm32的配置(应该叫做 新建基于固件库的MDK5工程模板,网上也是一堆教程。

初始化MDK5

下载STM32固件库

我用的是STM32F10x_StdPeriph_Lib_V3.5.0

STM32跟51单片机其实本质上并没有什么差别,都是一样的冯罗伊曼架构,只不过就是寄存器多了一点而已; 所以要直接对STM32寄存器操作就变得不容易了,因为你可能记不完全,这时候固件库的重要性就体现出来了。 这个库给我们提供的库函数可以让我们轻松的开发STM32,而不用刻意去记忆寄存器。

建立工程并复制固件库到本地文件夹

  • 先建立一个文件夹,新建USER文件夹,将工程文件保存在其中
  • 再建立与USER同级文件夹CORE,OBJ,STM32F10X_FWLib
  • STM32F10x_StdPeriph_Lib_V3.5.032F10x_StdPeriph_Driver下的inc, src这两个目录拷贝去STM32F10X_FWLib
  • 将*STM32F10x_StdPeriph_Lib_V3.5.03下的core_cm3.ccore_cm3.h拷贝去CORE
  • 在*STM32F10x_StdPeriph_Lib_V3.5.0332F10x下,有8个启动文件,选择对应的启动文件, 拷贝到CORE中。 startup_stm32f10x_cl.s适用于小容量,startup_stm32f10x_md.s适用于中等容量,startup_stm32f10x_hd.s适用于大容量。小容量:Flash≤32KB, 中等容量:64KB≤Flash≤128KB,大容量:256KB≤Flash
  • STM32F10x_StdPeriph_Lib_V3.5.0332F10x下的3个文件stm32f10x.hsystem_stm32f10x.csystem_stm32f10x.h拷贝到USER
  • STM32F10x_StdPeriph_Lib_V3.5.032F10x_StdPeriph_Template中的4个文件main.cstm32f10x_conf.hstm32f10x_it.cstm32f10x_it.h拷贝到USER中 ### 将固件库添加进工程中
  • 在工程目录下新建4个文件夹 USER, CORE, OBJ, FWLib
  • 将本地文件夹中对应文件夹的.c文件添加进工程中

配置头文件目录

如图所示,添加你的头文件的目录

仿真的配置问题

如图所示

get到的新东西

  • stm32居然有多个时钟源,这是我之前不知道的,多个时钟源的原因是为了节省资源,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,而有些外设需要的时钟并不需要太快,所以stm32通过分频,不同的5个时钟源给不同的外设。
  • 结构体的使用。之前学习51单片机时,其实很多c语言的知识都没有用上的,一直不明白那些知识的用处。在我看stm32的固件库的时候,看见了很多函数的参数都是用结构体来传递的,这样的好处是参数的个数比较容易更改,只需要更改结构体中的参数个数就可以了。
  • 定义自己的类型。这也是我在看stm32的固件库才了解到的,虽然我很久以前就知道要定义自己的数据类型,但一直都很少用,因为作用不大,在stm32固件库中看见了大量的使用,固件库中所有的数据类型都是使用自己的定义,我觉得这样的好处是可以增加程序的易读性和兼容性。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /*stm32f10x.h*/
    ...
    typedef struct
    {
    __IO uint16_t CR1;
    uint16_t RESERVED0;
    __IO uint16_t CR2;
    uint16_t RESERVED1;
    ...
    } TIM_TypeDef;
    ...
    /*stm32f10x_tim.h*/
    ...
    void TIM_DeInit(TIM_TypeDef* TIMx);
    ...

这是固件库中的一段对结构体的用法和定义自己的数据类型。