案例说明stm32官方库函数使用方法 (库版本v3.5, Keil MDK 5)

发布者:大泉人家最新更新时间:2020-05-22 来源: eefocus关键字:stm32  官方库函数  使用方法  库版本v3  Keil  MDK 手机看文章 扫描二维码
随时随地手机看文章

stm32的官方库非常方便,但是里面的使用手册是英文的,而且也没有很详细的使用说明,对新手来说入门比较困难,而且网上现存的教程要么是针对v2.x的库的,要么是针对keil 4.x的,这两个东西更新后差别都蛮大。有新的可用为何不用最新的呢?


一: 用keil 5构建模板工程。在keil顶部选Project->New uVision Project, 输入工程名称,进入device选择界面。注意,因为keil 5变成了在线安装Package的模式(即刚安装好软件并不附带各种芯片的包,用哪个下哪个),如果你已经安装了ST的Package,不要用那个Package!!Keil 5暂时不兼容官方库,如果用了的话编译会报错。解决方案:1.使用附带的ARM - ARM Cortex M3    2.如果还不行就下载我这个吧,下载好之后模板就全部构建完成了。


在你想要创建工程的文件夹下创建三个文件夹:Library、Project和Output,把刚才创建的工程所有文件剪切进Project文件夹。好了之后,我们需要添加库函数文件。解压库函数包,把解压目录下Library文件夹中的CM3文件夹和STM32F10x_StdPeriph_Driver文件夹复制到工程目录下Library文件夹下,把标准库目录下的:STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_Std Periph_Template文件夹下的main.c、stm32f10x_conf.h、stm32f10x_it.h、 stm32f10x_it.c 拷贝到你的工程Project目录下。


用keil打开你刚才创建的工程,右键点击Source Group->Manage Project Item


把Groups改成下图这样:


然后选择STARTUP,点击右下方的Add Files,添加startup_stm32f10x_md.s ( . LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm


),注意后缀,.s为汇编文件。(具体添加哪一个需要根据你的板载芯片来定,我的芯片Flash是128k的,属于MD,因此添加startup_stm32f10x_md.s,若为256k,则应添加startup_stm32f10x_hd.s,其他请参见官方文件进行选择)然后选择Library,在library组里面添加 “LibrariesSTM32F10x_StdPeriph_Driversrc”里面的全部文件 。


再选择CMSIS,添加Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x”路径下的 system_stm32f10x.c文件,以及LibrariesCMSISCM3CoreSupport下的core_cm3.c 文件。注意,除了了一个.s文件外,只添加.c即可,不需要添加.h。

添加完之后是这个样子(刚添加完没每个文件前有那个加号,编译一次之后就有了):


 添加完之后还不能编译,因为此时Keil还是从默认的路径去寻找要包括的头文件,肯定是找不到的,因此我们要更改一下路径设置,点击魔棒按钮:


点上面C/C++那一栏,点开之后下面有一个Include Paths,点开,修改成下图这样


就是从库函数存放的位置寻找头文件。根据库函数的声明,我们需要根据自己不同的芯片uncomment掉相应的注释。库函数stm32f10x.h原话如下: 


但大家可以试一下,修改这个文件是修改不了的,因为它是只读的。一种做法是找到这个文件之后右键勾掉只读选项再修改,但这种做法太麻烦。Keil提供了一个宏定义的功能,我们只需要在刚才C/C++选项框那里Define栏写上相应代号就行了,相同的还有USE_STDPERIPH_DRIVER, 定义这个才能使用外设库。在Define栏输入USE_STDPERIPH_DRIVER,STM32F10X_MD。


这就相当于在程序中写:#define USE_STDPERIPH_DRIVER


#define STM32F10X_MD


省事很多。


还有在Output选项卡中勾选Create HEX File, 点Select Folder for Objects,选择你建立的Output文件夹(这样所有的生成文件都在Output下,方便管理)。至此,构建就完成了。


大家写程序只需要在main.c中写就行,那么如何引用库函数呢?只需要在main开头写一句include “stm32f10x.h”就可以了,这样就已经包含进了所需的所有库函数。


