STM32开发入门教程.docx

上传人:b****7 文档编号:11070817 上传时间:2023-02-24 格式:DOCX 页数:68 大小:1.32MB
下载 相关 举报
STM32开发入门教程.docx_第1页
第1页 / 共68页
STM32开发入门教程.docx_第2页
第2页 / 共68页
STM32开发入门教程.docx_第3页
第3页 / 共68页
STM32开发入门教程.docx_第4页
第4页 / 共68页
STM32开发入门教程.docx_第5页
第5页 / 共68页
点击查看更多>>
下载资源
资源描述

STM32开发入门教程.docx

《STM32开发入门教程.docx》由会员分享,可在线阅读,更多相关《STM32开发入门教程.docx(68页珍藏版)》请在冰豆网上搜索。

STM32开发入门教程.docx

STM32开发入门教程

STM32开发入门教程

(一)开发环境建立及其应用

入门准备:

我们常用的STM32开发编译环境为Keil公司的MDK(MicrocontrollerDevelopmentKit)和IAR公司的EWARM.

在这里我们提供了比较稳定的新版本编译软件下载:

MDK4.10

限于篇幅,在我们的教程里面将先以MDK下的一个例子来介绍如何使用MDK进行嵌入式应用开发.

MDK安装与配置:

基于MDK下的开发中基本的过程:

(1)创建工程;

(2)配置工程;

(3)用C/C++或者汇编语言编写源文件;

(4)编译目标应用程序

(5)修改源程序中的错误

(6)测试链接应用程序

----------------------------------------------------------------

(1)创建一个工程:

在uVision3主界面中选择"Project"->"NewuVisionProject"菜单项,打开一个标准对话框选择好你电脑中的保存目录后,输入一个你的工程名字后点确认.我们的工程中建了一个名字叫"NewProject"的工程.

从设备库中选择目标芯片,我们的MINI-STM32开发板使用的是STM32F103V8T6,因此选中STMicrocontroller下对应的芯片:

ARM32-bitCortex-M3Microcontroller,72MHz,64kBFlash,20kBSRAM,

PLL,EmbeddedInternalRC8MHzand32kHz,Real-TimeClock,

NestedInterruptController,PowerSavingModes,JTAGandSWD,

3Synch.16-bitTimerswithInputCapture,OutputCompareandPWM,

16-bit6-chAdvancedTimer,216-bitWatchdogTimers,SysTickTimer,

2SPI,2I2C,3USART,USB2.0FullSpeedInterface,CAN2.0BActive,

212-bit16-chA/DConverter,FastI/OPorts

选择完芯片型号后会提示是否在目标工程中加入CPU的相关的启动代码,如下图所示.启动代码是用来初始化目标设备的配置,完成运行的系统初始化工作,因此我们选择"是",这会使系统的启动代码编写工作量大大减少.

----------------------------------------------------------------

(2)配置工程:

选择菜单中"Project"->"OptionforTarget"或者选择快捷菜单中的图标:

因为MINI-STM32开发板上使用的就是8M的晶振且是使用的片内的RAM和ROM因此"taget"下我们都可以使用默认的配置;

在"Output"菜单下我们需要选中"CreatHexFile"来生成编译好的工程代码,此工程可以通过仿真器或者串口ISP烧录进开发板中.

注:

ISP烧录过程我们将在入门教程二中给大家介绍.

"Listing""User"菜单中我们保持默认即可.

"C/C++"菜单为我们常用的菜单,这里简单的介绍下他们的具体功能:

PreProcesserSymbols中的Define,Undefine菜单表示是工程的宏定义中的变量,我们将在今后的教程中详细介绍这个功能.

Optimization为优化选项,Level0为不优化,这种模式最适合调试,因为不会优化掉代码,基本每个用到的变量都可以打断点.Level3为优化等级最高,最适合生产过程中下载到芯片中的代码.

IncludePath为工程中的包含路径,一般需将.h文件或者库文件的地址配置进去.

"Asm"和"Link"将在今后的高级教程中介绍.

"Debug"为我们调试使用的配置选项,"UseSimulator"为使用软件仿真.这里根据大家手里的仿真器来选择配置环境.

如果你使用的是Ulink,那么就选择"UlinkCotexDebug",如果你选择的是JLINK,那么就选择"CotexM3Jlink",如果你使用的是ST公司出的简易仿真器ST-Link,那么你就选择"ST-LinkDebug".

