嵌入式系统(STM32微控制器)实训指导书
意法半导体公司的STM32微控制器具有32位字长的CPU,使用精简指令系统(RISC)。精简指令系统的指令字长固定,译码方便,相对于复杂指令系统(CISC),精简指令系统的处理效率更高。具有32位字长CPU的STM32系列微控制器的处理能力远高于8位和16位单片机,同时集成了与32位CPU相适应的强大外设(如双通道ADC、多功能定时器、7通道DMA、SPI等),能够完成过去一般单片机所无法达到控制功能。现在,已经形成了以8位单片机为主流的低端产品和以32位微控制器为主流的高端产品两大市场。对于自动化领域的从业人员,了解32位微控制器的结构、特点,掌握其使用方法,是很有必要的。
一、关于学习方法
此前,我们已经学习过《C语言程序设计》、《微机原理》、《单片机原理及应用》等相关课程。这些课程的学习是系统的、完整的、全面的,是有老师讲授的。这种学习方法,适合在学校学习一些重要的基础理论课程。在工作中,我们常常会遇到新的东西,需要以已有的知识作为基础,去解决问题、完成任务。这就需要不同于前述的另一种学习方法。这种方法是建立在自学基础上的,以解决实际问题为目的,允许通过局部的、模仿性的手段,来实现
既定目标。这种方法在工程实践中的应用是非常普遍的。“白猫黑猫,能抓住老鼠就是好猫”。能解决问题的方法就是好方法。
本次实训采取的方法是:将参考资料发给同学,同学自学其中需要的部分。在指导教师引导下,体验各个控制项目、理解各组成部分,再以原控制软件为基础进行修改和移植,获得要达到的控制效果。
在本次实训中,我们使用的微控制器型号为STM32F103RB。STM32F103RB是STM32微控制器系列中的一种,内部具有128KB程序存储器、20KB随机读写存储器、1个16位高级定时器、3个16位通用定时器、2个SPI、2个I2C、3个USART、1个USB、1个CAN、2个ADC。芯片为64引脚LQFP封装,有51个I/O引脚。
开发环境使用Keil uVision4 MDK。它是我们学习51内核单片机时使用的Keil uVision2和Keil uVision3提高版本,具有相同或相似的界面及使用方法。
STM32微控制器的结构与MCS—51单片机是相似的,也是用读写寄存器来使用内部的个部件。但是,STM32的规模庞大,远非51内核单片机可比。完成一个复杂的功能,可能需要
操作多个寄存器的多个位,掌握其使用方法确有一定难度。为了解决这个问题,意法半导体公司提供了固件库。有了固件库,我们就可以调用函数来实现所需要的功能,这比通过操作寄存器实现就容易多了。
二、关于实训环境
实训是在一套基于STM32微控制器的实验装置上进行的。装置采用积木式结构,由J-LINK(V8)仿真器、主板、最小系统板、12864液晶显示屏、3.2”TFT彩液晶触摸屏、显示及键盘板、10M网络接口板、USB/RS—232转接线等组成。下面对将要使用的硬件、软件作简要说明。
1 微控制器:在本次实训中,我们使用的微控制器型号为STM32F103RB。它是STM32微控制器系列中的一种,内部具有128KB程序存储器、20KB随机读写存储器、1个16位高级定时器、3个16位通用定时器、2个SPI、2个I2C、3个USART、1个USB、1个CAN、2个ADC。芯片为64引脚LQFP封装,有51个I/O引脚。
2 开发环境:使用Keil uVision4 MDK。它是我们学习51内核单片机时使用的Keil uVision2和Keil uVision3提高版本,具有相同或相似的界面及使用方法。
3 J-LINK仿真器:仿真器连接计算机的一个USB口和STM32微控制器的几个专用位,使得计算机可以对微控制器进行下载、调试。
4 固件库:STM32微控制器的结构与MCS—51单片机是相识的,也是提高读写寄存器来使用内部的个部件。但是,STM32的规模庞大,远非51内核单片机可比。完成一个复杂的功能,可能需要操作多个寄存器的数个位,掌握其使用方法确有一定难度。为了解决这个问题,意法半导体公司提供了固件库。有了固件库,我们就可以调用函数来实现所需要的功能,这比通过操作寄存器实现就容易多了。
三、软件及文档说明
发给大家的电子文档中,汇集了多种资料和软件,下面把最常用的一些作分类介绍。
1 入门资料:STM8 32选型手册.pdf、STM32F10x常见应用解析(2008年9月).pdf、STM32的优越外设介绍 (2007年12月).pdf、STM32应用中的常见问题.pdf、STM32硬件设计问题解答.pdf。以上文档在“stm32资料\常用资料”文件夹下。
2 硬件资料:STM32中文参考手册_V10.pdf。在“stm32资料\常用资料”文件夹下。
3 固件库资料:STM32固件库使用手册的中文翻译版.pdf、STM32固件库v3.5变更指南.doc。中文手册只到2.0版本为止,现在通用的是3.5版本的固件库,所以参考变更指南。以上文档在“stm32资料\常用资料”文件夹下。
4 STM32F103RB芯片资料:STM32F103x8B_DS_CH_V10.pdf。在“STM32芯片数据手册\STM32中文数据手册”
5 实训装置资料:STM32实验系统.pdf。
6配置STM32微控制器的系统时钟以及使用嘀嗒时钟(定时器)的资料:在“stm32资料\stm32_时钟及systick”文件夹下。
7 介绍STM32微控制器的位带操作的资料:在“stm32资料\STM32_位带”文件夹。
8 介绍STM32微控制器的中断系统的资料:在“stm32资料\stm32_中断”文件夹下。
9 介绍STM32微控制器的中断系统的资料:在“stm32资料\STM32定时器”文件夹。
10 STM32的V3.5.0固件库环境及模板及例程:“STM32F10x_StdPeriph_Lib_V3.5.0”文件
夹。
四、实训项目及日程
第一天:
任务:1)学习STM32微控制器资料,熟悉Keil MDK软件和J-LINK仿真器的安装与使用。学习LED灯控制软件结构,弄懂其SysTick延时的原理和使用方法,弄懂GPIO的输出控制方法。2)修改SysTick延时时间和输出控制方案,得到新的LED发光组合。
范例工程:STM32F10x_StdPeriph_Lib_V3.5.0\物电学院ARM实验室\STM32F103Rx_实验01 跑马灯。
导学:“STM32F10x_StdPeriph_Lib_V3.5.0”文件夹集合了STM32的固件库V3.5.0版。“物电学院ARM实验室”和“物电学院uCOS实验室”两个文件夹中有多个应用工程范例。其中“物电学院ARM实验室\STM32F10x_模板”,已进行了必要的部件初始化(主要是时钟部分和对串口printf函数的支持),加入应用程序后即可工作。时钟部分的初始化设置为使用外部高速时钟(8MHz)经分频获得工作主频(72MHz),供定时器2~7和窗口看门狗以及备份接口使用的时钟频率为36MHz,供定时器1、8和ADC以及GPIO汇编语言指导书A~GPIOE等使用的时钟频率为72 MHz。“STM32F103Rx_实验01 跑马灯”中因为不需要使用串口,拿掉了“usart.c”这个支持串口的文件。“delay.c”是用来使用嘀嗒时钟实现延时的。在51内核单片机中,短暂延时常用软件循环实现。这种做法在汇编语言中很简单,在C程序中就比较困难,因为不知道编译后会生成什么机器码、耗用多少时间。在STM32中这个问题就更突出。好在STM32中有一个嘀嗒时钟,它原本是用于嵌入式系统软件中提供基本时钟的,在不使用嵌入式系统软件时可以用来作短暂延时用。注意:这种延时方法同软件延时一样是占用CPU的,一般仅适用于短暂延时或任务很轻CPU富余量很大的场合。“led.c”是用于对驱动LED的端口进行初始化的。STM32集成了太多的外设,对于一个控制项目,可能很多外设是用不上的。为了尽量降低功耗,所有外设的时钟在复位后都是关闭的,这样外设就
不工作也不耗电。如果要使用某个外设,首先要打开它的时钟,以及进行一些相关的初始化。对端口写“0”或“1”,有4种方法可使用。第一种方法是使用库函数GPIO_WriteBit既可写“0”也可写“1”,但速度最慢;第二种方法是使用库函数GPIO_ResetBits和GPIO_SetBits可分别写“0”或“1”,速度比较快;第三种方法是直接操作寄存器完成写“0”或“1”,本质上与第二种方法是相同的,但更直接,因而也更快一点;第四种方法是使用位带操作,速度是最快的。以上操作速度的差别,在非连续操作时是很小的,可以忽略不计。delay.h和led.h分别是delay.c和led.c的头文件。Keil uVision4 MDK界面中,用来将编译后生成的目标代码文件*.hex下载到STM32微控制器的FLASH中,可打开工程管理器。这两个操作是原来的Keil uVision2和Keil uVision3中没有的。
第二天:
任务:1)学习按键输入(扫描方式)软件结构,理解以扫描方式管理按键的工作原理和特点。2)对按键的输入响应进行修改,获得与原软件不同的LED响应效果。
范例工程:STM32F10x_StdPeriph_Lib_V3.5.0\物电学院ARM实验室\STM32F103Rx_实验02 按键输入(扫描方式)。
导学:这个工程中新加入了key.c文件。在key.c中有2个函数。KEY_Init ()是对按键所在端口进行输入初始化的,KEY_Scan ()是对按键进行扫描的。在KEY_Scan ()中为了举例,轮流使用2种方法对按键所在端口进行判断,分别是库函数法和位带法,实际使用任何一种均可。KEY_Scan ()的核心任务有:①有键按下时能识别并返回该键编码(0~3),无键按下返回0xff(即255);②能够排除键按下和松开时的抖动,不致发生误判;③允许键较长时间按下,不致误判为多次按键。为此,采取的措施有:①发现有键按下后间隔20mS再判一次,若仍为按下才确认此状态;②只有在当前键状态为键松开时,又有键按下才返回键按下编码并进入键按下状态;③确认4个键均松开后进入键松开状态。使用KEY_Scan ()进行键扫描,最长可耗时数十毫秒。key.h是key.c的头文件。
第三天:
任务:1)学习按键输入(外部中断方式)软件结构,与比扫描方式管理按键进行比对,理解以外部中断方式识别按键状态改变的优势。2)对按键的输入响应进行修改,获得与原软件不同的LED响应效果。
范例工程:STM32F10x_StdPeriph_Lib_V3.5.0\物电学院ARM实验室\STM32F103Rx_实
验03 按键输入(外部中断方式)。
导学:使用键扫描的方法对键状态进行识别,就需要不断调用KEY_Scan (),这会对当前的工作造成较大影响。如果我们希望在按键没有按下时,不会干扰当前的工作,而一旦有键按下又能够马上响应,这就要用到中断。文件exti.c中,函数EXTI_InitInit ()对I/O端口的中断进行初始化,设置4个按键端口为上升沿和下降沿均产生中断。KEY1_Down~KEY4_Down和KEY1_Up~KEY4_Up是标志4个上升沿和下降沿的全局变量。在4个中断服务函数中,调用LevelDistinguish ()函数判断当前中断是上升沿还是下降沿,设置对应的变量。在主函数main中判别变量,驱动LED。事实上,对LED的处理也可以放在中断服务函数中处理,这样就可以做到对主函数中的正常工作的极小干扰。在主函数中调用了库函数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2),设置使用4级抢占优先级和4级响应优先级。这两种优先级的区别是:抢占优先级是可以嵌套的,即低抢占优先级的中断服务可以被高抢占优先级的中断请求打断;响应优先级是不能嵌套的,高响应优先级的中断请求不能打断低响应优先级的中断服务,但不同响应优先级的中断源同时发出中断请求时,CPU会先响应高响应优先级中断请求。在文件exti.c中,NVIC_Init(&NVIC_InitStructure) 库函数设置抢占优先级和响应优先级均为0级。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论