现在可以编译一下试一下。如果失败,那么可能有两种原因,一是你操作的过 程失误,重新来一下;二是keil5提供的devices还是不兼容,刚才建立工程的时候大家选择的是ARM - ARM Cortex M3 ,其实应该什么都不选的,但什么都不选工程无法建立,那大家可以通过直接下载我的这个工程来规避这个问题。


下面解释一下在Project文件夹下刚才复制进的几个文件:


1.stm32f10x_conf.h文件:该文件不需要手动添加进工程,会自动添加。打开之后会发现,该文件就是include了各种外设的头文件。我们需要用那个,就保留哪个include即可,其他可以删掉或注释掉。默认是全部包含,当然我们不去改动也完全可以。


2.stm32f10x_it.c文件:这个文件包含了所要使用的中断,如果有的话加入即可。


大家可以注意到解压开库函数zip之后有一个chm文件,那个就是官方固件库文档,使用很方便,用哪个查哪个即可,不过当然是全英文。


这里举几个例子说明如何使用这个文档吧,以按键控制LED为例。


首先一定要仔细读这个文档首页的几个链接的内容。看完之后,我们首先明白使用GPIO,就要先用PPP_InitTypeDef函数定义相应结构体,


GPIO_InitTypeDef GPIO_InitStruct;


然后使能对应的时钟,即RCC。用哪个函数呢?打开文档,选择Modules-STM32F10x_Periph_Driver-RCC-RCC_Exported_Functions,这个就是RCC相关的函数了,通过硬件原理图我们可以发现GPIO使用的是APB2时钟,因此就是这个函数了:


该函数参数:


因此我们写成:


RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA , ENABLE ) ;


就是这样,其他的函数使用方法和这个大同小异。


同时,大家也要下载官方硬件的Reference Manual,代号RM0008,可以到我个人网页中下载。推荐仔细阅读前几个章节,后面的需要用那个读哪个。


案例程序main.c:



/*************************************************************

 *        作者:Alan Zhao      *

 *        博客:alanzjl.sinaapp.com      *

 *        CSDN博客:http://blog.csdn.net/alanzjl      *

 *************************************************************

 *    针脚说明:Key1-PA0,Key2-PA1,LED1-PA2,LED2-PB2,LED3-PA3  *

 *************************************************************

*/

#include "stm32f10x.h"

 

enum{LED1,LED2,LED3}LED;

enum{Key1,Key2}Key;

 

void delay(int nms){ //延时

for(;nms>=0;nms--){

int n;

for(n=1200;n>=0;n--);

}

}

 

void LED_Init(GPIO_TypeDef* Pin_Mode, uint16_t pin){ //LED初始化

GPIO_InitTypeDef GPIOInitStructure;

if(Pin_Mode == GPIOA) //由于LED1和LED3为PA,LED2为PB,因此此处需判断

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

else if(Pin_Mode == GPIOB)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

GPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIOInitStructure.GPIO_Pin = pin;

GPIO_Init(Pin_Mode,&GPIOInitStructure);

}

 

void Key_Init(uint16_t pin){ //按键初始化

GPIO_InitTypeDef GPIO_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_InitStruct.GPIO_Pin = pin;

//GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init (GPIOA,&GPIO_InitStruct);

}

 

int Keyscan(uint16_t pin){ //键盘扫描 pin为按键管脚

uint8_t status;

status=GPIO_ReadInputDataBit(GPIOA,pin); //读取按键状态,0为按下

if(status==0){

return 1;

}

else

return 0;

}

 

void LED_ON(LED){ //开灯函数

if(LED==LED1){

GPIOA->BRR=GPIO_Pin_2;

}

else if(LED==LED2){

GPIOB->BRR=GPIO_Pin_2;

}

else if(LED==LED3){

GPIOA->BRR=GPIO_Pin_3;

}

return;

}

 

void LED_OFF(LED){ //关灯函数

if(LED==LED1){

GPIOA->BSRR=GPIO_Pin_2;

}

else if(LED==LED2){

GPIOB->BSRR=GPIO_Pin_2;

}

else if(LED==LED3){

GPIOA->BSRR=GPIO_Pin_3;

}

return;

}

