【嵌入式】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  库函数 引用地址:【嵌入式】STM32的库函数使用

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

推荐阅读最新更新时间:2024-11-04 05:04

MAXQ环境下EEPROM的保护措施
介绍 在嵌入式微控制器应用中,通常都要用到非易失性存储器。无论是掉电时维持需要保存的设置,还是存储公司的重要记录,可靠的非易失性存储器都是现代微控制器领域的一个基本单元。 非易失性存储常常采用外部串行存储器实现。多年以来,该领域用到了数十亿颗类似存储器件,它们的可靠性得到了的广泛认可。目前,存储器可以做到几百字节到1兆字节甚至更大的容量,在每一个需要保持设置的设备中,都能找到这样一个紧凑、廉价的器件。 包括EEPROM、闪存和旋转式存储器在内,所有类型的非易失性存储器都面临一个共同的问题:写周期被中断时,数据会丢失。一旦在写周期执行过程中掉电,那么即使再恢复电源,也很难修复损坏的数据。 本文提出了一种基于事务的提交-回退机制,
[应用]
聊一下汽车嵌入式开发中的ECU网关节点
汽车嵌入式开发中,开发ECU网关节点(GW:Gateway)时,难度会提升不少,这些难度中就包含对时间参数的解读问题。本文着重给大家聊一下P2Client、▲P2 = ▲P2Request + ▲P2Response、N_As时间参数。 1 背景介绍 假设 :Tester发送功能寻址指令Request01给GW::VCU,因为VCU的GW属性,VCU需要将Request01转发,即由Flexray总线路由到Can总线,进而将Request01发送给Ecu::Xx,Request01路由示意如如下所示: 注意 :诊断路由,需要通过Xx_Tp层。 VCU既然是GW,相对于ECU::Xx,就是一个Tester。 2 P2Client
[嵌入式]
聊一下汽车<font color='red'>嵌入式</font>开发中的ECU网关节点
嵌入式智能网关硬件无线收发电路图设计
  一个基于IEEE802.15.4的CC2430无线收发模块,主要用来完成网络节点之间、节点与网关节点之间的无线通信。核心部分是一个CC2420射频收发器,它完全支持ZigBee组网协议,具备传输速率高、传输距离远和低功耗等优点。   主要特征如下:   工作频带范围是2.4~2.4835GHz; 采用IEEE802.15.4规范要求的DSSS(直接序列扩频方式);   数据速率达250kbps,碎片速率达2Mchip/s,接收灵敏度高(-94dBm),邻道抗干扰能力强(39dB),超低电流消耗;   低电压供电(2.1~3.6V),内部集成VCO、LNA、PA及电源稳压器。 CC2420通过简单的四线(SI、SO、SCLK、C
[电源管理]
<font color='red'>嵌入式</font>智能网关硬件无线收发电路图设计
STM32的时钟的修改方法(HSE使用16M无源晶振时)
ST公司提供的时钟芯片是8MHZ,但是由于国内技术的局限性和国外技术的垄断,8M的芯片约2元/片,16M大约就是几毛钱,所以考虑成本,设计中往往需要使用16MHZ的电平,但是ST公司提供的是库函数的默认的系统时钟是8M,所以相关的PLL的倍频因子也是设置的是9( RCC- CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);),若使用16M的晶振,则需要进行相关代码的修改; 第一步,全局搜索HSE_VALUE #define HSE_VALUE ((uint32_t)8000000) 修改为: #define HSE_VALUE ((uint32_t)1
[单片机]
STM32 Systick定时器在实现1us延时的问题与解决
问题: 使用systick_config()函数来实现计数,这个函数在下面代码中的 SysTick_CTRL_TICKINT_Msk 开启了中断。不论系统时钟为72Mhz或36Mhz若设置STM32每10us进入一次中断,计时是可以的;而每1us进入中断,由于中断指令较多,那么程序就会困在中断里出不来。 static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
[单片机]
毕业设计| STM32+UART HMI,玩扫雷游戏
每年毕设,STM32出现的频率最高,很多都是“老实本分”的设计,但也有不走寻常路,比如今天分享的这个毕设——扫雷游戏。不知道这位同学在毕业答辩时,有没有被老师为难,当着这么多评委老师,来几盘扫雷,是不是很刺激。 系统的硬件: 指南者开发板和4.2英寸的UATRT HMI串口屏组成,其实可以用最小的核心板,单片机外设也就用到了串口而已,但是要求使用开发板,只好有点浪费了。 软件部分: 软件部分是这个项目的核心。 刚开始参考了网上一些扫雷代码。在单片机上很多地方不一样,但大体思路还是一样的,主要解决的就是与串口屏之间的通信协议,贴一段简单的通信代码。 具体完成功能: 1.扫雷基本功能 2.当周围的雷都标记完时,打开剩余
[单片机]
STM32之DMA
DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。 STM32中 DMA1有7个通道,DMA2有5个通道(DMA2 仅存在大容量产品中)。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。 STM32F103RBT6 只有1 个DMA控制器,DMA1 ,下面我们就针对DMA1 进行介绍。 从外设(TIMx、ADC、SPIx 、I2Cx 和USARTx )产生的DMA请求,通过逻辑或输入到
[单片机]
<font color='red'>STM32</font>之DMA
STM32系统时钟配置
STM32的SYSCLK(系统时钟)可由三种不同的时钟源来驱动,分别是HSI振荡器时钟、HSE振荡器时钟、PLL时钟。这些设备还拥有2种二级时钟源: 1、低速内部RC(LSI RC)振荡器,频率在30~60KHZ之间变化,为了方便计算我们一般估算为40KHZ,它主要为独立看门狗提供时钟源,或通过相关寄存器配置驱动RTC(RTCCLK),用于从停机/待机模式下自动唤醒系统。 2、使用32.768KHZ的低速外部晶体时钟来驱动RTC(RTCCLK)。 为减小功耗,STM32的任一时钟源都可以独立地开启或关闭。 注意:1、当HSI(高速内部时钟)作为PLL时钟输入时,SYSCLK得到的最大频率为36MHZ(有些写的是64MHZ)。SD
[单片机]
<font color='red'>STM32</font>系统时钟配置
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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