下载keil:Initdev——Keil5安装教程(包含C51与MDK共存)WIN10 亲测可用
标准外设库文件结构
标准外设库将外设寄存器操作封装成C函数,每个外设驱动都由一组函数组成,这组函数覆盖了该外设的所有功能。简单地说,使用标准外设库开发方式最大的优势在于开发者不用深入了解底层硬件细节,就可以灵活、规范地使用每个外设。
库文件下载:
1. 打开链接:https://www.st.com/en/microcontrollers.html,点击Tool & Software 按钮。2. 在右侧出现选项目里,找到Embedded Software栏,点击红框中位置进行下载。 3. 点击后会跳转到如下界面,找到对应的芯片型号,点击如下红框中位置。4. 进入下载界面,点击Get Software。
解压文件:
(1)_htmresc:存放logo标志,可忽略
(2)Libraries:库函数和源文件夹,包含STM32的系统文件和新建工程所需要的文件,如启动文件和大量的头文件,即所谓的标准外设库文件。
Libraries文件由CMSIS(核心文件)和STM32F10x_StdPeriph_Driver(片内外设操作文件)两个文件夹组成。
STM32F10x_StdPeriph_Driver又包含inc和src文件夹,inc存放stm32f10x_xxx.h文件,src存放stm32f10x_xxx.c文件,文件之间相对应,一组文件对应一个片内外设。
(3)Projrct:由STM32F10x_StdPeriph_Examples(官方各种片内外设的例程)和STM32F10x_StdPeriph_Examples(基于不同编译器的各种工程模板),Keil对应的是MDK-ARM文件夹,IAR对应的是ENMARM文件夹
(4)Utilities:包含了相关评估板的示例程序和驱动函数,供官方评估板的开发者使用(不懂。。。。)
(5)stm32f10x_stdperiph_lib_um.chm:使用手册和帮助文档
外设库的主要文件:
其中启动文件starup_stm32f10x_xx.s有8个文件,负责芯片上电后引导程序进入main函数,位于(Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm)对堆栈等初始化,对中断向量表以及对应的中断处理函数的定义
x_hd.s:适用于大容量的SM32,Flash的容量大于或等于256kb;
x_md.s:适用于中等容量的STM32,Flash的容量为64-256kb;
x_ld.s:适用于小容量的STM32,Flash的容量小于32kb。
STM32F10x标准外设库所用到的外设
注:DMA :传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成
SDIO(Secure Digital Input and Output)中文名称:安全数字输入输出,定义了一种外设接口,SDIO主要有两类应用——可移动和不可移动
外设函数命名规则:
(1)名为PPP_Init的函数,其功能是根据PPP_IntiTypeDef结构体中指定的参数来初始化外设PPP的;
(2)名为PPP_DeInit的函数,其功能是将外设PPP的所有寄存器复位至默认值;
(3)名为PPP_Cmd的函数,其功能为使能或者失能外设PPP;
(4)名为PPP_ITConfig的函数,其功能为使能或者失能来自外设PPP的中断源;
(5)名为PPP_DMAConfig的函数,功能为使能或者失能外设PPP的DMA接口;
(用以配置外设功能的函数,总以字符串“Config”结尾)
(6)名为PPP_GetFlagStatus的函数,,其功能为检查外设PPP某标志位是否被设置;
(7)名为PPP_ClearFlag的函数,其功能为清除外设PPP的标志位;
(8)名为PPP_GetITStatus的函数,其功能为判断来自外设PPP的中断是否发生;
(9)名为PPP_ClearITPendingBit的函数,其功能为清除外设PPP中断待处理标志位。
基于标准外设库新建工程模板
(1)打开keil,新建工程
芯片的选择:
随后弹出添加库文件的界面,直接点ok
(2)复制标准外设库文件到相应文件夹中
一般需要新建四个文件夹,USER(从标准库复制四个文件以及自己自定义的main.c文件stm32f10x_conf.h,stm32f10x_it.h,stm32f10x_it.c,system_stm32f10x.c),BSP(用户自己编写的硬件驱动文件),CORE(存放系统文件和启动文件从标准库中复制三个文件,core_cm3.c,core_cm3.h,startup_stm32f10x_hd.s),FWLib(直接复制STM32F10x_StdPeriph_Driver中inc和src文件夹)
注:stm32f10x_conf.h,stm32f10x_it.h,stm32f10x_it.c,system_stm32f10x.c位于Project\STM32F10x_StdPeriph_Template
core_cm3.c,core_cm3.h位于Libraries\CMSIS\CM3\CoreSupport
startup_stm32f10x_hd.s(根据需求选择见《外设库的主要文件》)位于Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
(3)新建main文件到USER文件夹包括.c和.h
(4)添加文件到工程中,如图依次添加(这一步只需添加.c和.s文件)
(5)配置keil
设置晶振:
设置生成HEX文件:
(6)在工程设置窗口的"C/C++"选项页的"Define"框中输入STM32F10X_HD和USE_STDPERIPH_DRIVER这两个宏(中间用空格或者逗号隔开就行)
添加USE_STDPERIPH_DRIVER是为了屏蔽编译器的默认搜索路径,转而添加到工程的STM32F10x标准外设库中,即使用STM32F10x标准外设库开发STM32;
针对具体型号的芯片开发时,需对所采用型号的微控制器进行预先设置,才能使用STM32F10x标准外设库中相应的大容量新片定义的寄存器,STM32F10X_HD为大容量芯片,STM32F10X_MD为中容量芯片,STM32F10X_LD为小容量芯片
(7)在工程设置窗口的"C/C++"选项页的"Include Paths"中,将工程头文件.h添加到对应搜索路径中
编译运行仿真
main.c代码(添加到USER文件夹中)
#include "stm32f10x.h"
#include "led.h"
/*
*函数名:Delay
*功能描述:不精确延时,延时时间为Count/72000 ms
*输入参数:nCount
*输出参数:无
*/
void Delay(__IO u32 nCount)
{
for(;nCount !=0;nCount--);
}
int main(void)
{
LED_Init();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);// PB5置为1,LED灭
Delay(720000); //延迟10ms
GPIO_ResetBits(GPIOB,GPIO_Pin_5); // PB5置为0,LED亮
Delay(720000); //延迟10ms
}
}
led.c代码 (添加到BSP文件夹中)
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
led.h代码(添加到BSP文件夹中)
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
void LED_Init(void);
#endif
仿真:参照qq_45907958——用proteus实现STM32仿真
注:链接中的原理图与代码不符,如下是正确的