基于STM32的温度测量系统(共15页).doc
精选优质文档-倾情为你奉上基于STM32的温度测量系统梁栋(德州学院物理与电子信息学院,山东德州)摘 要:温度是日常生活和农业生产中的一个重要参数,传统的温度计有反应缓慢,测量精度不高的和读数不方便等缺点,此外,通常需要人工去观测温度,比较繁琐,因而采用电子技术的温度测量就显得很有意义了。  面对电子信息技术的进步,生成了各种形式的温度测量系统。本文设计了一个基于以STM32为核心的温度测量与无线传送的系统,温度信息采集使用数字化温度传感器DS18B20,无线传输使用ATK-HC05蓝牙模块的智能测温系统。 关键词 STM32; DS18B20; TFTLCD; 智能测温系统1 绪论在现代社会的生产生活中,人们对于产品的精度要求越来越高,而温度是人们在生产生活中十分关注的参数,因此,对温度的测量以及监控就显得十分重要。在某些行业中对温度的要求较高,由于工作环境温度的偏差进而引发事故。如化工业中做酶的发酵,必须时刻了解所发酵酶的温度才可以得到所需酶;文物的保护同样也离不开温度的采集,不仅在考古文物的出土时间上,还是在档案馆和纪念馆中,温度的控制也是藏品保存关键,所以温度的检测对其也是具有重要意义的;另外大型机房的温度的采集,超出此范围会影响服务器或系统的正常工作等等。传统方式监控温度往往很耗费人力,而且实时性差。本文就设计了一个基于STM32的温度测量系统,在测量温度的同时能实现无线传输与控制。 STM32RBT6具有较低的价格、较高的测量精度、便捷的操作,同时在编程方面STM32也具有和其他单片机的优势之处,如51要求从基层编程,而STM32所有的初始化和一些驱动的程序都是以模板的形式提供给开发者,在此开发者只需要了些其他的模块功能和工作方式和少量的语法知识便可以进行编程,此优势不但节约了时间,也为STM32的发展做出了强有力的铺垫,而且STM32目前是刚刚被作为主流开发的单片机,所以其前景是无可估量的,这次毕业设计也是看好了其优越的发展趋势来选择的。 无线传输采用蓝牙技术,将采集的温度传输至终端,以此实现远程监控。利用“蓝牙”技术,能够在10米的半径范围内实现单点对多点的无线数据传输,其数据传输带宽可达1Mbps。综合考虑,在设计硬件时选择的软件是Altium Designer,该软件集成了电路仿真、原理图设计、信号完整性设计、分析等诸多功能,使用起来很方便。通过原理图的绘制,对整体的结构有了更深一步的了解。 借助RealView MDK完成软件部分的设计,它包括RealView编译器、Keil Vision3开发环境,可以使用Cortex-M3核处理器,代码实现自动配置、自动启动,配有Flash烧写模块,Simulation设备模拟功能极其强大,可以针对软件实现仿真。在仿真过程中,能够对和硬件有关的寄存器进行查看,通过观察这些寄存器,就能很容易的检查代码的功能是否符合设计要求,出现错误时也方便找出原因。通过Jlink连接处理器后,还能进行在线调试,就能实时跟踪程序在硬件上的执行状况,可以进行复位、执行到断点处、挂起、执行进去、执行过去、执行出去等丰富的操作,例如,单步执行程序,就可以看到每一行代码在硬件的所起的效果,这样更直观,更方便对程序进行改进。这个功能在软件设计的过程中给予我极大的帮助,STM32的寄存器比较繁杂,使用时很容易遗漏某些部分,而在线调试就容易找出问题所在,从而进行纠正。 最后的成品较好的完成了预定的设计要求,能准确的显示温度数据,能与移动终端实现异步双工通信,达到传输温度和远程控制的目的。 通过本次设计,更加深入的理解了stm32的相关寄存器,并掌握其工作原理。更加深入的学习和应用一些工具软件,如Altium Designer、RealView MDK,通过对这些软件的使用,也加深了对相关知识的理解。本次的毕业设计题目相关的知识包括:电路原理、数电、模电、单片机原理、c语言、通信原理等,有效的培养分析和解决实际问题的综合能力,得到更加全面的培养和锻炼,是对大学期间所学知识的一次综合性应用。 2 系统分析本系统是基于STM32 微控制器所设计的温度测量系统,通过温度芯片传感器DS18B20测量温度,微控制器驱动液晶模块显示当前测得的温度,然后由蓝牙将温度信息发送至手机终端,同时接收终端反馈的控制信息。 整个系统模块分为四个模块:主芯片模块、DS18B20温度模块、液晶显示、蓝牙模块。MCU 是STM32 主芯片的最小板,上面有芯片工作需要的最少资源:时钟控制电路、JTAG 接口、复位电路以及与外围电路相连的接口。DS18B20和液晶分别是温度测量、控制显示部分。而蓝牙模块负责完成与移动终端的异步双工通信。2.1 STM32芯片作为一种ARM Cortex-M3内核,STM32系列是以嵌入式应用为设计基础,具有功耗低、成本低、性能高的特点和优势。根据性能的不同,STM32分为STM32F103“增强型”、STM32F101“基本型”两个主要的系列。前者使用频率为72MHz的时钟,在同类产品中,该产品具有最高的性能;后者使用频率为36MHz的时钟,其价格与16位的产品相近,而其性能要比16位产品高的多,如果用户选择16位产品,此款产品是不二之选。在两个系列中配备的闪存大小由32-128K,只是在外设结构、SRAM最大容量方面存在不同的组合。对于频率为72MHz的时钟,代码均在闪存中执行,市场上32位的产品系列中,STM32具有最低的功耗,低至36mA,即0.5mA/MHz。 在STM32中,其内核Cortex-M3的性能非常高,为1.25DMips/MHz;其外设也是非常先进的:ADC(双12位、1us)、SPI(18兆位/秒)、较快的I/O翻转速度(18MHZ)、UART(4兆位/秒);工作在72MHz的时钟之下,其电流为36mA,待机时低至2uA。内核:Cortex-M3 CPU(32位的ARM),工作频率最高可达72MHz、1.25DMIPS/MHz,支持硬件除法、单周期乘法。存储器:集成的Flash存储器大小由32-512KB,SRAM存储器大小由6-64KB。电源、复位、时钟管理:电源、接口驱动电压范围由2.0-3.6V;可编程PVD(电压探测器)、PDR、POR;晶振为4-16MHz;内置校正过的RC振荡电路,频率为8MHz;其内部RC振荡电路频率为40KHz;PLL(提供CPU所用的时钟);用于RTC的晶振,频率为32kHz,带校准功能。低功耗:主要包括待机、停止、休眠等低功耗模式,VBAT用于备用寄存器、RTC的电源需要。调试模式:JTAG接口、串行调试(SWD)。 DMA:DMA控制器共有通道12个,支持USART、DAC、ADC、IIC、定时器等诸多外设。2个16通道的A/D转换器,均为us级,位数为12位,A/D可测量范围是0-3.6 V,具有保持、双采样的功能,同时还配置了温度传感器(1个)。  只有STM32F103xC/D/E才拥有2通道的A/D转换器,位数为12位,快速I/O端口的数量最高为112个,按照不同的型号,I/O端口主要可分为26、37、51、80、112几种,任何一个端口映射到的外部中断向量共有16个,除模拟输入外,还支持低于5V的输入。定时器的数量最多可以配置11个,其中16位定时器共有4个,一个定时器拥有的脉冲计数器、PWM/OC/IC共有4个;6通道高级控制定时器共有2个,位数为16位,用于PWM输出的通道不能超过6个;看门狗定时器共有2个,分别是窗口、独立型;Systick定时器是一种倒计数器,位数是24位;对DAC进行驱动的基本定时器共有2个,位数是16位。通信接口最多不能超过13个,IIC接口共有两个,分别是PMBus、SMBus;USART接口共有5个,分别是调试控制、IrDA兼容、ISO7816接口、LIN;SPI接口共有3个,速度为18 Mbit/s,其中与IIS复用的共有两个;2.0B的CAN、SDIO和USB 2.0全速接口。STM32F103xx系列微控制器所使用的封装形式是ECOPACK封装。ARM Cortex-M3内核集成了SRAM、Flash存储器。不同于8/16位设备,ARM Cortex-M3使用的RISC处理器是32位的,处理代码的效率更高。STM32F103xx微控制器配置相应的嵌入式ARM核,为此,对于一切ARM工具、软件都可以实现兼容。 内置的嵌入式Flash大小最高为512KB,可以对数据、程序进行存储,SRAM存储器大小最高至63KB,在实施读写操作时可以按照CPU的时钟速度。 STM32F103xC/D/E中都嵌入了FSMC,实现的片选共有4个,支持NAND、PSRAM、NOR、RAM、Flash模式。通过OR后,3个FSMC中断线可以和NVIC相连。它不具有FIFO的读写功能,只有PCCARD是在内部执行,其余代码的执行都是依靠外部存储器,并且不支持Boot功能,目标频率可以高达SYSCLK/2,为此,如果系统使用72MHz时钟,那么读写时的频率为36MHz。配备矢量中断控制器(NVIC),除Cortex-M3中16根中断线外,可以对其余最多43个可屏蔽中断通道进行处理,在实施中断处理时具有更小的延迟,将中断入口向量表地址直接传送至内核,它所提供的内核结构可以实现中断提前处理,对于后到的中断,优先处理优先级更高的,可以实现尾链,对处理时的具体状态进行自动保存,在退出中断后,可以自动恢复中断入口,而无需任何指令。它的外部中断/事件控制器主要组成部分是边沿探测器线,主要产生中断/事件请求,共计19条。对于每一条线,可以对其实施单独屏蔽,在下降沿、上升沿等触发事件的选择方面可以实现单独配置。为了使中断请求的状态得到维护,可以使用挂起的寄存器,相比内部APB2所对应的时钟周期,如果外部线上的脉冲周期更长,那么这种情况可以通过EXTI进行探测,GPIO的数量最多112个,和外部中断线(共计16个)相连。启动时需要选择系统时钟,在执行复位操作时,CPU时钟使用内部晶振,频率为8MHz。通过监视4-16MHz的外部时钟判断成功与否,此过程中,在禁止控制器后,接着禁止软件中断管理。如果间接利用晶振未能获得成功,那么可以使用PLL时钟具有的中断管理。在对低速和高速APB,即APB1、PB2等AHB频率进行配置时可以借助多个预比较器,前者的频率最高不能超过36MHz,后者的频率最高可以达到72MHz。启动时可以借助Boot引脚选择3种Boot选项中的任意一种,可以通过系统存储器、SRAM、用户Flash实现导入。Boot将相应的程序导入到系统的存储器内,借助USART1,重新编程Flash存储器。所使用的VDD范围是2.0V-3.6V,借助VDD引脚为其提供相应的外部电源,主要用在内部调压器、IO接口。对应的VDDA、VSSA电压范围是2.0-3.6V,可以通过外部输入相应的模拟电压,主要用在PLL、RC、复位和ADC等模块,限制ADC的电压为2.4V,VDDA、VSSA处在VDD范围时需要和VDD、VSS相连接。VBAT具有的电压范围是1.8-3.6V,在VDD无效时变为RTC,借助电源的切换对备份寄存器、32KHz晶振供电。在此设备上具有较为完整的上电、掉电复位电路,即POR、PDR,此电路时钟有效,保证电压2V的情况下可以正常启动,在电压降至2V时进行相应的操作。如果VDD比下限VPOR/PDR要低,那么该设备可以工作在复位模式,而无需外部复位。在设备中有可编程电压探测器(PVD),它可以对VDD进行检测,相比于VPVD,如果VDD高或者低,那么便会产生中断。中断服务程序可以把MCU处于安全状态,或者产生相应的警告信息,PVD主要使软件处于使能状态。它配有低功耗(LPR)、主(MR)、掉电三种模式的调压器,传统调节模式使用MR,而停止模式使用LPR、待机模式使用掉电,掉电模式下,调压器高阻输出,核心电路发生掉电,在保证SRAM、寄存器内容未丢失的前提下消耗为零。 STM32F103xx支持3种模式的低功耗,非常好的平衡了唤醒源、短启动时间、低功耗的问题。CPU处于停止状态,外设正常运行,此模式即休眠模式,在发生中断/事件时CPU被唤醒;在寄存器、SRAM内容保持的过程中,使用最小功耗,即停止模式,停止1.8V区域内的时钟,同时禁用HSE RC、HSI、PLL,调压器处于低功耗或者正常状态。利用外部中断线可以将设备由停止模式成功唤醒,外部中断源可利用外部中断线产生TRC警告,实现PVD输出。待机模式的功耗最小,会关闭内部的调压器,而切断1.8V区域的供电,同时关闭HSE RC、HSI、PLL。如果处于待机模式,寄存器、SRAM、待机电路、备份寄存器都会丢失各自的内容。如果出现IWDG、外部复位,或者WKUP引脚发生TRC警告、出现上升沿,那么设备便由待机模式退出,当处在待机或者停止模式时,并不会停止IWDG、TRC、时钟源。选型片的原则是:看功耗,本次设计的温度系统需要在外场长时间工作,必须保证较低的功耗;如果性能满足要求,那么必须保证较低的成本。就此方面看,在当前32位市场上,STM32系列产品具有最低的功耗,低至36mA,相当0.5mA/MHz,具有36MHz的时钟,花费16位产品的价格,所得到的产品性能要比16位产品高的多,基于上述几点考虑,本次的mcu选定为STM32RBT6。 2.2 DS18B20  DALLAS半导体公司制作、推出了DS18B20,这是一款温度传感器,接口为“一线总线”。这不同于其他的测温元件,比如热敏电阻等,此温度传感器是数字化的,具有非常简单的微处理器接口、较宽的适用电压、较小的体积。“一线总线”经济而简洁,用户可以利用此接口对传感器网络进行组建,将全新概念引入到构建测量系统的过程中。利用“一线总线”的数字方式可以直接传输现场温度,使系统的抗干扰性得到极大的提升,能将被测温度直接读取出来,在读数时,结合现实情况,通过编程方式将数字值设定为9-12位,工作的电压范围是3-5.5V,封装方式有多种,更方便、灵活的设计系统,在EEPROM中存储用户预先设定的报警温度、分辨率,即使出现掉电,依然保存相关内容。 针对外设、单片机,在传输数据时,主要利用SCI、SPI、I2C等串行总线,在通信时,I2C总线使用的是同步串行二线模式,具有数据线、时钟线各一条; SPI总线使用的是同步串行三线模式,输出线、输入线、时钟线各一条;SCI总线使用的是异步模式,数据输入、输出线各一条。就DS18B20配有的单总线而言,它的信号线是单条的,可以对时钟、数据进行传输,可以实现双向的数据传输,同时拥有简单的线路、较少的硬件开销、廉价的成本,易于维护和扩展的总线。 出厂前已经在ROM中光记了它独有的64位序列号,即DS18B20对应的地址序列码,每个DS18B20具有完全不同的64位序列号。64位ROM按照以下方式进行排列,产品家族码用前8位表示,DS18B20的序列号用之后的48位表示,而前56位的循环冗余校验码用最后8位进行表示,即CRC=X8+X5 +X4 +1。对于DS18B20而言,ROM使其各不相同,如此便可以将多个挂接在一根总线上。DS18B20具有较宽的电压范围,即3.05.5V,如果处于寄生电源模式下,供电由数据线完成,无需使用外围元件即可使用,在集成电路中集成了转换电路、传感元件。通过编程可以使其具有9-12位的分辨率,测试精度较高,温度分辨率为0.0625、0.125、0.25、0.5度。2.3 TFTLCD  薄膜晶体管液晶显示器,即TFT-LCD,液晶成功解决了发光的问题,可以分解发光显示器,主要是光源及其控制。液晶作为光源获得较大发展,在寿命、全彩色、发光效率方面取得了较大的进步,而且还处在不断提高的过程中。自发明LCD后,背光源进步明显,以往是单色、较厚、侧置荧光灯式的,而现在发展为彩色、较薄、平板荧光灯式的,发光光源发展较为迅速,新成果不断出现,LCD由此获得了较多的新背光源,光源科技不断发展,LCD会使用更好、更新的光源。在控制光源时,移植了半导体大规模集成电路领域的相关工艺、技术,并且成功研制出薄膜晶体管(TFT)的工艺,控制液晶光阀所对应的矩阵寻址,使液晶显示器更好的配合使用控制器、光阀,充分体现出了液晶显示的优势。无源TN-LCD、STN-LCD、TFT-LCD具有不同的矩阵,针对液晶显示屏上的所有点,都专门设置了相应的薄膜晶体管(TFT),做到一对一,解决了在非选通状态时存在的串扰问题,使扫描线数不会影响到液晶屏所具有的静态特性,进而使图像质量得到极大提升,TFT-LCD即真彩液晶显示器。  TFT所指的是薄膜晶体管,可以控制屏幕上的所有像素,组成显示屏的像素可以发生任意颜色,为了达到目的,只需要对像素点所显示的颜色进行控制。TFT LCD使用了背光技术,在像素后需安装开关,此开关类似百叶窗,能够对像素显示的亮度、颜色进行精确的控制,在打开此开关时,光线便可以透进来,而关上开关,光线无法透过。实现过程中使用了液晶的特性,上、下层都有相应的沟槽,分别是纵向、横向排列,如果没有电压,液晶呈现自然状态,只要结构恰当,通过上层透过的光线会产生90度扭曲,而下层的光线可以顺利通过,加电压后变成产生相应的电场,液晶变成垂直排列,此时光线便无法再通过。2.4 ATK-HC05蓝牙串口 作为蓝牙串口模块,ATK-HC05模块是主从一体的,而且性能较高,可以与PDA、手机、电脑等具有蓝牙功能的设备实现配对,该模块所支持的波特率范围非常大,为4800,而且该模块和3.3V或5V的单片机系统相兼容,极其方便、灵活。在建立微微网前,一切设备都是就绪状态,在此状态中,每1.28s未连接的设备便会对一次消息进行监听,唤醒设备后,在监听信息时可以预设32个调频频率,主设备初始化后实现连接进程。倘若已知设备的地址,通过页信息实现连接;倘若地址是未知的,那么通过页信息的查询信息实现连接。微微网中,如果设备未进行数据传输,那么它便进入节能状态。主设备设置从设备为保持方式,此过程中处于工作状态的只有内部定时器;从设备亦可以进入到保持方式。设备一旦转出保持方式便可以开始数据传输。在和几个微微网相连,或者对低功耗器件进行管理时,常用保持方式。低功耗的另外两种工作方式是休眠、监听方式。鉴于蓝牙基带技术,其支持面向连接方式、无连接方式,前者传输语音,后者传输分组数据,温度数据就通过无连接方式传输。 蓝牙采用的是跳频和时分多址技术。为了使频谱扩展,需要利用伪随机码序列实现频移键控,此载波频率发生跳变,即为跳频。传统通信系统中使用定频方式,在发射机中,主振荡器具有固定的振荡频率,为了实现载波频率的跳变,得到跳频信号,按照控制指令改变主振荡器的频率。能够得到跳频信号的装置被称作跳频器,它主要包括跳频指令发生器、频率合成器。如果将跳频器等同于主振荡器,那么和传统的发信机没有任何不同。可以对模拟、数字形式的信号进行传送,之后利用调制器实现调制,进而得到固定频率的已调波信号,接着和频率合成器的主载波频率信号实现混频,此时输出载波频率符合射频通带要求的已调波信号,在经过高通滤波器反馈后,利用天线将信号发射出去,此过程即为发送定频信号的过程。时分多址是分割时间为不重叠的帧,再分割帧为不重叠的信道,和用户一一对应,主要利用信道对地质不同的信号进行区分,实现多址连接。3 硬件设计3.1 MCUMCU选用的STM32RBT6,64引脚。对于PORTA、PORTB,利用排阻P1、P3引出相应的IO口,还可以利用P2引出PORTC口,按照相应的顺序排列PORTA、PORTB。P2连接了DS18B20的数据口以及红外传感器的数据线,它们分别对应着PA0和PA1,只需要通过跳线帽将P2和P3连接起来就可以使用了。这里不直接连在一起的原因有二:1,防止红外传感器和DS18B20对这两个IO口作为其他功能使用的时候的影响;2,DS18B20和红外传感器还可以用来给其他板子提供输入。  P4口与PL2303的串口输出相连接,和STM32的串口1相对应,使用时通过跳线帽将这两处连接起来。这样设计使得PA9和PA10用作其他用途使用的时候,不受到PL2303的影响。 P5口是另外一个IO引出排阵,将PORTC和PORTD等的剩余IO口从这里引出。 3.2 JTAG设计作为国际标准测试协议,JTAG可以对芯片进行内部测试,标准的JTAG接口包括模式选择、时钟,以及数据的输入、输出线,即TMS、TCK、TDI、TDO。 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。 4 软件设计 软件设计部分,包括两大部分:初始化和功能性设计。4.1.1 时钟的初始化 对MCU而言,时钟是其驱动源,为了对STM32的系统时钟进行驱动,主要的时钟源有三种,即HSI和HSE振荡器时钟、PLL时钟。内部RC振荡器的频率为8MHz,产生HSI时钟信号,在其进行2分频后,可以用作PLL,HSE用户外部时钟、HSE外部陶瓷/晶体谐振器产生高速外部时钟信号,即HSE。此设计中使用的是PLL时钟,利用可配置分频器的PLL2时钟对HSE、HSI/2时钟进行倍频,之后将其输出。利用可配置的分频器,可以由HSE得到PLL2、PLL3。在完成倍频、预分频系数、时钟源的配置后对每个PLL进行使能,只有输入时钟源达到稳定后方能使用。PLL一旦被使能便不能再更改其参数。如果将PLL的输入时钟源更改,要关闭当前的时钟源,必须先通过对寄存器(RCC_CFGR)的PLLSRC位进行配置后选择新时钟源。PLL在就绪时时钟中断寄存器(RCC_CIR)会产生中断,代码如下:/系统时钟初始化函数  /pll:选择的倍频数,从2开始,最大值为16  void Stm32_Clock_Init(u8 PLL)    unsigned char temp=0;  MYRCC_DeInit(); /复位并配置向量表  RCC->CR|=0x; /外部高速时钟使能HSEON  while(!(RCC->CR>>17);/等待外部时钟就绪  RCC->CFGR=0X; /APB1/2=DIV2;AHB=DIV1;  PLL-=2;/抵消2个单位  RCC->CFGR|=PLL<<18; /设置PLL值2-16 RCC->CFGR|=1<<16; /PLLSRC ON  FLASH->ACR|=0x32; /FLASH 2个延时周期RCC->CR|=0x; /PLLON while(!(RCC->CR>>25);/等待PLL锁定RCC->CFGR|=0x;/PLL作为系统时钟while(temp!=0x02) /等待PLL作为系统时钟设置成功   temp=RCC->CFGR>>2; temp&=0x03; Stm32_Clock_Init函数中的变量只有一个,即PLL,主要用于时钟倍频数的配置,使用8MHz的晶振,将PLL值设定成9,此时STM32便以72M的速度运行。唯一变量PLL是用来配置时钟的倍频数的,当前所用的晶振为8Mhz,PLL的值设为9,那么将运行在72M的速度下。 另外,延时函数是经常使用的,为了实现延时,主要使用CM3内核处理器中的SysTick定时器,它是倒计数定时器,为24位,如果记到0,通过 RELOAD寄存器对定时初值进行自动重装,只要不清除状态寄存器的使能位、SysTick控制,此过程一直持续,借助SysTick实现延时,不占用中断、系统定时器。4.1.2 I/O初始化 每个GPI/O端口包括32位的GPIOx_ODR、GPIOx_IDR数据寄存器,GPIOx_CRH、GPIOx_CRL配置寄存器、GPIOx_LCKR锁定寄存器、GPIOx_BSRR置位/复位寄存器,16位的GPIOx_BRR复位寄存器。 通过软件可以将GPIO端口配置为开漏和推挽式复用功能、模拟输入、输入上拉/下拉、开漏输出等多个模式。能够对I/O端进行自由编程,不能利用字节、或半字节方式访问I/0端口寄存器,必须使用32位字。GPIOx_BRR、 GPIOx_BSRR寄存器可以独立访问GPIO寄存器的读/更改;如此一来,在读和更改访问期间生成的IRQ不存在任何危险。下图是I/O端口位的基本结构。#define BITBAND(addr, bitnum) (addr & 0xF)+0x+(addr &0xFFFFF)<<5)+(bitnum<<2)  #define MEM_ADDR(addr) *(volatile unsigned long *)(addr)  #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)  /IO口地址映射  #define GPIOA_ODR_Addr (GPIOA_BASE+12) /0xC  #define GPIOB_ODR_Addr (GPIOB_BASE+12) /0x40010C0C CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8位输出口。   RCC->APB2ENR|=1<<2;    /使能PORTA时钟        RCC->APB2ENR|=1<<5;    /使能PORT时钟 GPIOA->CRH&=0XFFFFFFF0;  GPIOA->CRH|=0X;/PA8 推挽输出      GPIOA->ODR|=1<<8;      /PA8  输出高  GPIOD->CRL&=0XFFFFF0FF;  GPIOD->CRL|=0X;/PD2  推挽输出  GPIOD->ODR|=1<<2;      /PD2   输出高  这里PA2与PD2分别对应LED0和LED1。此外,按键的初始化也就是对I/O进行设置,key0与key1分别对应PA13和PA15,都设置为上拉输入。  RCC->APB2ENR|=1<<2; /使能PORTA时钟  GPIOA->CRH&=0X000FFFFF; GPIOA->CRH|=0X; /PA13,15 设置为输入GPIOA->ODR=1<<13;/PA13上拉GPIOA->ODR=1<<15;/PA15上拉4.1.3 串口初始化 本次设计中蓝牙的收发都是通过串口传至STM32内,最基本的设置是串口,即设置波特率。只有串口时钟开启之后才能利用STM32的串口,对IO口的模式进行设置,对奇偶校验位、数据位长度、波特率等重要信息进行配置,按如下步骤开展。 使能串口时钟。串口是STM32的外设,通过外设时钟使能寄存器控制其时钟,APB2ENR寄存器第14位对应串口1,其余串口时钟的使能位均位于APB1ENR寄存器。 串口复位。如果外设表现异常,通过复位寄存器中相应的位可以对外设进行复位操作,之后对该外设进行重新设置,使其正常工作。所有的系统都是在对外设进行复位操作之后才对外设进行配置,APB2ENR寄存器第14位便是串口1的复位控制位。设置串口的波特率。每个串口都有波特率寄存器USART_BRR,彼此独立,在对该寄存器进行配置后便可以得到各种波特率。 串口控制。STM32中的串口对应USART_CR13控制寄存器,借助这3个寄存器对串口的很多功能进行设置。RXNE(读数据寄存器非空),如果将该位设为1,表示接收到了数据,并且可以将其读取出来。此时需要对USART_DR进行及时读取,以此对该位进行清零,在该位写入0,实现直接清除。TC(发送完成),如果对该位实现置位,那么表示已经发送完USART_DR内的所有数据,倘若此位设置的是中断,它便会产生中断。使用两种方式实现该位的清零:1)读、写USART_SR;2)向该位直接写入0,代码见下:void uart_init(u32 pclk2,u32 bound)      float temp;   u16 mantissa; u16 fraction;     temp=(float)(pclk2*)/(bound*16);/得到USARTDIV  mantissa=temp;   /得到整数部分  fraction=(temp-mantissa)*16; /得到小数部分      mantissa<<=4; mantissa+=fraction;  RCC->APB2ENR|=1<<2;   /使能PORTA口时钟  RCC->APB2ENR|=1<<14;  /使能串口时钟  GPIOA->CRH&=0XFFFFF00F;/IO状态设置  GPIOA->CRH|=0XB0; RCC->APB2RSTR|=1<<14;   /复位串口1  RCC->APB2RSTR&=(1<<14);/停止复位         /波特率设置 USART1->BRR=mantissa; /波特率设置  USART1->CR1|=0X200C;  /1位停止,无校验位 #if EN_USART1_RX   /使能接收中断 USART1->CR1|=1<<8;    /PE中断使能   USART1->CR1|=1<<5;    /接收缓冲区非空中断使能MY_NVIC_Init(3,3,USART1_IRQChannel,2);/组2,最低优先级  #endif 4.1.4 DMA初始化  要使用DMA通道,需配置以下信息: 1.  通过DMA_CPARx寄存器,对外设寄存器的地址进行设置,倘若请求外设数据传输,那么数据传输的目标或者源即为该地址。2.  通过DMA_CMARx寄存器,对数据存储器的地址进行设置,倘若请求外设传输数据,通过该地址读出传输的数据,或者将传输数据写入此地址。3.使用DMA_CNDTRx寄存器,对传输的数据量进行设置,传输完数据后,该数值递减。4. 通过DMA_CCRx寄存器PL1:0位对通道的优先级进行设置。5. 利用DMA_CNDTRx寄存器,对数据的循环模式、传输方向、传输中断、存储器和外设的增量模式和数据宽度等进行设置。6. 对DMA_CCRx寄存器的ENABLE位进行设置,使该通道启动。我使用的是串口2,对应着DMA的通道7,那么相应的外设寄存器的地址也就是&USART2->DR;而将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内核的所有资源,使用的中断数量共有76个,内核、可屏蔽中断分别为16个、60个,可编程的中断优先级共有16级,而串口2是可屏蔽中断,中断向量地址为0x0000_00D8。 4.2 模块功能设计 4.2.1 DS18B20温度模块初始化的顺序:首先把数据线置1,经过延时将其重新拉回0;再经过750us的延时,即“复位脉冲”,延时范围是480960us;接着再将数据线拉高,继续延时等待,如果成功实现初始化,1560ms内会产生低电平,经过DS18B20返回,按照此状态便可确定它的存在,为避免程序无线等待,需要执行超时判断;倘若CPU读到数据线上的低电平,再延时,以高电平为出发点计算延时的时间,最后拉高数据线。4.2.2 TFTLCD模块设计本次设计过程中,使用8080并口设计显示模块,主要包含CS、RD、WR,CS是TFTLCD的片选信号,WR和RE分别向TFTLCD写入和读取数据;此外还有RS、RST、D15:0,而RS是命令/数据标志,0表示读、1表示写,RS对TFTLCD进行硬复位,D15:0是双向数据线,为16位。 8080并口读/写过程如下:按照将要读取/写入的数据类型对DC进行设置,高表示数据,低表示命令,之后将片选拉低,对SSD1306进行选中,之后对数据进行读或者写操作,即将RD/WR置低,之后数据在RD上升沿被锁存在数据线(D7:0)上,最后数据在WR上升沿被写入SSD1306。4.2.3 ATK-HC05蓝牙模块ATK-HC05蓝牙串口模块所有功能都是通过AT指令集控制,进入AT状态有2种方法:1.上电同时或上电之前将KEY设置为VCC;模块在上电后进入AT指令状态。2.上电后,模块通过将KEY接VCC,使模块进入AT状态。5 结论给stm32上电后,温度正常显示。参考文献1 STMicroelectronics CorporationRM0008 Reference manualS20112 STMicroelectronics CorporationSTM32F103XX DatasheetJ2007 3 李宁基于MDK的STM32处理器应用开发M北京:北京航空航天大学出版社2008 4 刘军例说STM32M北京:北京航空航天大学出版社2011 5 刘鹏程基于ARM的温度测量系统J科技信息(学术研究)2008(18)77-78 6 樊昌信,曹丽娜通信原理M北京:国防工业出版社2006 Temperature Measurement System Based on STM32Liang Dong(College of Physics and Electronic Information ,Dezhou University,Dezhou,)Abstract Temperature is an important parameter in the daily life and agricultural production,the traditional thermometer has slow response and reading inconvenient shortcomings,the measurement accuracy is not high,in addition,usually requiring labor to observe the temperature,more cumbe