基于stm32的温度测量系统毕业论文.doc_第1页
基于stm32的温度测量系统毕业论文.doc_第2页
基于stm32的温度测量系统毕业论文.doc_第3页
基于stm32的温度测量系统毕业论文.doc_第4页
基于stm32的温度测量系统毕业论文.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于stm32的温度测量系统毕业论文目 录摘 要IAbstractII1 绪论12 系统分析32.1 STM32芯片32.2 DS18B2052.3 TFTLCD62.4 ATK-HC05蓝牙串口73 硬件设计83.1 MCU83.2 JTAG设计93.3 TFTLCD电路设计94 软件设计104.1 系统初始化104.1.1 时钟的初始化104.1.2 I/O初始化114.1.3 串口初始化134.1.4 DMA初始化154.1.5 中断初始化174.2 模块功能设计184.2.1 DS18B20温度模块184.2.2 TFTLCD模块设计214.2.3 ATK-HC05蓝牙模块245 结果与总结26参考文献30致谢311 绪论随着现代工业的不断发展,生产技术的不断进步,对于产品的精度要求也不断提高,而温度是人们生产生活中十分关注的参数,对温度的测量以及监控就显得十分重要。在某些行业中对温度的要求较高,由于工作环境温度的偏差进而引发事故。如化工业中做酶的发酵,必须时刻了解所发酵酶的温度才可以得到所需酶;文物的保护同样也离不开温度的采集,不仅在文物出土的时刻,在博物馆和档案馆中,温度的控制也是藏品保存关键,所以温度的检测对其也是具有重要意义的;另外大型机房的温度的采集,超出此范围会影响服务器或系统的正常工作等等。传统方式监控温度往往很耗费人力,而且实时性差。本文就设计了一个基于STM32的温度测量系统,在测量温度的同时能实现无线传输与控制。早期使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就可计算出当前环境温度。而现在的温度传感器已经走向数字化,本次设计选用美国DALLAS半导体公司推出的数字化温度传感器DS18B20,该芯片采用单总线协议,仅占用一个I/O口,直接将环境温度转化成数字信号,以数字码方式串行输出。DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈刚封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域,如电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合MCU选用STM32RBT6,有测量精度高、操作简单、价格低廉等优点。STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品。同时在编程方面STM32也具有和其他单片机的优势之处,如51单片机必须从最底层开始编程,而STM32所有的初始化和一些驱动的程序都是以模板的形式提供给开发者,在此开发者只需要了些其他的模块功能和工作方式和少量的语法知识便可以进行编程,此优势不但节约了时间,也为STM32的发展做出了强有力的铺垫,而且STM32目前是刚刚被作为主流开发的单片机,所以其前景是无可估量的,这次毕业设计也是看好了其优越的发展趋势来选择的。无线传输采用蓝牙技术,将采集的温度传输至终端,以此实现远程监控。利用“蓝牙”技术,能够在10米的半径范围内实现单点对多点的无线数据传输,其数据传输带宽可达1Mbps。通讯介质为频率在2.402GHz到2.480GHz之间的电磁波。用跳频频谱扩展技术,把频带分成若干个跳频信道,在一次连接中,无线电收发器按伪随机码序列不断地从一个信道“跳”到另一个信道。硬件设计使用的是Altium Designer软件,Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统。这套软件把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术进行了完美融合,使用起来很方便。通过原理图的绘制,对整体的结构有了更深一步的了解。软件部分则是通过RealView MDK来设计的,它是ARM于2006年1月30日推出的针对各种嵌入式处理器的软件开发工具。RealView MDK集成了业内领先的技术,包括Keil Vision3集成开发环境与RealView编译器。支持最新的Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的 Simulation设备模拟,可进行软件仿真。软件仿真时可以查看很多硬件相关的寄存器,通过观察这些寄存器,就能很容易的检查代码的功能是否符合设计要求,出现错误时也方便找出原因。通过Jlink连接处理器后,还能进行在线调试,就能实时跟踪程序在硬件上的执行状况,可以进行复位、执行到断点处、挂起、执行进去、执行过去、执行出去等丰富的操作,例如,单步执行程序,就可以看到每一行代码在硬件的所起的效果,这样更直观,更方便对程序进行改进。这个功能在软件设计的过程中给予我极大的帮助,STM32的寄存器比较繁杂,使用时很容易遗漏某些部分,而在线调试就容易找出问题所在,从而进行纠正。最后的成品较好的完成了预定的设计要求,能准确的显示温度数据,能与移动终端实现异步双工通信,达到传输温度和远程控制的目的。通过本次设计,更加深入的理解了stm32的相关寄存器,并掌握其工作原理。更加深入的学习和应用一些工具软件,如Altium Designer、RealView MDK,通过对这些软件的使用,也加深了对相关知识的理解。本次的毕业设计题目相关的知识包括:电路原理、模拟电路、数字电路、c语言、单片机原理、通信原理等,有效的培养分析和解决实际问题的综合能力,得到更加全面的培养和锻炼,使大学所学的基础和专业知识可以再解决实际问题中得到综合的应用。2 系统分析本系统是基于STM32 微控制器所设计的温度测量系统,通过温度芯片DS18B20测量温度,微控制器驱动液晶模块显示当前测得的温度,然后由蓝牙将温度信息发送至手机终端,同时接收终端反馈的控制信息。整个系统模块分为四个模块:主芯片模块、DS18B20温度模块、液晶显示、蓝牙模块。MCU 是STM32 主芯片的最小板,上面有芯片工作需要的最少资源:时钟控制电路、复位电路、JTAG 控制口以及与外围电路相连的接口。DS18B20和液晶分别是温度测量、控制显示部分。而蓝牙模块负责完成与移动终端的异步双工通信。2.1 STM32芯片STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。STM32的高性能Cortex-M3内核为1.25DMips/MHz;含有一流的外设:1us的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHZ的I/O翻转速度;在72MHz时消耗36mA,待机时下降的2uA。内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz。单周期乘法和硬件除法。存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。POR、PDR和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz RC振荡电路。内部40 kHz的RC振荡电路。用于CPU时钟的PLL。带校准用于RTC的32kHz的晶振。低功耗:3种低功耗模式:休眠,停止,待机模式。为RTC和备份寄存器供电的VBAT。调试模式:串行调试(SWD)和JTAG接口。DMA:12通道DMA控制器。支持的外设:定时器,ADC,DAC,SPI,IIC和USART。2个12位的us级的A/D转换器(16通道):A/D测量范围:0-3.6 V。双采样和保持能力。片上集成一个温度传感器。2通道12位D/A转换器:STM32F103xC,STM32F103xD,STM32F103xE独有。最多高达112个的快速I/O端口:根据型号的不同,有26,37,51,80,和112的I/O端口,所有的端口都可以映射到16个外部中断向量。除了模拟输入,所有的都可以接受5V以内的输入。最多多达11个定时器:4个16位定时器,每个定时器有4个IC/OC/PWM或者脉冲计数器。2个16位的6通道高级控制定时器:最多6个通道可用于PWM输出。2个看门狗定时器(独立看门狗和窗口看门狗)。Systick定时器:24位倒计数器。2个16位基本定时器用于驱动DAC。最多多达13个通信接口:2个IIC接口(SMBus/PMBus)。5个USART接口(ISO7816接口,LIN,IrDA兼容,调试控制)。3个SPI接口(18 Mbit/s),两个和IIS复用。CAN接口(2.0B)。USB 2.0全速接口。SDIO接口。ECOPACK封装:STM32F103xx系列微控制器采用ECOPACK封装形式。集成嵌入式Flash和SRAM存储器的ARM Cortex-M3内核。和8/16位设备相比,ARM Cortex-M3 32位RISC处理器提供了更高的代码效率。STM32F103xx微控制器带有一个嵌入式的ARM核,所以可以兼容所有的ARM工具和软件。嵌入式Flash存储器和RAM存储器:内置多达512KB的嵌入式Flash,可用于存储程序和数据。多达64KB的嵌入式SRAM可以以CPU的时钟速度进行读写(不待等待状态)。可变静态存储器(FSMC):FSMC嵌入在STM32F103xC,STM32F103xD,STM32F103xE中,带有4个片选,支持四种模式:Flash,RAM,PSRAM,NOR和NAND。3个FSMC中断线经过OR后连接到NVIC。没有读/写FIFO,除PCCARD之外,代码都是从外部存储器执行,不支持Boot,目标频率等于SYSCLK/2,所以当系统时钟是72MHz时,外部访问按照36MHz进行。嵌套矢量中断控制器(NVIC):可以处理43个可屏蔽中断通道(不包括Cortex-M3的16根中断线),提供16个中断优先级。紧密耦合的NVIC实现了更低的中断处理延迟,直接向内核传递中断入口向量表地址,紧密耦合的NVIC内核接口,允许中断提前处理,对后到的更高优先级的中断进行处理,支持尾链,自动保存处理器状态,中断入口在中断退出时自动恢复,不需要指令干预。外部中断/事件控制器(EXTI):外部中断/事件控制器由用于19条产生中断/事件请求的边沿探测器线组成。每条线可以被单独配置用于选择触发事件(上升沿,下降沿,或者两者都可以),也可以被单独屏蔽。有一个挂起寄存器来维护中断请求的状态。当外部线上出现长度超过内部APB2时钟周期的脉冲时,EXTI能够探测到。多达112个GPIO连接到16个外部中断线。时钟和启动:在启动的时候还是要进行系统时钟选择,但复位的时候内部8MHz的晶振被选用作CPU时钟。可以选择一个外部的4-16MHz的时钟,并且会被监视来判定是否成功。在这期间,控制器被禁止并且软件中断管理也随后被禁止。同时,如果有需要(例如碰到一个间接使用的晶振失败),PLL时钟的中断管理完全可用。多个预比较器可以用于配置AHB频率,包括高速APB(PB2)和低速APB(APB1),高速APB最高的频率为72MHz,低速APB最高的频率为36MHz。Boot模式:在启动的时候,Boot引脚被用来在3种Boot选项种选择一种:从用户Flash导入,从系统存储器导入,从SRAM导入。Boot导入程序位于系统存储器,用于通过USART1重新对Flash存储器编程。电源供电方案:VDD ,电压范围为2.0V-3.6V,外部电源通过VDD引脚提供,用于I/O和内部调压器。VSSA和VDDA,电压范围为2.0-3.6V,外部模拟电压输入,用于ADC,复位模块,RC和PLL,在VDD范围之内(ADC被限制在2.4V),VSSA和VDDA必须相应连接到VSS和VDD。VBAT,电压范围为1.8-3.6V,当VDD无效时为RTC,外部32KHz晶振和备份寄存器供电(通过电源切换实现)。电源管理:设备有一个完整的上电复位(POR)和掉电复位(PDR)电路。这条电路一直有效,用于确保从2V启动或者掉到2V的时候进行一些必要的操作。当VDD低于一个特定的下限VPOR/PDR时,不需要外部复位电路,设备也可以保持在复位模式。设备特有一个嵌入的可编程电压探测器(PVD),PVD用于检测VDD,并且和VPVD限值比较,当VDD低于VPVD或者VDD大于VPVD时会产生一个中断。中断服务程序可以产生一个警告信息或者将MCU置为一个安全状态。PVD由软件使能。电压调节:调压器有3种运行模式:主(MR),低功耗(LPR)和掉电。MR用在传统意义上的调节模式(运行模式),LPR用在停止模式,掉电用在待机模式:调压器输出为高阻,核心电路掉电,包括零消耗(寄存器和SRAM的内容不会丢失)。低功耗模式:STM32F103xx支持3种低功耗模式,从而在低功耗,短启动时间和可用唤醒源之间达到一个最好的平衡点。休眠模式:只有CPU停止工作,所有外设继续运行,在中断/事件发生时唤醒CPU;停止模式:允许以最小的功耗来保持SRAM和寄存器的内容。1.8V区域的时钟都停止,PLL,HSI和HSE RC振荡器被禁能,调压器也被置为正常或者低功耗模式。设备可以通过外部中断线从停止模式唤醒。外部中断源可以使16个外部中断线之一,PVD输出或者TRC警告。待机模式:追求最少的功耗,内部调压器被关闭,这样1.8V区域断电。PLL,HSI和HSE RC振荡器也被关闭。在进入待机模式之后,除了备份寄存器和待机电路,SRAM和寄存器的内容也会丢失。当外部复位(NRST引脚),IWDG复位,WKUP引脚出现上升沿或者TRC警告发生时,设备退出待机模式。进入停止模式或者待机模式时,TRC,IWDG和相关的时钟源不会停止。选型片的原则是:看功耗,本次设计的温度系统需要在外场长时间工作,那么就需要功耗较低;看成本,在能满足性能要求的前提下,选择成本较低的。从这两个方面来看,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz,时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,综合考虑,本次设计选用的mcu为STM32RBT6。2.2 DS18B20DS18B20是由DALLAS半导体公司推出的一种的“一线总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。一线总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9l2位的数字值读数方式。它工作在355 V的电压范围,采用多种封装形式,从而使系统设计灵活、方便,设定分辨率及用户设定的报警温度存储在EEPROM中,掉电后依然保存。目前常用的单片机与外设之间进行数据传输的串行总线主要有I2C,SPI和SCI总线。其中I2C总线以同步串行二线方式进行通信:一条时钟线,一条数据线。SPI总线则以同步串行三线方式进行通信:一条时钟线,一条数据输入线,一条数据输出线。SCI总线是以异步方式进行通信:一条数据输入线,一条数据输出线。而DS18B20的单总线采用单条信号线,既可传输时钟,又可传输数据,而且数据传输是双向的,因而具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。ROM中的64位序列号是出厂前被光记好的,它可以看作是该DS18B20的地址序列码,每DS18B20的64位序列号均不相同。64位ROM的排列是:前8位是产品家族码,接着48位是DS18B20的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5 +X4 +1)。ROM作用是使每一个DS18B20都各不相同,这样就可实现一根总线上挂接多个。DS18B20适应电压范围宽,电压范围在3.05.5V,在寄生电源方式下可由数据线供电。在使用中不需要任何外围元件,全部传感元件及转换电路继承在形如一只三极管的集成电路内。可编程分辨率为912位,对应的可分辨温度分别为0.5度,0.25度,0.125度,0.0625度,可实现高精度测温。2.3 TFTLCDTFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。液晶先后避开了困难的发光问题,利用液晶作为光阀的优良特性把发光显示器件分解成两部分,即光源和对光源的控制。作为光源,无论从发光效率、全彩色,还是寿命,都已取得了辉煌的成果,而且还在不断深化之中。LCD发明以来,背光源在不断地进步,由单色到彩色,由厚到薄,由侧置荧光灯式到平板荧光灯式。在发光光源方面取得的最新成果都会为LCD提供新的背光源。随着光源科技的进步,会有更新的更好的光源出现并为LCD所应用。余下的就是对光源的控制,把半导体大规模集成电路的技术和工艺移植过来,研制成功了薄膜晶体管(TFT)生产工艺,实现了对液晶光阀的矩阵寻址控制,解决了液晶显示器的光阀和控制器的配合,从而使液晶显示的优势得以实现。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。 TFT实际上指的是薄膜晶体管,可以对屏幕上的各个独立的像素进行控制。显示屏由许多可以发出任意颜色的光线的像素组成,只要控制各个像素显示相应的颜色就能达到目的了。在TFT LCD中采用背光技术,为了能精确地控制每一个像素的颜色和亮度就需要在每一个像素之后安装一个类似百叶窗的开关,当“百叶窗”打开时光线可以透过来,而“百叶窗”关上后光线就无法透过来。技术上的实现就是利用了液晶的特性,在上下两层都有沟槽,上层的是纵向排列,下层的是横向排列,当不加电压时液晶处于自然状态,通过适当的结构设计,光线从上层通过夹层后会发生90度的扭曲,从而能在下层顺利通过,加上电压就会生成一个电场,使得液晶都垂直排列,这时光线就无法通过下层。2.4 ATK-HC05蓝牙串口ATK-HC05模块,是一款高性能主从一体蓝牙串口模块,可以同各种带蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP等智能终端配对,该模块支持非常宽的波特率范围:48001382400,并且模块兼容5V或3.3V单片机系统,使用非常灵活、方便。在微微网建立之前,所有设备都处于就绪状态。在该状态下,未连接的设备每隔1.28s监听一次消息,设备一旦被唤醒,就在预先设定的32个跳频频率上监听信息。连接进程由主设备初始化。如果一个设备的地址已知,就采用页信息建立连接;如果地址未知,就采用紧随页信息的查询信息建立连接。在微微网中,无数据传输的设备转入节能工作状态。主设备可将从设备设置为保持方式,此时,只有内部定时器工作;从设备也可以要求转入保持方式。设备由保持方式转出后,可以立即恢复数据传输。连接几个微微网或管理低功耗器件时,常使用保持方式。监听方式和休眠方式是另外两种低功耗工作方式。蓝牙基带技术支持两种连接方式:面向连接(SCO)方式,主要用于语音传输;无连接(ACL)方式,主要用于分组数据传输。温度数据就通过无连接方式传输。蓝牙采用的是跳频和时分多址技术。跳频就是用伪随机码序列进行移频键控,使载波频率不断跳变而扩展频谱的一种方法。在传统的定频通信系统中,发射机中的主振荡器的振荡频率是固定设置的,因而它的载波频率是固定的。为了得到载波频率是跳变的跳频信号,要求主振荡器的频率应能遵照控制指令而改变。这种产生跳频信号的装置叫跳频器。通常,跳频器是由频率合成器和跳频指令发生器构成的。如果将跳频器看作是主振荡器,则与传统的发信机没有区别。被传送的信息可以是模拟的或数字的信号形式,经过调制器的相应调制,便获得副载波频率固定的已调波信号,再与频率合成器输出的主载波频率信号进行混频,其输出的已调波信号的载波频率达到射频通带的要求,经过高通滤波器后馈至天线发射出去。这就是定频信号的发送过程。而时分多址就是把时间分割成互不重叠的帧,再将帧分割成互不重叠的时隙(信道)与用户具有一一对应关系,依据时隙区分来自不同地址的用户信号,从而完成的多址连接。3 硬件设计3.1 MCUMCU选用的STM32RBT6,64引脚。排阻P3和P1分别用于PORTA和PORTB的IO口引出,其中P2还有部分用于PORTC口的引出。PORTA和PORTB都是按顺序排列的。P2连接了DS18B20的数据口以及红外传感器的数据线,它们分别对应着PA0和PA1,只需要通过跳线帽将P2和P3连接起来就可以使用了。这里不直接连在一起的原因有二:1,防止红外传感器和DS18B20对这两个IO口作为其他功能使用的时候的影响;2,DS18B20和红外传感器还可以用来给其他板子提供输入。 P4口连接了PL2303的串口输出,对应着STM32的串口1(PA9/PA10),在使用的时候,也是通过跳线帽将这两处连接起来。这样设计使得PA9和PA10用作其他用途使用的时候,不受到PL2303的影响。P5口是另外一个IO引出排阵,将PORTC和PORTD等的剩余IO口从这里引出。 图3.1 mcu原理图3.2 JTAG设计JTAG(Joint Test Action Group;联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。图3.2 JTAG原理图3.3 TFTLCD电路设计TFTLCD采用34引脚,部分对应关系为:LCD_LED对应PC10;LCD_CS对应PC9;LCD_RS对应PC8;LCD_WR对应PC7;LCD_RD对应PC6;LCD_D17:1;对应PB15:0图3.3 tftlcd原理图4 软件设计软件设计部分,包括两大部分:初始化和功能性设计。4.1 系统初始化4.1.1 时钟的初始化时钟是MCU的驱动源,而STM32有三种不同的时钟源来驱动系统时钟:HSI振荡器时钟、HSE振荡器时钟、PLL时钟。HSI时钟信号由内部8MHz的RC振荡器产生,可在2分频后作为PLL输入,HSE即高速外部时钟信号由两种时钟源产生:HSE外部晶体/陶瓷谐振器、HSE用户外部时钟。而我选用的是PLL时钟。主PLL以HSI时钟除以2或HSE通过一个可配置分频器的PLL2时钟来倍频后输出。PLL2和PLL3由HSE通过一个可配置的分频器提供时钟。必须在使能每个PLL之前完成PLL的配置(选择时钟源、预分频系数和倍频系数等),同时应该在它们的输入时钟稳定(就绪位)后才能使能。一旦使能了PLL,这些参数将不能再被改变。 当改变主PLL的输入时钟源时,必须在选中了新的时钟源(通过时钟配置寄存器(RCC_CFGR)的PLLSRC位)之后才能关闭原来的时钟源。时钟中断寄存器(RCC_CIR),可以在PLL就绪时产生一个中断。 其代码如下:/系统时钟初始化函数 /pll:选择的倍频数,从2开始,最大值为16 void Stm32_Clock_Init(u8 PLL) unsigned char temp=0; MYRCC_DeInit(); /复位并配置向量表 RCC-CR|=0x00010000; /外部高速时钟使能HSEON while(!(RCC-CR17);/等待外部时钟就绪 RCC-CFGR=0X00000400; /APB1/2=DIV2;AHB=DIV1; PLL-=2;/抵消2个单位 RCC-CFGR|=PLLCFGR|=1ACR|=0x32; /FLASH 2个延时周期 RCC-CR|=0x01000000; /PLLON while(!(RCC-CR25);/等待PLL锁定 RCC-CFGR|=0x00000002;/PLL作为系统时钟 while(temp!=0x02) /等待PLL作为系统时钟设置成功 temp=RCC-CFGR2; temp&=0x03; Stm32_Clock_Init函数只有一个变量PLL,就是用来配置时钟的倍频数的,当前所用的晶振为8Mhz,PLL的值设为9,那么STM32将运行在72M的速度下。此外,在程序中经常用到延时函数,利用CM3内核的处理器内部包含的SysTick定时器来实现延时,它是一个24位的倒计数定时器,当记到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。使用SysTick来实现延时,既不占用中断,也不占用系统定时器。4.1.2 I/O初始化每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 GPIO端口的每个位可以由软件分别配置成多种模式: 输入浮空 、输入上拉、 输入下拉 、模拟输入、开漏输出 、推挽式输出、推挽式复用功能 、开漏复用功能。每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。下图给出了一个I/O端口位的基本结构。 图4.1 I/O端口结构 首先为了方便函数的编写,进行IO口的地址映射,如下(列举部分):#define BITBAND(addr, bitnum) (addr & 0xF0000000)+0x2000000+(addr &0xFFFFF)5)+(bitnumAPB2ENR|=1APB2ENR|=1CRH&=0XFFFFFFF0; GPIOA-CRH|=0X00000003;/PA8 推挽输出 GPIOA-ODR|=1CRL&=0XFFFFF0FF;GPIOD-CRL|=0X00000300;/PD2 推挽输出GPIOD-ODR|=1APB2ENR|=1CRH&=0X000FFFFF;GPIOA-CRH|=0X80800000; /PA13,15 设置为输入GPIOA-ODR|=1ODR|=115; /PA15上拉4.1.3 串口初始化本次设计中蓝牙的收发都是通过串口传至STM32内,串口最基本的设置,就是波特率的设置。STM32的串口使用需要开启了串口时钟,并设置相应IO口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息。具体步骤如下。串口时钟使能。串口作为STM32的一个外设,其时钟由外设时钟使能寄存器控制,其中串口1是在APB2ENR寄存器的第14位。除了串口1的时钟使能在APB2ENR寄存器,其他串口的时钟使能位都在APB1ENR寄存器。串口复位。当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。串口1的复位是通过配置APB2RSTR寄存器的第14位来实现的。串口波特率设置。每个串口都有一个自己独立的波特率寄存器USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的。串口控制。STM32的每个串口都有3个控制寄存器USART_CR13,串口的很多配置都是通过这3个寄存器来设置的。 图4.3 USART_CR寄存器各位描述该寄存器的高18位没有用到,低14位用于串口的功能设置。UE为串口使能位,通过该位置1,以使能串口。M为字长选择位,当该位为0的时候设置串口为8个字长外加n个停止位,停止位的个数(n)是根据USART_CR2的13:12位设置来决定的,默认为0。PCE为校验使能位,设置为0,则禁止校验,否则使能校验。PS为校验位选择,设置为0则为偶校验,否则为奇校验。TXIE为发送缓冲区空中断使能位,设置该位为1,当USART_SR中的TXE位为1时,将产生串口中断。TCIE为发送完成中断使能位,设置该位为1,当USART_SR中的TC位为1时,将产生串口中断。RXNEIE为接收缓冲区非空中断使能,设置该位为1,当USART_SR中的ORE或者RXNE位为1时,将产生串口中断。TE为发送使能位,设置为1,将开启串口的发送功能。RE为接收使能位,用法同TE。 数据发送与接收。STM32的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内。该寄存器的各位描述如下图所示: 图4.4 USART_DR寄存器各位描述 串口状态。串口的状态可以通过状态寄存器USART_SR读取。USART_SR的各位描述如下图所示: 图4.5 USART_SR寄存器各位描述 RXNE(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取USART_DR,通过读USART_DR可以将该位清零,也可以向该位写0,直接清除。 TC(发送完成),当该位被置位的时候,表示USART_DR内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读USART_SR,写USART_DR。2)直接向该位写0。 代码如下:void uart_init(u32 pclk2,u32 bound) float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);/得到USARTDIVmantissa=temp; /得到整数部分fraction=(temp-mantissa)*16; /得到小数部分 mantissaAPB2ENR|=1APB2ENR|=1CRH&=0XFFFFF00F;/IO状态设置GPIOA-CRH|=0X000008B0;RCC-APB2RSTR|=1APB2RSTR&=(1BRR=mantissa; /波特率设置USART1-CR1|=0X200C; /1位停止,无校验位#if EN_USART1_RX /使能接收中断USART1-CR1|=1CR1|=1DR;而将USART2_TX_BUF这个数组作为数据存储器,就向DMA_CMARx中写入&USART2_TX_BUF;要传输的数据量通过strlen函数来测量后传输给DMA_CNDTR;因为只需开启一个通道,所以优先级可以随意设置;数据传输方向是从存储器读取;当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行,而传输过的温度值,不希望其重复传输,因而关闭循环模式;外设地址不变,存储器选择增量模式,它们的数据宽度都为8位,是为了适应蓝牙的数据传输。此外,传输一半和传输完成都无需产生中断,每传一次数据前都会关闭DMA通道,再重新开启通道,4.1.5 中断初始化传输数据到串口通过DMA方式,从串口接收数据时需要检测,这时就采用中断方式。CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。其中串口2属于可屏蔽中断,中断向量地址为0x0000_00D8。对于如此多的中断,优先级的分配也就显得很有意义,IPRInterrupt Priority Registers,就是控制中断优先级控制的寄存器组,IPR寄存器组由15个32bit的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示15*4=60个可屏蔽中断。刚好和STM32的可屏蔽中断数相等。IPR0的3124,2316,158,70分别对应中中断30,依次类推,总共对应60个外部中断。而每个可屏蔽中断占用的8bit并没有全部使用,而是 只用了高4位。这4位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据SCB-AIRCR中中断分组的设置来决定。 STM32将中断分为5个组,组04。该分组的设置是由SCB-AIRCR寄存器的bit108来定义的。具体的分配关系如下表所示: 表4.1 AIRCR中断分组设置表 组AIRCR10:8Bit7:4分配情况分配结果01110:40位抢占优先级,4位响应优先级11101:31位抢占优先级,3位响应优先级21012:22位抢占优先级,2位响应优先级31003:13位抢占优先级,1位响应优先级4114:04位抢占优先级,0位响应优先级所有的60个中断,每个中断的中断优先寄存器的高四位中的最高3位是抢占优先级,低1位是响应优先级。每个中断,可以设置抢占优先级为07,响应优先级为1或0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。 如果两个中断的抢占优先级和响应优先级都是一样的话,则中断先发生就先执行。高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。 STM32的5个分组是通过设置SCB-AIRCR的BIT10:8来实现的,SCB-AIRCR的修改需要通过在高16位写入0X05FA这个密钥才能修改的,故在设置AIRCR之前,应该把密钥加入到要写入的内容的高16位,以保证能正常的写入AIRCR。在修改AIRCR的时候,采用读-改-写的步骤,来实现不改变AIRCR原来的其他设置。中断的框图如下所示:图4.6 中断框图一般I/O口配置中断的步骤分为:初始化IO口为输入,开启IO口复用时钟,设置IO口与中断线的映射关系,开启与该IO口相对的线上中断/事件,设置触发条件,配置中断分组,并使能中断,最后编写中断服务函数。而串口2有对应的中断向量,就省去了前面的映射步骤,MDK给串口2中断分配了一个固定的函数名USART2_IRQHandler。这里服务函数要实现的功能是判断接收连续2个字符之间的时间差是否大于10ms,如果间隔超过10ms,则认为不是一次连续数据,换句话说就是超过10ms没有接收到任何数据,则表示此次接收完毕。这里利用了通用定时器TIME4实现这个功能,即让TIME4计时10ms,如果这段时间有数据接收则清空TIM4-CNT,TIME4开始重新计数,如果没有,则进入TIME4的中断函数,结束此次接收。4.2 模块功能设计4.2.1 DS18B20温度模块DS18B20是由DALLAS半导体公司推出的一种的“一线总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。一线总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念,测量温度范围为-55+125 ,精度为05。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9l2位的数字值读数方式。它工作在355 V的电压范围,采用多种封装形式,从而使系统设计灵活、方便,设定分辨率及用户设定的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论