《嵌入式系统(STM32微处理器)实训指导书(6页).doc》由会员分享,可在线阅读,更多相关《嵌入式系统(STM32微处理器)实训指导书(6页).doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-嵌入式系统(STM32微处理器)实训指导书-第 6 页嵌入式系统(STM32微控制器)实训指导书意法半导体公司的STM32微控制器具有32位字长的CPU,使用精简指令系统(RISC)。精简指令系统的指令字长固定,译码方便,相对于复杂指令系统(CISC),精简指令系统的处理效率更高。具有32位字长CPU的STM32系列微控制器的处理能力远高于8位和16位单片机,同时集成了与32位CPU相适应的强大外设(如双通道ADC、多功能定时器、7通道DMA、SPI等),能够完成过去一般单片机所无法达到控制功能。现在,已经形成了以8位单片机为主流的低端产品和以32位微控制器为主流的高端产品两大市场。对于自动
2、化领域的从业人员,了解32位微控制器的结构、特点,掌握其使用方法,是很有必要的。一、 关于学习方法此前,我们已经学习过C语言程序设计、微机原理、单片机原理及应用等相关课程。这些课程的学习是系统的、完整的、全面的,是有老师讲授的。这种学习方法,适合在学校学习一些重要的基础理论课程。在工作中,我们常常会遇到新的东西,需要以已有的知识作为基础,去解决问题、完成任务。这就需要不同于前述的另一种学习方法。这种方法是建立在自学基础上的,以解决实际问题为目的,允许通过局部的、模仿性的手段,来实现既定目标。这种方法在工程实践中的应用是非常普遍的。“白猫黑猫,能抓住老鼠就是好猫”。能解决问题的方法就是好方法。本
3、次实训采取的方法是:将参考资料发给同学,同学自学其中需要的部分。在指导教师引导下,体验各个控制项目、理解各组成部分,再以原控制软件为基础进行修改和移植,获得要达到的控制效果。在本次实训中,我们使用的微控制器型号为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内核单片机时使用的Ke
4、il uVision2和Keil uVision3提高版本,具有相同或相似的界面及使用方法。STM32微控制器的结构与MCS51单片机是相似的,也是用读写寄存器来使用内部的个部件。但是,STM32的规模庞大,远非51内核单片机可比。完成一个复杂的功能,可能需要操作多个寄存器的多个位,掌握其使用方法确有一定难度。为了解决这个问题,意法半导体公司提供了固件库。有了固件库,我们就可以调用函数来实现所需要的功能,这比通过操作寄存器实现就容易多了。二、 关于实训环境实训是在一套基于STM32微控制器的实验装置上进行的。装置采用积木式结构,由J-LINK(V8)仿真器、主板、最小系统板、12864液晶显示
5、屏、3.2”TFT彩色液晶触摸屏、显示及键盘板、10M网络接口板、USB/RS232转接线等组成。下面对将要使用的硬件、软件作简要说明。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 uV
6、ision3提高版本,具有相同或相似的界面及使用方法。3 J-LINK仿真器:仿真器连接计算机的一个USB口和STM32微控制器的几个专用位,使得计算机可以对微控制器进行下载、调试。4 固件库:STM32微控制器的结构与MCS51单片机是相识的,也是提高读写寄存器来使用内部的个部件。但是,STM32的规模庞大,远非51内核单片机可比。完成一个复杂的功能,可能需要操作多个寄存器的数个位,掌握其使用方法确有一定难度。为了解决这个问题,意法半导体公司提供了固件库。有了固件库,我们就可以调用函数来实现所需要的功能,这比通过操作寄存器实现就容易多了。三、 软件及文档说明发给大家的电子文档中,汇集了多种资
7、料和软件,下面把最常用的一些作分类介绍。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版本的固件库,所以参考变更指南。以上文档
8、在“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资料STM
9、32定时器”文件夹。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_St
10、dPeriph_Lib_V3.5.0”文件夹集合了STM32的固件库V3.5.0版。“物电学院ARM实验室”和“物电学院uCOS实验室”两个文件夹中有多个应用工程范例。其中“物电学院ARM实验室STM32F10x_模板”,已进行了必要的部件初始化(主要是时钟部分和对串口printf函数的支持),加入应用程序后即可工作。时钟部分的初始化设置为使用外部高速时钟(8MHz)经分频获得工作主频(72MHz),供定时器27和窗口看门狗以及备份接口使用的时钟频率为36MHz,供定时器1、8和ADC以及GPIOAGPIOE等使用的时钟频率为72 MHz。“STM32F103Rx_实验01 跑马灯”中因为不需
11、要使用串口,拿掉了“usart.c”这个支持串口的文件。“delay.c”是用来使用嘀嗒时钟实现延时的。在51内核单片机中,短暂延时常用软件循环实现。这种做法在汇编语言中很简单,在C程序中就比较困难,因为不知道编译后会生成什么机器码、耗用多少时间。在STM32中这个问题就更突出。好在STM32中有一个嘀嗒时钟,它原本是用于嵌入式系统软件中提供基本时钟的,在不使用嵌入式系统软件时可以用来作短暂延时用。注意:这种延时方法同软件延时一样是占用CPU的,一般仅适用于短暂延时或任务很轻CPU富余量很大的场合。“led.c”是用于对驱动LED的端口进行初始化的。STM32集成了太多的外设,对于一个控制项目
12、,可能很多外设是用不上的。为了尽量降低功耗,所有外设的时钟在复位后都是关闭的,这样外设就不工作也不耗电。如果要使用某个外设,首先要打开它的时钟,以及进行一些相关的初始化。对端口写“0”或“1”,有4种方法可使用。第一种方法是使用库函数GPIO_WriteBit既可写“0”也可写“1”,但速度最慢;第二种方法是使用库函数GPIO_ResetBits和GPIO_SetBits可分别写“0”或“1”,速度比较快;第三种方法是直接操作寄存器完成写“0”或“1”,本质上与第二种方法是相同的,但更直接,因而也更快一点;第四种方法是使用位带操作,速度是最快的。以上操作速度的差别,在非连续操作时是很小的,可以
13、忽略不计。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 按键输入(扫描方式)
14、。导学:这个工程中新加入了key.c文件。在key.c中有2个函数。KEY_Init ()是对按键所在端口进行输入初始化的,KEY_Scan ()是对按键进行扫描的。在KEY_Scan ()中为了举例,轮流使用2种方法对按键所在端口进行判断,分别是库函数法和位带法,实际使用任何一种均可。KEY_Scan ()的核心任务有:有键按下时能识别并返回该键编码(03),无键按下返回0xff(即255);能够排除键按下和松开时的抖动,不致发生误判;允许键较长时间按下,不致误判为多次按键。为此,采取的措施有:发现有键按下后间隔20mS再判一次,若仍为按下才确认此状态;只有在当前键状态为键松开时,又有键按下
15、才返回键按下编码并进入键按下状态;确认4个键均松开后进入键松开状态。使用KEY_Scan ()进行键扫描,最长可耗时数十毫秒。key.h是key.c的头文件。第三天:任务:1)学习按键输入(外部中断方式)软件结构,与比扫描方式管理按键进行比对,理解以外部中断方式识别按键状态改变的优势。2)对按键的输入响应进行修改,获得与原软件不同的LED响应效果。范例工程:STM32F10x_StdPeriph_Lib_V3.5.0物电学院ARM实验室STM32F103Rx_实验03 按键输入(外部中断方式)。导学:使用键扫描的方法对键状态进行识别,就需要不断调用KEY_Scan (),这会对当前的工作造成较
16、大影响。如果我们希望在按键没有按下时,不会干扰当前的工作,而一旦有键按下又能够马上响应,这就要用到中断。文件exti.c中,函数EXTI_InitInit ()对I/O端口的中断进行初始化,设置4个按键端口为上升沿和下降沿均产生中断。KEY1_DownKEY4_Down和KEY1_UpKEY4_Up是标志4个上升沿和下降沿的全局变量。在4个中断服务函数中,调用LevelDistinguish ()函数判断当前中断是上升沿还是下降沿,设置对应的变量。在主函数main中判别变量,驱动LED。事实上,对LED的处理也可以放在中断服务函数中处理,这样就可以做到对主函数中的正常工作的极小干扰。在主函数中
17、调用了库函数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2),设置使用4级抢占优先级和4级响应优先级。这两种优先级的区别是:抢占优先级是可以嵌套的,即低抢占优先级的中断服务可以被高抢占优先级的中断请求打断;响应优先级是不能嵌套的,高响应优先级的中断请求不能打断低响应优先级的中断服务,但不同响应优先级的中断源同时发出中断请求时,CPU会先响应高响应优先级中断请求。在文件exti.c中,NVIC_Init(&NVIC_InitStructure) 库函数设置抢占优先级和响应优先级均为0级。第四天:任务:1)学习串口+中断软件结构,理解以字符串打印方式发送
18、、中断方式发送、中断方式接受的特点及使用方法。在软件中添加LED驱动和按键扫描文件。2)修改程序以实现:按KEY1键用字符串打印方式发送一个“KEY1”;按KEY2键用中断方式发送“KEY2”;接收到“KEY1ON”和“KEY1OFF”使LED1发光和熄灭;接收到“KEY2ON”和“KEY2OFF”使LED1发光和熄灭。范例工程:STM32F10x_StdPeriph_Lib_V3.5.0物电学院ARM实验室STM32F103Rx_实验05 串口+中断。导学:此工程由模板增补而成,在文件usart_int.c中的USART1_Init ()中使能了串口中断。USART1_IRQHandler
19、()是串口中断服务函数。文件usart_int.c中定义了TxBuffer1255和RxBuffer1255分别为串口发送缓冲区和串口接收缓冲区,定义了TxCounter1和RxCounter1为串口发送计数器和串口接收计数器。在usart_int.h中,将上述变量声明为外部变量。在主程序中,通过串口发送信息有两种方法:调用printf函数;将待发送的ASC码按顺序逐一放入TxBuffer1中,再向TxCounter1存入待发送的字符数。第一种方法,其间CPU一直由printf函数占用,直到发送完毕才退出,但使用方便,功能强。第二种方法,在完成对TxBuffer1和TxCounter1的赋值后
20、,对串口的发送操作是在中断服务函数中完成的,对CPU的占用极少。串口接收是由其他设备的串口发送引起的,接收到的信息放在RxBuffer1中,字符数放在RxCounter1中,当判断RxCounter10且100mS未发生变化,即认为一次接收完成。串口通信的参数为:波特率9600、数据位8位、停止位1位、无奇偶校验。通信的另一方应按此设置。第五天:任务:1)学习定时器2定时中断软件结构,理解定时器2定时中断的使用方法。2)修改程序,使定时器2每5秒中断一次,在中断处理中对自动次数进行记录并通过串口发送中断次数。范例工程:STM32F10x_StdPeriph_Lib_V3.5.0物电学院ARM实
21、验室STM32F103Rx_实验11 定时器2定时中断。导学:使用定时器定时中断,可以不干扰主程序的工作,在定时时间到来时进入定时中断服务程序。文件timer.c中的定时器初始化函数TIM2_Init (u16 arr, u16 psc)中的arr是定时器的自动重装值,psc是时钟预分频数(0是不分频,1是2分频,以此类推)。主函数中的TIM2_Init(5000, 7199),即为时钟预分频数7200,自动重装值5000,由于时钟是72MHz,每0.5S发生一次中断。改变arr和psc可以得到不同的中断周期。文件timer.c中的TIM2_IRQHandler ()是定时器2的中断服务函数,
22、可在其中进行你需要的操作,但必须保证在下一次中断到来之前退出。第六天:任务:1)学习定时器3PWM输出软件结构,理解用定时器3产生PWM的方法,达到改变PWM的频率和占空比的目的。2)修改程序,在软件中添加按键中断文件,用KEY1和KEY2控制LED1的亮度,即每按KEY1和KEY2一次分别使输出到LED1的PWM占空比增加和减少20。范例工程:STM32F10x_StdPeriph_Lib_V3.5.0物电学院ARM实验室STM32F103Rx_实验12 定时器3PWM输出。导学:文件timer_pwm.c中的TIM3PWM_Init (u16 arr, u16 psc)函数设定TIM3工作
23、在PWM状态。Arr和psc的作用与上一范例相同。定时器TIM3工作在向下计数方式,重装值为900。使用库函数TIM_SetCompare1(TIM3, ii)TIM_SetCompare4(TIM3, ii)可设定PWM比较值,这个值应在0900之间。定时器TIM3的计数器值PWM比较值时对应引脚输出低电平,否则输出高电平。这样,当PWM比较值大时引脚输出的低电平占比也比较大,LED亮度也就比较高。如果将TIM3的计数方式修改为向下计数,结果则相反。改变arr可以改变pwm的精度,改变psc可以改变pwm的频率。第七天:任务:1)学习DS18B20测温软件结构,理解数字温度传感器DS18B2
24、0与STM32微控制器的硬件接口和软件驱动方法。2)在软件中加入LED驱动文件,修改程序,实现若温度高于设定的上限则LED1亮,低于设定的下限则LED4亮,在上限和下限之间则LED2和LED3交替发光。范例工程:STM32F10x_StdPeriph_Lib_V3.5.0物电学院ARM实验室STM32F103Rx_实验17 DS18B20。导学:使用前要先调用DS18B20_RST ()进行初始化,初始化成功会返回0,不成功返回1。不成功多数是因为没有正确地连接DS18B20传感器,或者DS18B20传感器损坏。调用DS18B20_GetTemp()即可返回测出的温度值,DS18B20_Get
25、Temp()耗时约750mS,返回的温度值是一个float实数。第八天:任务:1)学习LCD液晶屏软件结构,理解LCD液晶屏与STM32微控制器的硬件接口和软件驱动方法。2)将软件中的usart.c更换为usart_int.c,修改程序,将通过串口接收到的信息在液晶屏上显示,使液晶屏成为计算机终端。范例工程:STM32F10x_StdPeriph_Lib_V3.5.0物电学院ARM实验室STM32F103Rx_实验18 LCD12864液晶屏。导学:调用函数LCD_ShowString (u8 x,u8 y, const u8 *p)可以将待显示的字符串放到液晶显示屏上,x、y是第一个字符在屏
26、上的坐标(左上角是0、0,右下角是7、3),p是第一个字符的地址。注意:滚屏需要借助于存储3行信息来实现。第九天:任务:以学习过的软件为基础,经过组合和编程,实现用DS18B20测出的温度控制一个LED的亮度。LED的发光亮度由数字温度传感器DS18B20控制,温度高则亮度高,温度低则亮度也低。温度值同时送到液晶屏上显示。范例工程:前述的8个工程。导学: 要用温度值生成一个PWM比较值,注意PWM比较值应该在一个能够使LED亮度变化比较显著的区间。温度值原本是一个float实数,要送液晶屏显示,必须先转换成字符串。第十天:总结考核,撰写实训报告。报告内容有:1)第九天的工作内容详述;2)学号后2位/8,得到余数n,对第n+1天的工作内容进行分析叙述;3)实训的收获、体会。