注意:

右边当中的选项"Runtomain{}"选项如果勾上就表示仿真时进入了就会进入到main函数,如果没有选上就会进入初始地址,你需要自己打断点运行到你的主程序main处.

当插上仿真器后选择上面右图中的Setting后会跳出一个仿真器的配置菜单.左边会自动识别出你的仿真器的信息.

如下图为ULINK2的信息:

对于SWJ选项为三线制调试,将在后面的高级教程中介绍.

右下方有两个选项:

"VerifyCodeDownload":

表示下载后校验数据

"Downloadtoflash":

表示当仿真的时候先将目标代码下载到Flash中.

Trace菜单为跟踪配置,可以实时的将一些变量使用曲线的形式实时表示出来,我们将在今后的高级教程中介绍这一项功能.

注意:

市面上目前的盗版Ulink2不支持这项功能,正版的支持,Jlink也不支持这项功能.

"FlashDownload"菜单用来配置使用仿真器程序下载的配置选项,大家务必选择好和你芯片配套的选项.如果你是使用的别人模板下修改为你的工程,这个选项请注意一下,如果不正确将不能将你的代码下载到芯片中.

 

配置好"Debug"后,那么"Utilities"可以不用配置.

如果你使用的是仿真器仿真,在你已经正确得将目标板和仿真器建立了物理连接后,请选择正确的仿真器进行配置.

 

(二)ISP在线下载程序

ISP:

insystemprogramming

简介:

ISP:

用写入器将code烧入,不过,芯片可以在目标板上,不用取出来,在设计目标板的时候就将接口设计在上面,所以叫"在系统编程",即不用脱离系统;

应用场合:

1,ISP程序升级需要到现场解决,不过好一点的是不必拆机器了;

ISP的实现一般需要很少的外部电路辅助实现,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序来编程内部存储器。

主要是指代芯片的烧写方式,以往写片子需要把片子拿下来,离开电路,用编程器烧,换句话说,芯片不能不脱离应用系统进行写入。

ISP主要针对这个问题,使用JTAG或者串行口(MCU内部有BootLoader,通过指定的方式激活之,它可以和PC或其它上位机通过串口联系,不用使单片机离开应用系统而更新内部的程序/设置)进行程序的烧写操作。

因此,具有ISP功能的MCU可以不使用编程器进行编程。

当然,实现ISP可能需要一些硬件电路支持,具体的在数据手册中有说明。

一般具备ISP功能后,就不要编程器了,而是使用下载线进行编程工作。

但是不是说他们就一定不支持编程器了,具体型号具体分析。

是否需要仿真器进行仿真和是否具备ISP和IAP没有必然的联系。

只不过具备了IAP功能,可以在MCU内写入监控程序,模拟一个仿真器,当然,这个监控程序是要消耗资源的,和使用硬件的仿真器还有一定的差异。

-------------------------------------------------------------------

以上就是ISP的一些概念上的描述,现在通俗点说就是怎么利用工具把程序下载到芯片当中去.

第一步:

配置工程,输出编译后的代码.Hex文件:

我们打开第一个我们的教程例子,GPIO_Test这个例子工程.

先按照下面的步骤来配置一下工程:

点击下图中的Option选项;

选中"Output"菜单下的"CreateHEXFile",并且在右边的"NameofExecutable"中填写我们生成编译代码的文件名称.

配置完选项后,点击工程编译按钮,然后我们就可以在\Example2-GPIO\GPIO_test\output目录下面得到Gpio_Test.Hex文件了.

第二步:

准备串口物理连接和设置Boot跳线选择芯片启动类型

先需要准备一根串口延长线,一头为公头,一头为母头的串口连接线(非交叉线),和一台有串口的电脑.(注意:

如果您的电脑没有串口,请购买"USB转RS232"的硬件设备来扩充你电脑的串口.)

将Mini-STM32的J1跳线帽跳至2,3两脚上选择芯片从内部的Boot区启动,上电后会先进入ISP状态.

连接串口线至你的电脑上的串口

将USB延长线连接至你的电脑上给Mini-STM32开发板供上5V电源.当开发板上的电源指示灯点亮后一切准备就绪.

 

第三步:

配置ISP下载软件mcuisp.exe:

您可以点击下载稳定版的mcuispV0.975版本的软件:

(576.58KB)

打开mcuisp.exe绿色软件,

选择好您连接至开发板使用的电脑上的串口,可以通过搜索串口菜单来自动搜索出你电脑上的串口信息.

在左上方的"程序文件"选择你准备烧入芯片中的代码,就是前面我们生成的Gpio_Test.Hex.

然后在菜单选项栏上选择"STMISP"菜单,点击"读STM32器件信息"命令按钮.

我们会在右边的信息框中显示出连接成功的信息:

如图所示:

选择上"校验"和"编程后运行"两个选项后点击"开始编程".

会报出程序成功烧入芯片的一些信息,如下:

------------------------------------------------------------------

DTR电平置高(+3-+12V),复位

RTS置高(+3-+12V),选择进入BootLoader

...延时100毫秒

DTR电平变低(-3--12V)释放复位

RTS维持高

开始连接...3,接收到:

1F

在串口COM4连接成功@115200bps,耗时343毫秒

芯片内BootLoader版本号:

2.1

芯片PID:

00000410

芯片FLASH容量为128KB

芯片SRAM容量为65535KB(此信息仅供参考,新版本芯片已不包含此信息)

96位的芯片唯一序列号:

33006C065839353235581943

读出的选项字节:

A55AFF00FF00FF00FF00FF00FF00FF00

全片擦除成功

第547毫秒,已准备好

共写入2KB,进度100%,耗时4343毫秒

成功从08000000开始运行

向您报告,命令执行完毕,一切正常

----------------------------------------------------------------

这个时候您可以看到您手中的Mini-STM32开发板上的两个红色LED有规律的轮流点亮,说明程序已经成功的烧入芯片了.

最后您在断电后将Mini-STM32上J1的跳线帽跳至1,2引脚上,重新上电后,程序就可以正常运行了.

 

(三)系统时钟SysTick

(一)背景介绍

在传统的嵌入式系统软件按中通常实现Delay(N)函数的方法为:

for(i=0;i<=x;i++);

x---对应于对应于N毫秒的循环值

对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值。

针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。

 

(二)STM32SysTick介绍

Cortex-M3的内核中包含一个SysTick时钟。

SysTick为一个24位递减计数器,SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。

计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能情况下)。

在STM32的应用中,使用Cortex-M3内核的SysTick作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数里对N减一,在Delay(N)函数中循环检测N是否为0,不为0则进行循环等待;若为0则关闭SysTick时钟,退出函数。

注:

全局变量TimingDelay,必须定义为volatile类型,延迟时间将不随系统时钟频率改变。

 

(三)STSysTick库文件

使用ST的函数库使用systick的方法

1、调用SysTick_CounterCmd()--失能SysTick计数器

2、调用SysTick_ITConfig()--失能SysTick中断

3、调用SysTick_CLKSourceConfig()--设置SysTick时钟源。

4、调用SysTick_SetReload()--设置SysTick重装载值。

5、调用SysTick_ITConfig()--使能SysTick中断

6、调用SysTick_CounterCmd()--开启SysTick计数器

 

(四)SystemTick工程实战

外部晶振为8MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为9MHz(最大为HCLK/8),在这个条件下,把SysTick效验值设置成9000,将SysTick时钟设置为9MHz,就能够产生1ms的时间基值,即SysTick产生1ms的中断。

/*Configurethesystemclocks*/

RCC_Configuration();

SysTick_Configuration();

 

第一步:

配置RCC寄存器和SysTick寄存器

RCC_Configuration:

配置RCC寄存器

voidRCC_Configuration(void)

{

/*RCCsystemreset(fordebugpurpose)*/

RCC_DeInit();

/*EnableHSE*/

RCC_HSEConfig(RCC_HSE_ON);

/*WaittillHSEisready*/

HSEStartUpStatus=RCC_WaitForHSEStartUp();

if(HSEStartUpStatus==SUCCESS)

{

/*HCLK=SYSCLK*/

RCC_HCLKConfig(RCC_SYSCLK_Div1);

/*PCLK2=HCLK*/

RCC_PCLK2Config(RCC_HCLK_Div1);

/*PCLK1=HCLK/2*/

RCC_PCLK1Config(RCC_HCLK_Div2);

/*Flash2waitstate*/

FLASH_SetLatency(FLASH_Latency_2);

/*EnablePrefetchBuffer*/

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/*PLLCLK=8MHz*9=72MHz*/

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

/*EnablePLL*/

RCC_PLLCmd(ENABLE);

/*WaittillPLLisready*/

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

{

}

/*SelectPLLassystemclocksource*/

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/*WaittillPLLisusedassystemclocksource*/

while(RCC_GetSYSCLKSource()!

=0x08)

{

}

}

/*EnableGPIOAandAFIOclocks*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|

RCC_APB2Periph_AFIO,ENABLE);

}

 

SysTick_Configuration:

配置SysTick

voidSysTick_Configuration(void)

{

/*SelectAHBclock(HCLK)asSysTickclocksource*/

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);

