大家好,欢迎来到IT知识分享网。
STM32F1单片机-概述和工程建立
一、STM32概述
- STM32是ST公司基于ARM Cortex-M3内核开发的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。HSI和LSI来自内部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总线的外设,然后APB1和APB2的时钟提供给其挂载的外设
LSI作为IWDG和RTC的时钟,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里面添加文件夹
- 新建的文件夹需要添加到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 具体步骤
- STM32的启动文件,新建文件夹Start
- 以下文件添加到Start文件夹内
- F103系列需要添加md.s的启动文件
- 新建Library文件夹,添加库函数和库函数声明文件
- misc.c是内核库函数,其余是外设库函数
- 新建User文件夹
- 添加main.c、库函数头文件包含文件和中断函数
- 如下字符串复制到Define宏定义(魔术棒 —> C/C++ —> Define),包含标准外设库,声明10x.h时也默认声明了conf.h文件
四、STM32HAL库工程建立
无论是HAL库还是标准库,都需要下载固件包,然后新建工程模板,加入必要的文件
4.1 HAL工程建立
- 下图是CMSIS文件夹中重要的文件夹
- 下图是CMSIS/Device文件夹中重要的文件
- 下图是CMSIS/Core文件夹中重要的文件
- 一共11个文件,作为启动文件
- 下图是HAL和LL库源码所在文件夹
- 具体步骤:新建工程文件夹
- Start文件夹中存放必要的启动文件即可
- Library文件夹中存放HAL库源文件(其中根据报错可能要添加补充文件夹和删除模板文件)
- 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”
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/147471.html