/****************************************************************/

 

int main(void){

 

LED_Init(GPIOA,GPIO_Pin_3);

LED_Init(GPIOA,GPIO_Pin_2);

LED_Init(GPIOB,GPIO_Pin_2);

Key_Init(GPIO_Pin_0);

Key_Init(GPIO_Pin_1);

 

LED_OFF(LED1); //初始化时全部关灯

LED_OFF(LED2);

LED_OFF(LED3);

 

while(1){

LED_ON(LED2);

delay(1000);

LED_OFF(LED2);

delay(1000); //LED2不停闪烁

if(Keyscan(GPIO_Pin_0)){

delay(200); //去抖动

if(Keyscan(GPIO_Pin_0)){

while(Keyscan(GPIO_Pin_0));

GPIOA->ODR ^= GPIO_Pin_2; //灯状态取反

}

}

if(Keyscan(GPIO_Pin_1)){

delay(200); //去抖动

if(Keyscan(GPIO_Pin_1)){

while(Keyscan(GPIO_Pin_1));

GPIOA->ODR ^= GPIO_Pin_3;   //灯状态取反



相关文件下载:STM32官方固件库v3.5     http://download.csdn.net/detail/alanzjl/8638291


STM32官方固件库v3.5模板工程    http://download.csdn.net/detail/alanzjl/8638303

关键字:stm32  官方库函数  使用方法  库版本v3  Keil  MDK 引用地址:案例说明stm32官方库函数使用方法 (库版本v3.5, Keil MDK 5)

上一篇:STM32基于库函数工程模板
下一篇:STM32学习笔记——独立看门狗IWDG介绍及配置

推荐阅读最新更新时间:2024-11-02 10:49

分析师:中芯国际合作案成效3~5年后才能显现
中国晶圆代工业者中芯国际(SMIC),日前宣布与华为(Huawei)、比利时微电子研究中心(Imec)、高通附属公司(Qualcomm Global Trading).宣布共同投资 中芯国际集成电路新技术研发(上海)有限公司 ,开发下一代CMOS逻辑制程,目前计画以14奈米制程研发为起点,并在中芯国际的生产线上进行研究(参考连结)。 中芯国际为中国最大晶圆代工制程厂商,目前8寸晶圆月产能约14万片,12寸晶圆月产能约5万片。现阶段已量产的最先进制程为40/45奈米;28奈米则进入与客户共同开发的阶段;至于14奈米还没有明确的量产时程。 针对中芯国际此次的跨国合作案,全球市场研究机构TrendForce认为,从成员对14奈米制
[半导体设计/制造]
5G芯片市场如火如荼,国内能否分一杯羹
如今,我们生活在一个高速发展的全球信息化时代,整个经济就像地球一样紧密地融合在一起,任何一项新技术的进步都将带来整个产业的全方位变革,5G技术将是未来几年引领时代变革和进步的核心驱动力之一。 大家之所以如此看好5G技术的前景,一方面由于它是未来信息基础设施的核心,高速率、高带宽满足人们对通讯日益增长的新要求;另一方面是因为5G技术为实现真正的“万物互联”提供了可能性,而5G芯片是其中最关键的技术。 正是因为对5G芯片市场前景的看好,国外芯片巨头如高通、英特尔、三星等均在积极研发,力争早日实现5G芯片的商用。这一次巨大的机遇,中国企业也不想错过,以海思、联发科、展锐、大唐联芯等企业纷纷加入5G芯片争夺战。一时间,形成了
[网络通信]
<font color='red'>5</font>G芯片市场如火如荼,国内能否分一杯羹
Atmel宣布基于Cortex-A5的SoC SAMA5D3量产
近日,Atmel宣布其基于ARM Cortex-A5内核的SAMA5D3系列微处理器正式量产。 SAMA5D3采用65nm工艺,最高性能为850DMIPS @ 536MHz,数据传输率最大为1.3GB/s @ 166MHz。 片上浮点计算单元可更好的支持包括图像、音频以及传感器的数据处理。 该产品满载功耗预计在200mW以下,低功耗模式时仅为0.5mW,同时支持快速唤醒功能。 外设包括双以太网接口(一个千兆以太网),USB 3.0,双CAN,TFT LCD驱动,相机接口,SDIO/SD/MMC,UART,SPI,TWI,软解猫,12位ADC以及32位定时器。 同时支持AES、3DES以及SHA加密。 开发者3月之后可以
[单片机]
STM32采用HAL使用usart_DMA问题
在这里需要理解一个概念就是,使用hal库,首先一定要对标准库中外设的使用,有一个很好的了解,在我这里出现这个原因就是由于对标准库中外设的使用不够了解,导致转移到HAL库,出现各种问题。 本次采用的是HAL库串口2中断的接受,DMA方式发送。 具体想实现的功能是:上位机发送一帧固定的数据(15bit)前面2个字节固定的,在串口中断中,检测到了这个前面2个字节是正确的,则进行数据的处理。处理好数据以后,在采用DMA方式发送出去对应的数据。 出现的问题:每次调用函数这个函数后,下次就不能使用了 MYDMA_USART_Transmit(&UART2_Handler(u8*)USART2_TX_BUF,USART2_REC_LEN
[单片机]
gentoo stm32 交叉编译环境
crossdev -t s4 --gcc =5.4.0 -v arm-none-eabi gcc版本为当前系统安装的版本,通过gcc -v 可以获得 编译完成后: arm-none-eabi-addr2line arm-none-eabi-elfedit arm-none-eabi-gcc-ranlib arm-none-eabi-ld.gold arm-none-eabi-size arm-none-eabi-ar arm-none-eabi-emerge arm-none-eabi-gcov arm-none-eabi-nm arm-none-eabi-strings arm-none-ea
[单片机]
STM32下串口的使用
STM32下关于串口的固件库写得相当好了,以下只是本文对串口库的一点点封装: /*HKY_uart.h*/ #ifndef _HKY_UART_H_ #define _HKY_UART_H_ #include stm32f10x_lib.h //#include platform_config.h #define GPIO_RTSPin GPIO_Pin_1 #define GPIO_CTSPin GPIO_Pin_0 #define GPIO_TxPin GPIO_Pin_2 #define GPIO_RxPin GPIO_Pin_3 void USART2_Config
[单片机]
华为5G智能路由器已发售,下载速率可达2.3Gbps
华为5G智能路由器5G CPE Pro已正式发售,售价2499元。首购用户可享受华为的限时直降50元优惠,到手价为2449元。 华为5G CPE Pro于7月10日获得中国首个5G无线数据终端电信设备进网许可证,这也是国内首款支持5G全网通的智能路由器。 官方介绍,华为5G CPE Pro搭载华为首款自研7nm多模5G芯片—巴龙5000,5G峰值下载速率最高可达2.3Gbps,3秒即可缓存一部超清电影,插上5G SIM卡,即可享受5G无线宽带体验。 而且华为5G CPE Pro内置全频段,高达4.9dBi高增益,仿生蝶式双极化巴伦天线,确保360°捕捉最好信号,速度更快、家中摆放更随意,信号质量整体可增强2.8倍
[嵌入式]
华为<font color='red'>5</font>G智能路由器已发售,下载速率可达2.3Gbps
S5PV210时钟详解
1、S5PV210时钟分类: 2、S5PV210时钟流: 3、S5PV210时钟经典配置: 初始化时钟步骤: Step1:选择是否开启PLL,使用PLL(PLL输出时钟为800Mhz ~1Ghz),不使用PLL(绕过PLL模块输出时钟为晶振时钟24Mhz); Step2:设置PLL锁定时间,默认值为0x0FFF,保险起见设置为0xFFFF(寄存器最大值); Step3:设置分频系统,决定由PLL出来的最高时钟如何分频得到各个分时钟(MSYSDSYSPSYS); Step4:设置PLL主要是设置PLL的倍频系统,决定输入端24Mhz的原始频率可以得到多大的输出频率,默认值设置输出为ARMCLK为1Ghz; Step5:
[单片机]
S<font color='red'>5</font>PV210时钟详解
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved