STM32 开发入门教程解析.docx
- 文档编号:28571334
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:68
- 大小:1.32MB
STM32 开发入门教程解析.docx
《STM32 开发入门教程解析.docx》由会员分享,可在线阅读,更多相关《STM32 开发入门教程解析.docx(68页珍藏版)》请在冰豆网上搜索。
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版本的软件:
mcuisp.rar(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推荐大家看下面两篇文章.
STM32GPIO的十大优越功能综述
备注:
当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:
2MHz、10MHz和50MHz,这个速度是指I/O口驱动电路的速度,是用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
STM32GPIO端口的输出速度设置
备注:
共有8种模式,可以通过编程选择:
1.浮空输入
2.带上拉输入
3.带下拉输入
4.模拟输入
5.开漏输出——(此模式可实现hotpower说的真双向IO)
6.推挽输出
7.复用功能的推挽输出
8.复用功能的开漏输出
模式7和模式8需根据具体的复用功能决定。
voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
/*Con
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 开发入门教程解析 开发 入门教程 解析