【嵌入式】STM32的库函数使用

2019-07-19来源: eefocus关键字:嵌入式  STM32  库函数

使用编译环境为MDK5,烧录器将会使用JTAG和串口两种,芯片为STM32F103C8T6



零、前准备

1.MDK5编译环境

2.JTAG驱动或串口驱动

一、建立工程模板,写一个简单的小程序

1).创建工程目录

这里就会使用MDK创建工程了,由于STM32的工程已经比较大了,所以在工程目录下将会再创建多个目录,以便整理。

(说明一下,其实随便放都可以,只要工程都能包含以下说到的文件即可)

这里工程名就叫template吧(.代表工程目录):

.CORE 存放芯片内核驱动文件;

.FWLIB 使用库函数的话存放库函数;

.OBJ 存放编译生成文件;

.SYSTEM 存放系统代码;

.USER 存放工程文件,应用程序等。

新建好后就可以先把将会用到的文件放进去了,这里使用的是库函数3.5版本,

1.STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport下有两个文件core_cm3.c和core_cm3.h放进CORE文件夹中,是CM3的内核支持文件,其他使用 CM3 内核的芯片也可以用,不一定是 stm32。这两个文件用来获取设置 CM3 内核,配置一些内核寄存器;


2.STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm下有用汇编语言写的内核启动代码,根据容量选不同的代码,C8T6属于MD级别的,所以复制starup_stm32f10x_md.s到CORE文件夹中;

3.STM32F10x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10x_StdPeriph_Driver下就是各外设的库函数文件及其接口,直接把inc和src两个文件夹复制在FWLIB中;


4.STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x下有几个源码文件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 接口。这几个文件放在.USER里。


5.STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_Template下有三个文件stm32f10x_it.cstm32f10x_it.h,stm32f10x_conf.h复制到.USER文件夹中


2).创建MDK工程


1.打开MDK后选择project-->New uVision Project-->工程文件保存在USER里-->选择对应的芯片


2.在左边Project栏右键有个Manage Project Items,打开后将刚刚复制的文件都添加进去,注意不要忘了那个汇编语言写的.s文件



3.添加好后,再设置一下工程属性,Project-->Options for Target 'uCOS-II'


Output栏的Create HEX File要选上;


C/C++栏有个Include Paths里要把所有有inc文件的目录都添加上;


Debug栏这里改用J-LINK/J-TRACE Cortex。


4.修改一下文件内容


在 stm32f10x.h 的 66-73 行,根据所选芯片类型,去掉相应注释,这里我去掉STM32F10X_MD 行的注释(中容量型 stm32 芯片);


在 stm32f10x.h 的 去掉 105 行的 USE_STDPERIPH_DRIVER 注释,启用 stm32 标准外设库;


在 stm32f10x_conf.h 的 28-49 行可以把无需用到的库函数注释掉加快编译时间,同时把之前添加在工程里的库函数.c和.h文件去掉(这一步可在最后才做)。


5.就写一个LED灯闪亮的小程序


main.c

 /* Includes ------------------------------------------------------------------*/

#include "stm32f10x.h"

#include 

#include "sys.h"

#include "delay.h"


int main(void)

{

GPIO_InitTypeDef  GPIO_InitStructure;

delay_init();

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //enable PB clock

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PB.8

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz

  GPIO_Init(GPIOB, &GPIO_InitStructure);  

  GPIO_SetBits(GPIOB,GPIO_Pin_8); //Set bit

 

  while(1)

{

    GPIO_ResetBits(GPIOB,GPIO_Pin_8);

delay_ms(500);

GPIO_SetBits(GPIOB,GPIO_Pin_8);

delay_ms(500);

}

//return 0;

}

delay.c

 #include "delay.h"

#include "sys.h"

//////////////////////////////////////////////////////////////////////////////////  

//如果使用ucos,则包括下面的头文件即可.

 

static u8  fac_us=0;//us延时倍乘数

static u16 fac_ms=0;//ms延时倍乘数


void delay_init()  

{



SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟  HCLK/8

fac_us=SystemCoreClock/8000000; //为系统时钟的1/8  

fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   

}     



//延时nus

//nus为要延时的us数.        

void delay_us(u32 nus)

{

u32 temp;      

SysTick->LOAD=nus*fac_us; /加载    

SysTick->VAL=0x00;        //清空计数器

SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  

do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   

SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器

SysTick->VAL =0X00;       //清空计数器  

}

//延时nms

//注意nms的范围

//SysTick->LOAD为24位寄存器,所以,最大延时为:

//nms<=0xffffff*8*1000/SYSCLK

//SYSCLK单位为Hz,nms单位为ms

//对72M条件下,nms<=1864 

void delay_ms(u16 nms)

{     

u32 temp;    

SysTick->LOAD=(u32)nms*fac_ms;/加载(SysTick->LOAD为24bit)

SysTick->VAL =0x00;           //清空计数器

SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  

do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   

SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器

SysTick->VAL =0X00;       //清空计数器       

6.编译过了点击J-LINK下载即可,串口下载方法如下:


1).先在工程生成.hex文件,步骤入下图


 


打开项目设置


 


在output栏把生成hex文件勾上


 


再编译一次就可以找到hex文件在输出文件夹




2).用串口把开发板和电脑接好,这一点就不说了,记住txd-->rxd,rxd-->txd。




3).先了解一下stm32的自举模式,看stm32用户手册



正常的话我们是从主闪存器启动,现在我们需要从系统存储器启动,那这个怎么办到呢?我们需要手动拔跳线帽,在开发板上找找,肯定有的。


然后打开串口助手,导入hex文件,下载后重启就可以了。



关键字:嵌入式  STM32  库函数 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic468579.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32总结之开启外设时钟
下一篇:STM32配置外设寄存器,不论怎么写都写不进去或全是0

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

32位嵌入式系统的字节对齐
32位嵌入式系统的软件开发过程中,字节对齐问题是相当重要的。我们现在就拿ARM处理器和ADS1.2开发环境作为例子说明字节对齐的概念。在此之前,我先声明几个基本的概念:(1)、对象:在C语言中使用结构体类型、共同体类型、或内部基本类型所定义的变量或常量,就称为对象。对象占据了一块实际的存储器空间,这块空间有固定的起始地址和字节数。(2)、引用:使用对象有两种方法:“对象名”和“引用”。当你在源代码中定义一个对象时,编译器就会为它分配一块存储器,此时你就可以使用“对象名”来操作该对象。但是对于程序运行时动态分配的某一块存储器空间(对象),你就没法使用“对象名”了,而只能使用“引用”,所以,“引用”就是指向特定类型的对象的指针。好了
发表于 2019-10-21
嵌入式开发板QtE必备知识-qt4文件的移植和修改
 到迅为制作的触摸库文件“/usr/local/tslib”,迅为已经将触摸功能编译到 Qt/E4.7.1 的库文件中,开发板可以支持触摸和鼠标功能。用户在前面运行 helloworld的时候,会发现触摸和鼠标似乎无法使用,但是在 qt4 中却能使用触摸和鼠标。如何将 qt4 的触摸功能移植到应用程序 helloworld中。如下图,打开“etc/init.d/rcS”文件,将最后一行修改为“/bin/qt4_shell &”,这样在开机之后系统会运行 qt4.shell 程序。修改完成之后,保存退出。然后使用命令“
发表于 2019-10-19
嵌入式开发板QtE必备知识-qt4文件的移植和修改
4412嵌入式开发平台Android系统开发环境搭建以及编译
平台:iTOP-4412开发板本文介绍 uboot、Linux3.0.15 和 linux-3.5 内核、Android4.0.3 和Android4.2.2 编译环境的搭建以及编译。Uboot、Kernel 以及 Android 的编译环境看似复杂,用户只要抓住以下几个要点就可以了:第一:Uboot、Kernel 编译器。编译器在光盘中都有提供,在需要使用的步骤中,会说明编译器在光盘中的位置。第二:设置环境变量。Uboot、Kernel 编译器的环境变量设置后,编译的时候,系统才能找到编译器。第三:Android 
发表于 2019-10-19
4412嵌入式开发平台Android系统开发环境搭建以及编译
学习嵌入式开发ARM的方法
1、嵌入式是什么? 2、嵌入式需要哪些知识?    知道了这两点,好办!我就开始规划学习路线。计算机的基本理论不能丢,于是重点看组成原理,数据机构,操作系统、c++.同时论坛上了解到,实时操作系 统ucos是一个很好的嵌入式操作系统,对初学者很好。于是我就买了一本书,但是代码在电脑里调不通,网上也有很多相同的问题,我就看书,分析代码,一遍 不行就两遍,三遍,这样才看了入了门,才知道什么是进程。原来看操作系统书时,根本就不知道进程是个什么东西。在这段时间掌握的东西不多,但是,对我以后 的影响很大,我想起了大学时一个同学跟我说过了一句话:大学里最重要的不是学到了什么,最重要的是学会怎么学!大概是这个意思。   学习嵌入式在这里
发表于 2019-10-18
LabView嵌入式开发模块技术要点
无论使用什么设计语言,不良的编程技术都会给一个应用的性能带来负面影响,对一个嵌入式应用尤其如此。尽管对于绝大部分应用来说,高效率的编程技术是重要的,但对于嵌入式应用所工作的资源极度缺乏的环境,则要求对性能和存储器管理给予特别的关注。本文的讨论将围绕着新的LabView嵌入式开发模块进行,这种新工具为嵌入式应用开发人员提供了图形化系统设计手段。该工具允许用户直观地设计算法并进行交互式调试。下面是一些有助于编程师更有效使用LabView开发嵌入式应用的技巧。这些技巧中的许多也适用于其它高级工具。动态分配存储器技术动态存储器分配是一项编程师应尽可能避免的复杂操作。例如,如果动态分配出现在将数据存储到数组内的一个循环内,那么它尤其有害
发表于 2019-10-18
iTOP-6818嵌入式开发板win10下tf卡分区
作者使用的 TF 卡是 16GB 的。2.自行下载 DiskGenius3.打开程序删除原来的分区保存更改选是选中根目录,右键,快速分区在弹出的对话框中,作如下选择在右边目录多了一个磁盘目录,选中右键,调整分区大小在弹出的对话框中,对改动如下框中的内容分区前部的内容 64MB,确定在 ubuntu 下,重新拔插后,使用 df -l 查看,/dev/sdc1 15078984 24 15078960 1% /media/topeet/556D-67FE在编译过后的 uboot 源码目录下,使用如下命令,注意是&nbs
发表于 2019-10-17
iTOP-6818嵌入式开发板win10下tf卡分区
小广播
何立民专栏 单片机及嵌入式宝典

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

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