STM32F1单片机-概述和工程建立

一、STM32概述

  • STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器(ARM内核由ARM公司设计)
  • 高性能系列:STM32F2、F4、F7和H7系列;
  • 主流系列:STM32G0、F0、F1、G4和F3系列;
  • 超低功耗系列:STM32L0、L1、L4、L4+、L5和U5系列;
  • 无线系列:STM32WL和WB系列;
  • STM32寻址范围:0x 0000 0000 - 0xFFFF FFFF

二、STM32F103C8T6概述

  • 系列:主流系列STM32F1
  • 位数(寄存器):32位
  • 内核:ARM Cortex-M3
  • 主频72MHZ
  • RAM:20K(SRAM)
  • ROM:64K(Flash闪存)
  • 供电:2.0~3.6V(标准3.3V)

2.1 STM32F103C8T6内核和外设介绍

  下图为STM32F103C8T6的片上资源/外设
  NVIC和SysTick是内核内的外设,其余外设是内核外

在这里插入图片描述

  下图为STM32F1系统结构图
  Cortex-M3内核以及DMA1、2为F1架构主动单元。右边FLASH、SRAM、FSMC、AHB、APB等为被动单元
  举例说明:开启RCC时钟,从而控制AHB到APB的桥(AHB2APBx),它通过APB1(36MHZ)和APB2(72MHZ)外设总线连接所有的APB设备,例如GPIOx、TIM1、ADC等等

在这里插入图片描述

2.2 STM32F103C8T6时钟树

  • 选择 - 乘法 - 除法
  • 时钟是具有周期性的脉冲信号

  下图是STM32F103系列的时钟源表格
  HSE来自于外部晶振,一般是8MHz,用于系统时钟和RTC。LSE来自于外部晶振,一般是32.768KHz,用于RTC。HSILSI来自内部RC电路振荡器得来,分别用于系统时钟和RTC/IWDG

在这里插入图片描述

  下图是STM32F103系列的时钟树简图
  HSE和HSI一般可以作为系统时钟,由于STM32F103系列的单片机系统时钟一般是72MHz,HSE在进入锁相环倍频前首先需要1或者2分频,然后通过PLL锁相环倍频得到72MHz。HSI进入锁相环前必须2分频,但是最大就是4*16=64MHz,所以得不到72MHz。
  系统时钟SYSCLK经过分频到AHB总线72MHz,随之分频到APB1(36MHz)、APB2(72MHz)、内核AHB总线的外设,然后APB1APB2的时钟提供给其挂载的外设
  LSI作为IWDGRTC的时钟,LSE也可以作为RTC的时钟

在这里插入图片描述
在这里插入图片描述
  下图是STM32F103系列的时钟树完整图
  系统时钟一般选择外部高速时钟HSE-8MHz,1分频后进入锁相环*9得到72MHz。AHB和APB2为72MHz,APB1为36MHz,定时器一般都是72MHz,ADC为12MHz,具体见下图

  SYSCLK-系统时钟、HKCL-AHB时钟、PCLK1-APB1时钟、PCLK2-APB2时钟
  使用任何一个外设前都要时钟使能

在这里插入图片描述

2.3 STM32F103C8T6存储器和寄存器映射

  • 存储器指可以存储数据的设备,本身没有地址信息,对存储器分配地址的过程叫做存储器映射
  • ST将4GB(2^32)地址空间分成8个块:Code(FLASH)、SRAM、片上外设(AHB、APB1和APB2总线外设)、FSMC(2)、FSMC寄存器、内核外设
  • 寄存器是特殊的存储器,给寄存器地址命名的过程叫做寄存器映射
  • 寄存器分类:内核寄存器外设寄存器
  • 寄存器地址计算(32位地址) = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET

  寄存器地址分为:总线基地址(BUS_BASE_ADDR)、外设基于总线基地址的偏移量(PERIPH_OFFSET)、寄存器相对外设基地址的偏移量(REG_OFFSET)

2.4 STM32F103C8T6引脚定义和电路图

  下图为STM32F103C8T6的引脚定义

在这里插入图片描述

  类型中S代表电源、I代表输入、O代表输出、I/O代表输入输出。电平中FT表示可以容忍5V电压、其余只能容忍3.3V,如果3.3V电压想要接5V电压,需要电压转换电路。引脚主功能是指上电默认的功能,默认复用功能就是IO口上同时连接的外设功能引脚,配置IO口时,可以选择通用功能,还是复用功能。重定义功能,如果有两个功能同时复用在一个IO口上,那就可以重映射到此口上

  • VBAT:备用电池供电,接3V电池,系统电源断电时,备用电池可以给内部RTC时钟和备份寄存器提供电源
  • PC13-TAMPER-RTC:IO口/侵入检测/RTC
  • PC14-OSC32_IN/PC15-OSC32_OUT:IO口/32.768KHz的RTC晶振
  • OSC_IN/OSC_OUT:主晶振,一般是8MHz,最终产生72MHz的频率作为系统的主时钟
  • NRST:系统复位引脚,N表示低电平复位
  • VSSA/VDDA:内部模拟部分的电源,VSS接GND,VDD接3.3V
  • PA0-PA12/PB0-PB1/PB5-PB15:IO口,其中PA0兼具唤醒处于待机的STM32
  • PA13-PA15/PB3-PB4:IO口和调试端口
  • BOOT0:启动配置
  • PB2:IO口或者BOOT1引脚,BOOT引脚用来配置启动模式
  • VSS_123/VDD_123:主电源口,VSS接地,VDD3.3V

启动配置