/*SetSysTickPriorityto3*/

NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick,3,0);

/*SysTickinterrupteach1mswithHCLKequalto72MHz*/

SysTick_SetReload(72000);

/*EnabletheSysTickInterrupt*/

SysTick_ITConfig(ENABLE);

}

 

第二步:

配置SysTick中断函数

这里我们定义了一个TestSig全局变量,用于我们使用Keil软件自带的逻辑分析仪来分析.

 

volatilevu32TimingDelay=0;

vu8TestSig=0;

voidSysTickHandler(void)

{

TimingDelay--;

if(TimingDelay%2)

{

TestSig=1;

}

else

{

TestSig=0;

}

}

 

第三步:

编写Delay延时函数

Delay:

系统延时函数,使用系统时钟操作.

voidDelay(u32nTime)

{

/*EnabletheSysTickCounter*/

SysTick_CounterCmd(SysTick_Counter_Enable);

TimingDelay=nTime;

while(TimingDelay!

=0);

/*DisabletheSysTickCounter*/

SysTick_CounterCmd(SysTick_Counter_Disable);

/*CleartheSysTickCounter*/

SysTick_CounterCmd(SysTick_Counter_Clear);

}

第四步:

主函数中调用Delay

在Mini-STM32开发板上有两个LED灯,分别是PA0,PA1.我们做个流水灯程序,让他们循环点亮.

while

(1)

{

GPIO_SetBits(GPIOA,GPIO_Pin_0);

Delay(100);

GPIO_ResetBits(GPIOA,GPIO_Pin_0);

Delay(100);

GPIO_SetBits(GPIOA,GPIO_Pin_1);

Delay(100);

GPIO_ResetBits(GPIOA,GPIO_Pin_1);

Delay(100);

}

 

(五)仿真调试

把工程便宜通过后,进入软件仿真

如下图所示:

点击工程快捷菜单的逻辑分析仪

在逻辑分析仪中我们点击Setup按键会弹出安装对话框.

点右上方的"新建"图标,在菜单中输入"TestSig"这个全局变量.

添加完之后就可以点Close了.如果您仿真完可以点击左下方的"KillAll"删除所有监视变量.

 

全速运行后就可以看到下面的波形了哦

 

如果你使用仿真器在Mini-STM32上调试的话你还可以看到两个LED在跑跑马灯程序了.

到此我们这章节的教程就结束了,相信大家也掌握了SystemTick的用法了.

 

(四)GPIO简单应用和外部中断

这个章节我们将学习最基本的STM32的GPIO的应用.我们将分为两个章节来学习.

第一部份:

GPIO的基本应用和IO口的配置

第二部份:

外部中断的使用

--------------------------------------------------------------------------

1:

设计要求:

开发板上有2个LED,我们的目的为有规律的点亮LED1和LED2.当按键按下去的时候所有的灯灭,等待2秒钟后恢复有规律的点亮.

2:

硬件电路:

3:

软件程序设计:

(1)根据要求配置GPIOA中的PA0,PA1为输出,PA3,PA8为输入

对于下面程序中的GPIO_InitStructure.GPIO_Speed和GPIO_InitStructure.GPIO_Mode推荐大家看下面两篇文章.

备注:

当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:

2MHz、10MHz和50MHz,这个速度是指I/O口驱动电路的速度,是用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。

 

备注:

共有8种模式,可以通过编程选择:

1.浮空输入

2.带上拉输入

3.带下拉输入

4.模拟输入

5.开漏输出——(此模式可实现hotpower说的真双向IO)

6.推挽输出

7.复用功能的推挽输出

8.复用功能的开漏输出

模式7和模式8需根据具体的复用功能决定。

 

voidGPIO_Configuration(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

/*ConfigurePA.asOutputpush-pull*/

GPIO_InitStructure.GPIO_Pin

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1