下载代码
stm32规范外设库是stm32全系列芯片的外设驱动,有了它能够大大加快咱们开发stm32。
首先从st公司的网站下载最新的stm32规范外设库,写本文时最新的版本是V3.5.0。
解压该zip文件,得到如下文件夹和文件
STM32F10x_StdPeriph_Lib_V3.5.0\
_htmresc
Libraries
Project
Utilities
Release_Notes.html
stm32f10x_stdperiph_lib_um.chm
其间Libraries包括库的源代码,Project包括stm32各个外设的运用典范和一个工程模板,Utilities是运用st公司评价板的比如,stm32f10x_stdperiph_lib_um.chm教咱们怎样用规范外设库。
工程目录结构
已然预备运用32位单片机,应该是个不小项目,因而工程目录也应该做个规划。这儿我引荐一下我所运用的目录结构。假定工程名字叫template,建一个名为template的文件夹,该目录下有个3个固定文件夹doc,src,include,doc用来寄存工程相关的材料文件,src放源代码,在src下每个功能模块一个文件夹,include放各个模块都要运用的公共头文件。output放编译输出文件,内含两个子文件夹obj和list。
template\
doc
src
include
output\obj
\list
收拾库代码
由于Libraries下的CMSIS文件夹中许多代码是和编译器及芯片相关的,导致文件夹多且深度大,不利于工程保护,实践上一个项目往往是用固定的编译器和芯片,因而有必要对库进行收拾。
在src下树立libstm32目录
1. 把Libraries\STM32F10x_StdPeriph_Driver\下的内容复制到libstm32目录下
2. 在libstm32目录下树立cmsis文件夹,把Libraries\CMSIS\CM3\CoreSupport\下的core_cm3.c,core_cm3.h;Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\下的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h复制到cmsis文件夹中。
3. 依据你所选的芯片类型将Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\下对应的发动文件复制到cmsis文件夹中。这儿我复制的是startup_stm32f10x_hd.s(大容量型stm32芯片的发动文件)。
下面临该库文件做个简略介绍:
Libraries\STM32F10x_StdPeriph_Driver\下的内容很好了解便是stm32的各个外设模块驱动代码。
misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。
Libraries\CMSIS下是什么呢?cmsis英文全称:Cortex Microcontroller Software Interface Standard,是Cortex系列处理器硬件笼统层,能够了解为cortex内核的软件接口。
core_cm3.c, core_cm3.h
它们的目录名为CoreSupport,阐明这两个文件是CM3内核支撑文件,其他运用CM3内核的芯片也能够用,纷歧定是stm32。这两个文件用来获取设置CM3内核,装备一些内核寄存器。
stm32f10x.h, system_stm32f10x.c, system_stm32f10x.h和startup_stm32f10x_hd.s在DeviceSupport目录下,阐明这几个文件是和详细的芯片有关的,也便是stm32芯片的支撑文件。其间stm32f10x.h是规范外设库的进口,运用规范外设库的代码中有必要包括该头文件。system_stm32f10x.c, system_stm32f10x.h这两个文件供给函数用来初始化stm32芯片,装备PLL、体系时钟和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的发动文件。
树立工程
运用keil MDK(我运用4.12版)在template目录下树立工程,工程名为template。选一个stm32系列的芯片,哪一个都无所谓(我选的是STM32F101RC,由于我的板子便是用这个芯片),接下来要注意的是当弹出是否复制发动代码到工程文件夹时要选No,由于规范外设库里现已有发动代码了。
将UV4中project window里的顶层目录名改为template,并将第一个group名改为libstm32。把libstm32目录下一切.c和.s文件加载到工程里的libstm32。
在src下树立一个init目录用来放置体系初始化代码。把Project\STM32F10x_StdPeriph_Template\下的stm32f10x_it.c复制到init文件夹中,stm32f10x_it.h,stm32f10x_conf.h复制到include文件夹中。
stm32f10x_it.c,stm32f10x_it.h是中止服务程序文件。stm32f10x_conf.h是规范外设库的装备文件,关于工程中不需要的外设,能够注释掉里边的包括的头文件。这儿我主张先仅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再翻开什么,这样编译起来快一点,当然也可都藏着。
运用stm32规范外设库
事实上,stm32规范外设库的运用在stm32f10x_stdperiph_lib_um.chm中的How to use the Library一节中已有阐明,下面我把其间的过程罗列一下:
1. 依据所选芯片,把Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中的发动代码加到工程中,这一步在上面现已做过了。
2. 在stm32f10x.h的66-73行,依据所选芯片类型,去掉相应注释,这儿我去掉STM32F10X_HD行的注释(大容量型stm32芯片)。
3. 去掉105行的USE_STDPERIPH_DRIVER注释,启用stm32规范外设库。
4. 在system_stm32f10x.c的110-115行,依据所选芯片主频,去掉相应注释,默许SYSCLK_FREQ_72MHz注释已去掉,假如你的芯片主频是72MHz,就不用做修正了,这儿我的芯片是36MHz,注释SYSCLK_FREQ_72MHz,去掉SYSCLK_FREQ_36MHz注释。
跑马灯程序
现在能够运用stm32规范外设库了,下面以一个简略的跑马灯程序阐明。
在init目录下树立main.c作为体系进口。
在src下树立一个bsp目录用来放置板级支撑代码,树立led.c,led.h。
代码如下:
led.h
#ifndef_LED_H_ - #define_LED_H_
- #include
- #defineLED_00
- #defineLED_11
- #defineLED_22
- voidled_init(void);
- voidled_on(uint32_tn);
- voidled_off(uint32_tn);
- #endif
led.c
#include”stm32f10x.h” - #include”led.h”
- voidled_init(void)
- {
- GPIO_InitTypeDefGPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
- GPIO_Init(GPIOC,&GPIO_InitStructure);
- }
- voidled_on(uint32_tn)
- {
- switch(n)
- {
- caseLED_0:
- GPIO_SetBits(GPIOC,GPIO_Pin_6);
- break;
- caseLED_1:
- GPIO_SetBits(GPIOC,GPIO_Pin_7);
- break;
- caseLED_2:
- GPIO_SetBits(GPIOC,GPIO_Pin_8);
- break;
- default:
- break;
- }
- }
- voidled_off(uint32_tn)
- {
- switch(n)
- {
- caseLED_0:
- GPIO_ResetBits(GPIOC,GPIO_Pin_6);
- break;
- caseLED_1:
- GPIO_ResetBits(GPIOC,GPIO_Pin_7);
- break;
- caseLED_2:
- GPIO_ResetBits(GPIOC,GPIO_Pin_8);
- break;
- default:
- break;
- }
- }
依据不同的板子需要对该代码中的管脚进行修正,但结构是相同的。
main.c
#include”led.h” - staticvoiddelay(uint32_tms)
- {
- uint32_tcount=8000;
- while(ms–)
- {
- while(count–);
- count=8000;
- }
- }
- intmain(void)
- {
- led_init();
- for(;;)
- {
- led_on(LED_0);
- led_off(LED_1);
- led_off(LED_2);
- delay(1000);
- led_off(LED_0);
- led_on(LED_1);
- led_off(LED_2);
- delay(1000);
- led_off(LED_0);
- led_off(LED_1);
- led_on(LED_2);
- delay(1000);
- }
- }
在project中树立init,bsp组,并将各种代码参加。在工程的Options中,c/c++选项卡的Include Paths中增加.\include;.\src\libstm32\cmsis;.\src\libstm32\inc;.\src\bsp;。
Output选项卡Select Folder for Objects中选.\output\obj。
Listing选项卡Select Folder for Listings中选.\output\list。
Debug选项卡选use ULINK Cortex Debugger, Run to main()打钩,这一步我们能够依据自己手上的仿真器做不同挑选。