在这里插入图片描述

  系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值就会被锁存
  一般情况下,程序运行都是都是在Flash存储器里开始执行(X0),我们也可以利用启动模式使得在别的地方开始执行,用以完成特殊的功能,01用以串口下载,11程序调式

  下为STM32F103C8T6的最小系统电路图

在这里插入图片描述

三、STM32标准库工程建立-Keil

  STM32系列单片机开发,不再像51系列单片机在程序中自行配置寄存器实现功能,而是基于库函数的开发,库函数中已经配置好相关寄存器

  • 新建项目,选择单片机型号,在项目文件夹内事先新建文件夹,然后再在Keil里面添加文件夹
  • 新建的文件夹需要添加到Keil工程里时,然后在工程选项里添加上这个文件夹的头文件路径(Start、User…)(魔术棒 —> C/C++ —> include Paths)
  • 调试下载程序:需要配置ST-link或者J-Link(魔术棒 —> Debug —> ST-Link),勾选Reset and Run(Setting —> Flash Download)-实现下载自动复位,运行编译完成后,点击Load按钮下载程序

  新版本Keil需要去掉Enable(Setting —> Pack)的勾选,才可以实现下载自动复位

3.1 具体步骤

  1. 首先STM32的启动文件,新建文件夹Start,将以下启动文件添加

  STM32F10x系列的启动文件

在这里插入图片描述

  STM32F10x的外设寄存器描述文件,描述寄存器地址和配置时钟

在这里插入图片描述

  STM32的内核寄存器描述文件
  STM32是由内核和内核外围的设备组成

在这里插入图片描述

  最后将启动文件添加到Keil工程里,F103系列需要添加md.s的启动文件外设寄存器描述文件内核寄存器描述文件

在这里插入图片描述

  1. 新建Library文件夹,添加库函数;新建User文件夹,添加main.c库函数头文件包含文件中断函数

  STM32的库函数,misc.c是内核库函数,其余是外设库函数

在这里插入图片描述
  库函数的头文件

在这里插入图片描述
  添加好库函数后需要往配置库函数头文件的包含关系,将conf.h添加到user文件夹,另外it文件用来存放中断函数

在这里插入图片描述

  最后将如下字符串复制到Define宏定义(魔术棒 —> C/C++ —> Define),这样才能包含标准外设库,就是相当于声明10x.h时也默认声明了各个外设的.h文件
在这里插入图片描述

  所有准备工作完成以后就可以进行STM32F103C8T6的开发

四、STM32HAL库工程建立

  无论是HAL库还是标准库,都需要下载固件包,然后新建工程模板,加入必要的文件

4.1 HAL工程建立

4.1.1 HAL库重要文件

  • 下图是CMSIS文件夹中重要的文件夹
    在这里插入图片描述
  • 下图是CMSIS/Device文件夹中重要的文件
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
  • 下图是CMSIS/Core文件夹中重要的文件
    在这里插入图片描述

  一共11个文件,作为启动文件

  • 下图是HAL和LL库源码所在文件夹
    在这里插入图片描述

4.1.2 新建HAL工程

  • 新建工程文件夹

在这里插入图片描述

  1.Start文件夹中存放必要的启动文件即可

在这里插入图片描述

  2.Library文件夹中存放HAL库源文件(其中根据报错可能要添加补充文件夹和删除模板文件)

在这里插入图片描述  3.User文件夹存放如下文件

在这里插入图片描述

  • 新建工程框架

  新建工程选择芯片型号,百宝箱新建同原文件夹名一样的文件夹,并添加文件夹内文件

  • 至此,启动文件、库函数和一些必要的文件已经添加完成,还需要进行一些设置

  设置编译器版本为5 — 将USE_HAL_DRIVER,STM32F103xB复制到C/C++中的define(同标准库一样) — 添加文件夹路径
  C/C++宏定义USE_HAL_DRIVER,使得1xx.h包含hal.h,其中hal.h里包含hal_conf.h(包含各个外设的.h文件声明)
  所以HAL库的头文件是#include “stm32f1xx.h”

4.2 CubeMX工程建立

  • STM32CubeMX是ST开发的一款图形配置工具,可通过配置自动生成初始化代码(标准库需要自己写初始化代码)

  一个图形配置工具,搭配不同系列的STM32Cube固件包,即可支持不同系列的STM32芯片

4.2.1 软件下载和固件库关联

  • 步骤:获取java软件(环境) — 获取STM32CubeMX软件下载并关联STM32Cube固件包

  检测java环境是否正常安装,Win+R,输入java -version,如下所示

在这里插入图片描述
  D盘新建存放STM32Cube固件包的文件夹

在这里插入图片描述

  打开CubeMX,Help - Updater Settings,然后修改固件包路径

在这里插入图片描述
  关联STM32固件包,Help - Manage embedded software packages,可以在线下载或者将固件包复制到固件包路径下,关联成功会变成绿色

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

4.2.2 工程建立步骤(GPIO为例)

  • 新建工程,选择芯片型号STM32F103C8T6

在这里插入图片描述

  • 时钟模块配置:设置HSE(外部高速时钟)、LSE(内部高速时钟)、MCO

在这里插入图片描述

  • 时钟系统配置:最终实现AHP、APB2是72MHz,APB1是36MHz等等

在这里插入图片描述

  • 模块配置:GPIO为例,点亮PC13引脚的LED灯

在这里插入图片描述

  • Cortex内核配置:SYS(下载)配置、NVIC优先级等等

在这里插入图片描述
在这里插入图片描述

  • 生成工程源码:设置工程,MDK等,最终生成代码工程

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 编写用户程序:在main.c文件预留(BEGIN-END)的位置编写代码,CubeMX只提供初始化函数,需要自行编写其他程序

在这里插入图片描述

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值