【嵌入式】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.0\Libraries\CMSIS\CM3\CoreSupport下有两个文件core_cm3.c和core_cm3.h放进CORE文件夹中,是CM3的内核支持文件,其他使用 CM3 内核的芯片也可以用,不一定是 stm32。这两个文件用来获取设置 CM3 内核,配置一些内核寄存器;

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

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

4.STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下有几个源码文件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.0\Project\STM32F10x_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文件

【嵌入式】STM32的库函数使用_第1张图片【嵌入式】STM32的库函数使用_第2张图片

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文件,步骤入下图

【嵌入式】STM32的库函数使用_第3张图片

打开项目设置

【嵌入式】STM32的库函数使用_第4张图片

在output栏把生成hex文件勾上

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


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


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

【嵌入式】STM32的库函数使用_第5张图片

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

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


你可能感兴趣的:(嵌入式)