单片机为STM32F1系列,F1系列单片机如STM32F103ZET6,STM32F103C8T6

简介

  1. stm32基于arm内核架构,arm内核有Cortex-A/Cortex-M/Cortex-R/Cortex-X系列
  2. stm32单片机和51单片机的区别:
    1. 51单片机由因特尔公司推出,只有8位;而STM32单片机由ST公司推出,有32位的

STM32的选型

意法半导体公司有8位和64位的单片机(Single-Chip Microcomputer)。根据项目需要选择8位还是32位的,具体选用哪一款型号的芯片以及查看某一款芯片的硬件资源可以查看STM32产品选型手册。

1.芯片内部资源描述

不同型号的STM32F103xx芯片会在闪存容量,RAM空间,定时器,外设,GPIO口个数等不同,因此选型时需要考虑到芯片的内部资源,这部分内容可以参考芯片的数据手册。

2.STM32系列产品命名规则
  1. STM32微处理器有主流MCU/高性能MCU/超低功耗CPU等。其产品型号说明如下:

STM32程序开发之编程环境搭建

1.Keil MDK的安装及配置
  1. 安装Arm Keil MDK,这里安装MDK5.26版本
  2. 上Keil公司官网下载后缀名为pack的芯片支持包并进行双击安装。这里我安装的是F1xx的
  3. 打开Keil uVision5 IDE,修改编辑器的编码为gb2312
  4. 设置Tab键大小为4,并且使用空格代替Tab,然后可视化空格字符
    image
  5. 设置显示行号
  6. 配置MDK5的自动补齐功能
  7. 调试时,监视窗口变量的值显示十进制值:右击属性列,取消勾选十六进制显示
  8. 支持C99模式:点击魔术棒=》c/c++
  9. 生成可执行文件时生成浏览信息
    image
2.STM32CubeMX的安装及配置
  1. 地址上下载安装包根据提示进行安装
  2. 点击Help=》Updater Settings修改仓库的位置
3.固件包下载
  1. 如果使用标准库进行开发则下载标准外设库
  2. 如果使用HAL库进行开发,则下载STM32Cube MCU软件包,其中包含HAL API
4.安装CH340驱动

使用的USB转TTL模块需要安装这个驱动

5.安装ST-Link驱动

由于我使用的是ST-Link V2进行STM32程序的下载和调试,因此计算机需要安装这个驱动

STM32程序之开发方式

  1. 函数库开发:ST公司开发了两套库,分别是标准外设库和HAL(hardware Abstraction Layer)库
  2. 寄存器开发:直接操作寄存器
  3. 图形界面开发:使用STM32CubeMx软件进行开发

STM32程序之项目工程模版的创建

STM32程序之项目工程模版的创建

STM32程序之烧录方式

主要包含以下几种:

  1. ISP(In-System Programming)下载:使用引导程序(Bootloader)加上外围UART/SPI等接口进行烧录
  2. ICP(In-Circuit Programmer):使用SWD或者JTAG接口
1.ISP
  1. 计算机安装CH340驱动
  2. 接线:将CH340 USB转TTL模块连接单片机的串口及计算机的USB接口
  3. 将开发板上的 BOOT0 跳线帽接到 1 ,BOOT1 跳线帽接在 0
  4. 串口下载:打开串口下载工具FlyMcu进行程序下载,如下图所示:
2.ICP

使用这种方式进行不仅可以进行程序烧录,还可以进行程序调试。使用这种方式之前需要有一个DAP或者ST-LINK。

  1. 这里以野火的DAP下载器为例
    1. 使用Keil uVersion5进行工程编译之前,进行魔法棒的配置


    2. 将DAP下载器连接到JTAG接口
    3. 点击Build,Dowload
  2. 这里以ST-LINK为例:
    1. 笔记本安装ST-LINK驱动
    2. 进行魔术棒的配置

STM32程序之启动流程

当前开发板使用的是ARM Cortex-M内核。

  1. 当开发板上电或者按下复位键进行复位以后,将根据BOOT0/BOOT1确定程序从哪个存储位置执行
    image
  2. 执行后缀名为.s的启动代码,这部分代码使用Thumb指令集编写的。这部分代码完成的工作主要如下:
    1. 初始化用户堆栈:比如将栈的大小初始化为4KB,堆的大小初始化为512B
    Stack_Size      EQU     0x00001000
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
    Stack_Mem       SPACE   Stack_Size
    
    Heap_Size       EQU     0x00000200
    
                    AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    __heap_base
    Heap_Mem        SPACE   Heap_Size
    __heap_limit
    
    1. 初始化栈顶地址SP及程序计数器PC:比如设置PC为Reset_Handler,这个复位中断执行的工作是初始化系统时钟及闪存设置等,然后跳转到C库的__main函数(这个函数最终会跳转到程序员编写的main函数);
    ;当处理器复位时,硬件会自动从地址0(即向量表的起始位置)读取前两个字:
    ;第一个字加载到SP(堆栈指针)
    ;第二个字加载到PC(程序计数器)
    __Vectors       DCD     __initial_sp               ; Top of Stack
                    DCD     Reset_Handler              ; Reset Handler
                    
    ; Reset handler
    Reset_Handler   PROC
                    EXPORT  Reset_Handler             [WEAK]
                    IMPORT  __main
                    IMPORT  SystemInit
                    LDR     R0, =SystemInit
                    BLX     R0               
                    LDR     R0, =__main
                    BX      R0
                    ENDP
    
    1. 填充中断向量表:第一个条目是栈顶地址,除此之外都是中断服务程序的地址
  3. 执行完启动代码程序最终会执行我们常说的程序入口main函数