基于stm32的温度测量系统

更新时间:2024-06-08 07:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

武汉理工大学

毕业设计(论文)

基于STM32的温度测量系统

学院(系): 信息工程学院

专业班级: 学生姓名: 指导老师:

武汉理工大学毕业设计(论文)

学位论文原创性声明

本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包括任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。

作者签名:

年 月 日

学位论文版权使用授权书

本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士论文评选机构将本学位论文的全部或部分内容编入有关数据进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

本学位论文属于1、保密囗,在 年解密后适用本授权书

2、不保密囗 。

(请在以上相应方框内打“√”)

作者签名: 年 月 日

导师签名: 年 月 日

武汉理工大学毕业设计(论文)

目 录

摘 要 .............................................................................................................................................. I Abstract .......................................................................................................................................... II 1 绪论 ............................................................................................................................................. 1 2 系统分析 ..................................................................................................................................... 3

2.1 STM32芯片 ...................................................................................................................... 3 2.2 DS18B20 ........................................................................................................................... 5 2.3 TFTLCD ............................................................................................................................ 6 2.4 ATK-HC05蓝牙串口 ....................................................................................................... 7 3 硬件设计 ..................................................................................................................................... 8

3.1 MCU .................................................................................................................................. 8 3.2 JTAG设计 ........................................................................................................................ 9 3.3 TFTLCD电路设计 ........................................................................................................... 9 4 软件设计 ................................................................................................................................... 10

4.1 系统初始化 .................................................................................................................... 10

4.1.1 时钟的初始化 ..................................................................................................... 10 4.1.2 I/O初始化 ............................................................................................................ 11 4.1.3 串口初始化 ......................................................................................................... 13 4.1.4 DMA初始化 ........................................................................................................ 15 4.1.5 中断初始化 ......................................................................................................... 17 4.2 模块功能设计 ................................................................................................................ 18

4.2.1 DS18B20温度模块 ............................................................................................. 18 4.2.2 TFTLCD模块设计 .............................................................................................. 21 4.2.3 ATK-HC05蓝牙模块 .......................................................................................... 24

5 结果与总结 ............................................................................................................................... 26 参考文献 ....................................................................................................................................... 30 致谢 ............................................................................................................................................... 31

武汉理工大学毕业设计(论文)

摘 要

温度是日常生活和农业生产中的一个重要参数,传统的温度计有反应缓慢,测量精度不高的和读数不方便等缺点,此外,通常需要人工去观测温度,比较繁琐,因而采用电子技术的温度测量就显得很有意义了。

随着电子技术的发展,出现各种基于芯片的温度测量系统。本文设计了一个基于STM32的温度测量与无线传送的系统,温度采集使用数字化温度传感器DS18B20,无线传输使用ATK-HC05蓝牙模块。

STM32的内核基于cortex-m3,该内核拥有意法半导体独有的130nm专用低泄漏电流制造工艺和优化的节能架构,处于行业领先的节能性能,其高性能、低功耗、低成本的优势正符合本次设计的要求。温度芯片DS18B20采用单总线协议,仅占一个I/O口就能将环境温度转化成数字信号,具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点。无线的传输采用蓝牙技术,成本低,兼容的设备较多,可以降低传统工程的工程量,同时可以节省大量由排线、线路维修、检测上的一些不必要的障碍和消耗,同时,在实时运行阶段也可以明显体现它的便携性,高效性和节能性。

关键词:STM32;蓝牙;DS18B20;温度;TFTLCD

I

武汉理工大学毕业设计(论文)

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 cumbersome, and thus the temperature of the use of electronic technology it makes sense to measure it.

With the development of electronic technology, the emergence of various chip-based temperature measurement system. This paper presents an STM32-based temperature measurement and wireless transmission systems, the temperature acquisition using digital temperature sensor DS18B20, wireless transmission using ATK-HC05 Bluetooth module.

The STM32 kernel is based on cortex-m3, the kernel has a unique 130nm STMicroelectronics special low leakage current manufacturing processes and energy optimized architecture, industry-leading energy-saving performance, its high-performance, low-power, low-cost advantage is comply with the requirements of this design. DS18B20 temperature chip single bus protocol, only one I / O port will be able to ambient temperature into digital signals, with miniaturization, low power consumption, high performance, anti-interference ability, easy with microprocessors and other advantages. Wireless transmission using Bluetooth technology, low cost, more compatible devices, you can reduce the amount of traditional engineering projects, and can save a lot by a cable, line maintenance, testing on some of the unnecessary barriers and consumption, while, in real-time operational phase can also be evident in its portability, efficiency, and energy efficiency.

Keywords: STM32;Bluetooth; DS18B20; temperature;TFTLCD

II

武汉理工大学毕业设计(论文)

感器网络,从而为测量系统的构建引入全新概念。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~l2位的数字值读数方式。它工作在3—5.5 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.0~5.5V,在寄生电源方式下可由数据线供电。在使用中不需要任何外围元件,全部传感元件及转换电路继承在形如一只三极管的集成电路内。可编程分辨率为9~12位,对应的可分辨温度分别为0.5度,0.25度,0.125度,0.0625度,可实现高精度测温。

2.3 TFTLCD

TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。液晶先后避开了困难的发光问题,利用液晶作为光阀的优良特性把发光显示器件分解成两部分,即光源和对光源的控制。作为光源,无论从发光效率、全彩色,还是寿命,都已取得了辉煌的成果,而且还在不断深化之中。LCD发明以来,背光源在不断地进步,由单色到彩色,由厚到薄,由侧置荧光灯式到平板荧光灯式。在发光光源方面取得的最新成果都会为LCD提供新的背光源。随着光源科技的进步,会有更新的更好的光源出现并为LCD所应用。余下的就是对光源的控制,把半导体大规模集成电路的技术和工艺移植过来,研制成功了薄膜晶体管(TFT)生产工艺,实现了对液晶光阀的矩阵寻址控制,解决了液晶显示器的光阀和控制器的配合,从而使液晶显示的优势得以实现。

TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。

TFT实际上指的是薄膜晶体管,可以对屏幕上的各个独立的像素进行控制。显示屏由许多可以发出任意颜色的光线的像素组成,只要控制各个像素显示相应的颜色就能达到目的了。在TFT LCD中采用背光技术,为了能精确地控制每一个像素的颜色和亮度就需要

6

武汉理工大学毕业设计(论文)

在每一个像素之后安装一个类似百叶窗的开关,当“百叶窗”打开时光线可以透过来,而“百叶窗”关上后光线就无法透过来。技术上的实现就是利用了液晶的特性,在上下两层都有沟槽,上层的是纵向排列,下层的是横向排列,当不加电压时液晶处于自然状态,通过适当的结构设计,光线从上层通过夹层后会发生90度的扭曲,从而能在下层顺利通过,加上电压就会生成一个电场,使得液晶都垂直排列,这时光线就无法通过下层。

2.4 ATK-HC05蓝牙串口

ATK-HC05模块,是一款高性能主从一体蓝牙串口模块,可以同各种带蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP等智能终端配对,该模块支持非常宽的波特率范围:4800~1382400,并且模块兼容5V或3.3V单片机系统,使用非常灵活、方便。

在微微网建立之前,所有设备都处于就绪状态。在该状态下,未连接的设备每隔1.28s监听一次消息,设备一旦被唤醒,就在预先设定的32个跳频频率上监听信息。连接进程由主设备初始化。如果一个设备的地址已知,就采用页信息建立连接;如果地址未知,就采用紧随页信息的查询信息建立连接。在微微网中,无数据传输的设备转入节能工作状态。主设备可将从设备设置为保持方式,此时,只有内部定时器工作;从设备也可以要求转入保持方式。设备由保持方式转出后,可以立即恢复数据传输。连接几个微微网或管理低功耗器件时,常使用保持方式。监听方式和休眠方式是另外两种低功耗工作方式。蓝牙基带技术支持两种连接方式:面向连接(SCO)方式,主要用于语音传输;无连接(ACL)方式,主要用于分组数据传输。温度数据就通过无连接方式传输。

蓝牙采用的是跳频和时分多址技术。跳频就是用伪随机码序列进行移频键控,使载波频率不断跳变而扩展频谱的一种方法。在传统的定频通信系统中,发射机中的主振荡器的振荡频率是固定设置的,因而它的载波频率是固定的。为了得到载波频率是跳变的跳频信号,要求主振荡器的频率应能遵照控制指令而改变。这种产生跳频信号的装置叫跳频器。通常,跳频器是由频率合成器和跳频指令发生器构成的。如果将跳频器看作是主振荡器,则与传统的发信机没有区别。被传送的信息可以是模拟的或数字的信号形式,经过调制器的相应调制,便获得副载波频率固定的已调波信号,再与频率合成器输出的主载波频率信号进行混频,其输出的已调波信号的载波频率达到射频通带的要求,经过高通滤波器后馈至天线发射出去。这就是定频信号的发送过程。而时分多址就是把时间分割成互不重叠的帧,再将帧分割成互不重叠的时隙(信道)与用户具有一一对应关系,依据时隙区分来自不同地址的用户信号,从而完成的多址连接。

7

武汉理工大学毕业设计(论文)

3 硬件设计

3.1 MCU

MCU选用的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原理图

8

武汉理工大学毕业设计(论文)

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_D[17:1];对应PB[15:0]

图3.3 tftlcd原理图

9

武汉理工大学毕业设计(论文)

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->CR>>17));//等待外部时钟就绪

RCC->CFGR=0X00000400; //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|=0x01000000; //PLLON while(!(RCC->CR>>25));//等待PLL锁定 RCC->CFGR|=0x00000002;//PLL作为系统时钟 while(temp!=0x02) //等待PLL作为系统时钟设置成功 {

10

武汉理工大学毕业设计(论文)

temp=RCC->CFGR>>2; 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端口结构

11

武汉理工大学毕业设计(论文)

首先为了方便函数的编写,进行IO口的地址映射,如下(列举部分): #define

BITBAND(addr,

bitnum)

((addr

&

0xF0000000)+0x2000000+((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) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C

在使用IO口前需要使能相应端口的时钟,然后配置它的模式。与配置相关的两个寄存器位CRL,CRH,其结构如下所示

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16CNF7[1:0] MODE7[1:0] CNF6[1:0] MODE6[1:0] CNF5[1:0] MODE5[1:0] CNF4[1:0] MODE4[1:0] rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0CNF3[1:0] MODE3[1:0] CNF2[1:0] MODE2[1:0] CNF1[1:0] MODE1[1:0] CNF0[1:0] MODE0[1:0] rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw位31:3027:2623:2219:1815:1411:107:63:2CNFy[1:0]:端口x配置位在输入模式下(MODE[1:0]=00):00:模拟输入模式01:浮空输入模式10:上拉/下拉输入模式11:保留在输出模式下(MODE[1:0]>00):00:通用推挽输出模式01:通用开漏输出模式10:复用功能推挽输出模式11:复用功能开漏输出模式位29:2825:2421:2017:1613:129:85:41:0MODEy[1:0];端口x的模式位00:输入模式01:输出模式,最大速度10MHZ10:输出模式,最大速度2MHZ11:输出模式,最大速度50MHZ

图4.2 CRL/CRH寄存器结构

该寄存器的复位值为0X4444 4444,从上图可以看到,复位值其实就是配置端口为浮空输入模式。从上图还可以得出:STM32的CRL控制着每个IO端口(A~G)的低8位的模式。每个IO端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。这里我们可

12

武汉理工大学毕业设计(论文)

以记住几个常用的配置,比如0X0表示模拟输入模式(ADC用)、0X3表示推挽输出模式(做输出口用,50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用输出(使用IO口的第二功能,50M速率)。

CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8位输出口。

RCC->APB2ENR|=1<<2; //使能PORTA时钟 RCC->APB2ENR|=1<<5; //使能PORTD时钟 GPIOA->CRH&=0XFFFFFFF0;

GPIOA->CRH|=0X00000003;//PA8 推挽输出 GPIOD->CRL&=0XFFFFF0FF;

GPIOD->CRL|=0X00000300;//PD2 推挽输出 GPIOD->ODR|=1<<2; //PD2 输出高

GPIOA->ODR|=1<<8; //PA8 输出高

这里PA2与PD2分别对应LED0和LED1。此外,按键的初始化也就是对I/O进行设置,key0与key1分别对应PA13和PA15,都设置为上拉输入。

RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRH&=0X000FFFFF;

GPIOA->CRH|=0X80800000; //PA13,15 设置为输入 GPIOA->ODR|=1<<13; //PA13上拉 GPIOA->ODR|=1<<15; //PA15上拉

4.1.3 串口初始化

本次设计中蓝牙的收发都是通过串口传至STM32内,串口最基本的设置,就是波特率的设置。STM32的串口使用需要开启了串口时钟,并设置相应IO口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息。具体步骤如下。

串口时钟使能。串口作为STM32的一个外设,其时钟由外设时钟使能寄存器控制,其中串口1是在APB2ENR寄存器的第14位。除了串口1的时钟使能在APB2ENR寄存器,其他串口的时钟使能位都在APB1ENR寄存器。

串口复位。当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。串口1的复位是通过配置APB2RSTR寄存器的第14位来实现的。

串口波特率设置。每个串口都有一个自己独立的波特率寄存器USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的。

串口控制。STM32的每个串口都有3个控制寄存器USART_CR1~3,串口的很多配置都是通过这3个寄存器来设置的。

13

武汉理工大学毕业设计(论文)

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16保留15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0保留 UE M WAKE PCE PS PEIE TXEIE TXIE RXNEIE IDLEID TE RE RWU SBK

图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。当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内。该寄存器的各位描述如下图所示:

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16保留15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 保留 DR[8:0] rw rw rw rw rw rw rw rw rw 图4.4 USART_DR寄存器各位描述

串口状态。串口的状态可以通过状态寄存器USART_SR读取。USART_SR的各位描述如下图所示:

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16保留15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 保留 CTS LBD TXE TC RXNE IDLE ORE NE FE PE

图4.5 USART_SR寄存器各位描述

14

武汉理工大学毕业设计(论文)

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);//得到USARTDIV mantissa=temp;

//得到整数部分

fraction=(temp-mantissa)*16; //得到小数部分 mantissa+=fraction;

RCC->APB2ENR|=1<<2; //使能PORTA口时钟 RCC->APB2ENR|=1<<14; //使能串口时钟 GPIOA->CRH&=0XFFFFF00F;//IO状态设置 GPIOA->CRH|=0X000008B0;

RCC->APB2RSTR|=1<<14; //复位串口1 RCC->APB2RSTR&=~(1<<14);//停止复位 //波特率设置

USART1->CR1|=0X200C; //1位停止,无校验位

//使能接收中断

USART1->CR1|=1<<8; //PE中断使能

USART1->CR1|=1<<5; //接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级

mantissa<<=4;

USART1->BRR=mantissa; //波特率设置 #if EN_USART1_RX

#endif

4.1.4 DMA初始化

DMA全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有像中断处理方式那样保留现场和恢复现场的过程,而是通过硬件为

15

武汉理工大学毕业设计(论文)

RAM与I/O设备开辟一条直接传送数据的通路。本次设计在发送蓝牙数据时就采用了DMA方式。

STM32RBT6有一个DMA控制器,DMA有7个通道,每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。此外,还有一个仲裁器来协调各个DMA请求的优先权。在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。如果有更多的请求时,外设可以启动下一个周期。总体来说,每次DMA传送由以下操作组成:从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。然后存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址同取数据时一样都是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。最后执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。

要使用DMA通道,需配置以下信息:

1. 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标。

2. 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址。

3. 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。

4. 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。

5. 在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。

6. 设置DMA_CCRx寄存器的ENABLE位,启动该通道。

我使用的是串口2,对应着DMA的通道7,那么相应的外设寄存器的地址也就是&USART2->DR;而将USART2_TX_BUF这个数组作为数据存储器,就向DMA_CMARx中写入&USART2_TX_BUF;要传输的数据量通过strlen函数来测量后传输给DMA_CNDTR;因为只需开启一个通道,所以优先级可以随意设置;数据传输方向是从存储器读取;当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行,而传输过的温度值,不希望其重复传输,因而关闭循环模式;外设地址不变,存储器选择增量模式,它们的数据宽度都为8位,是为了适应蓝牙的数据传输。此外,传输一半和传输完成都无需产生中断,每传一次数据前都会关闭DMA通道,再重新开启通道,

16

武汉理工大学毕业设计(论文)

4.1.5 中断初始化

传输数据到串口通过DMA方式,从串口接收数据时需要检测,这时就采用中断方式。 CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。其中串口2属于可屏蔽中断,中断向量地址为0x0000_00D8。

对于如此多的中断,优先级的分配也就显得很有意义,IPR——Interrupt Priority Registers,就是控制中断优先级控制的寄存器组,IPR寄存器组由15个32bit的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示15*4=60个可屏蔽中断。刚好和STM32的可屏蔽中断数相等。IPR[0]的[31~24],[23~16],[15~8],[7~0]分别对应中中断3~0,依次类推,总共对应60个外部中断。而每个可屏蔽中断占用的8bit并没有全部使用,而是 只用了高4位。这4位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据SCB->AIRCR中中断分组的设置来决定。

STM32将中断分为5个组,组0~4。该分组的设置是由SCB->AIRCR寄存器的bit10~8来定义的。具体的分配关系如下表所示:

表4.1 AIRCR中断分组设置表

组 0 1 2 3 4

AIRCR[10:8]

111 110 101 100 11

Bit[7:4]分配情况

0:4 1:3 2:2 3:1 4:0

分配结果

0位抢占优先级,4位响应优先级 1位抢占优先级,3位响应优先级 2位抢占优先级,2位响应优先级 3位抢占优先级,1位响应优先级 4位抢占优先级,0位响应优先级

所有的60个中断,每个中断的中断优先寄存器的高四位中的最高3位是抢占优先级,低1位是响应优先级。每个中断,可以设置抢占优先级为0~7,响应优先级为1或0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。 如果两个中断的抢占优先级和响应优先级都是一样的话,则中断先发生就先执行。高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

STM32的5个分组是通过设置SCB->AIRCR的BIT[10:8]来实现的,SCB->AIRCR的修改需要通过在高16位写入0X05FA这个密钥才能修改的,故在设置AIRCR之前,应该把密钥加入到要写入的内容的高16位,以保证能正常的写入AIRCR。在修改AIRCR的时候,采用读->改->写的步骤,来实现不改变AIRCR原来的其他设置。

17

武汉理工大学毕业设计(论文)

中断的框图如下所示:

图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半导体公司推出的一种的“一线总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接

18

武汉理工大学毕业设计(论文)

口简单的数字化温度传感器。一线总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念,测量温度范围为-55~+125℃ ,精度为±0.5℃。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~l2位的数字值读数方式。它工作在3—5.5 V的电压范围,采用多种封装形式,从而使系统设计灵活、方便,设定分辨率及用户设定的报警温度存储在EEPROM中,掉电后依然保存。其内部结构为:

图4.7 DS18B20内部结构

DS18B20只需要一个I/O口,既可传输时钟,又可传输数据,而且数据传输是双向的。高速暂存器RAM和可电擦除E2PROM与温度转换和读取操作密切相关。高速暂存器RAM由9个字节的存储器组成。第0~1个字节是温度的显示位;第2和第3个字节是复制的TH和TL,同时第2和第3个字节的数字可以更新;第4个字节是配置寄存器,同时第4个字节的数字可以更新;第5,6,7三个字节是保留的。可电擦除E2PROM包括温度触发器TH和TL和一个配置寄存器。

温度数据存储在高速RAM的第0和第1字节,共16位,DS18B20的默认配置为12位,其中最高位为符号位,即温度值有11位,单片机读取数据时,一次会读2字节共16位,之后将低11位的二进制数转化为十进制数后再乘以0.0625便为所测得温度值。剩余的4位会和符号位同时变化,为1时,表示读取的温度为负值,且测到的数值需要取反加1再乘以0.0625才可得到实际温度值;为0时,读取的温度为正值,只要将测得的数值乘以0.0625即可得到温度值。

初始化的顺序:先将数据线置高电平1,延时后在将其拉到0;然后延时750us,即图中的“复位脉冲”,范围应在480~960us;之后将数据线拉到高电平1,开始延时等待,如果初始化成功则在15~60ms内产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在,同时为了防止程序进入无限的等待,要进行超时判断;若cpu读到数据线上的低电平0后,还要进行延时,其延时的时间从发出高电平算起;最后将数据线再次拉到高电平1后结束。如图所示:

19

武汉理工大学毕业设计(论文)

控制器Tx “复位脉冲”最小值480us最大值960us控制器RX最小值480us等待15-60usDS18B20 Tx应答脉冲60-240us

图4.8 DS18B20初始化时序图

写数据的时序为:数据线先置低电平0;延时15us,然后按低位到高位的顺序发送一位数据;再延时45us;将数据线拉到高电平1;接着重复上述操作,直到发送完整个字节,最后将数据线拉高到1。时序图如下:

控制器写“0”时隙控制器写“1”时隙 DS18B20 采样MIN TYP MAX15us15us30us>1us DS18B20 采样MIN TYP MAX15us20us15us

图4.9 写数据时序图

相应的就有读数据的时序,读数据也是一位一位的读,具体为:将数据线拉高到1,延时2us;然后拉低到0,延时6us;再拉高到1,延时4us;这时就可以得到一个状态位了,之后再延时30us;重复这些步骤就能读取完一个字节了。时序图为:

20

武汉理工大学毕业设计(论文)

5 结果与总结

给stm32上电后,温度正常显示,如图所示:

图5.1 lcd温度显示

第一行“ATK-HC05 Standby”表示检测到蓝牙模块,否则提示错误,第二行的STA显示的是连接状态,此时为“Disconnect”,当蓝牙模块连接时,则会变成“connected”。如图所示:

图5.2 连接成功提示

26

武汉理工大学毕业设计(论文)

然后打开手机的蓝牙串口通信软件,就自动开始搜索蓝牙设备,第二次连接的时候则会提示是否继续上次的连接。

图5.3 蓝牙串口通信软件

图5.4 连接成功

这里选择的是键盘操作模式,此模式下,可以实现双向通信。

27

武汉理工大学毕业设计(论文)

图5.5 手机接收温度

这里我设置了两个按键,如图5.5,“LED1亮”键会发送+led1 on的信息,通过蓝牙发送给stm32后,则会使液晶的背光点亮,而旁边的红色灯闪烁是表示stm32工作正常的,拍结果照片时有亮有灭。“LED1灭”则会发送+led1 off,使液晶背光熄灭

图5.6 控制stm32液晶亮灭

28

武汉理工大学毕业设计(论文)

上两图在同一时间段拍摄,由于液晶亮的时候隔的太近,影响了光线,但还是能很明显能看出液晶的亮灭,结果符合设计要求,顺利的控制液晶的亮灭,有较好的实时性和稳定性。采用蓝牙模块,通信距离有很大限制,但可以通过服务器进行远距离传输,同时它的优点也是很明显的,低功耗,方便使用,通讯安全性好,使用蓝牙就能实现与移动终端的连接,很方便的进行实时控制。使用tftlcd主要是考虑到系统的拓展性,能显示更详细的信息,也使得人机交互界面做的更人性化。

刚开始做毕设时,对STM32并没有什么了解,好在有单片机和微机原理的基础,看起资料来不是很费劲。本次设计使用到了STM32的I/O、串口、DMA、中断、通用定时器TIME4等资源,而它们的寄存器往往都是很繁杂的,以I/O为例,与之相关的寄存器有:GPIOx_CRL、GPIOx_CRH、IDR、ODR、BSRR、BRR、LCKR,面对如此多的寄存器,最大的感触就是要沉下心来看技术手册,找中关键的寄存器,找中相关的位,才能事半功倍。然后就是要细心,例如在配置优先级分组时要特别注意统一分组,组号要一样,否则前面设置的优先级会因为后面的分组不一致发生改变,而产生意料之外的结果;还有抢占优先级与响应优先级之间的区别,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的,而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断,所以配置前得分清是否需要打断;用到的函数都要在头文件里面声明,不然会编译出错。

最重要的还是思路要清晰,知道要做什么,该如何做,能理清寄存器之间、外设与STM32之间的联系。以DMA为例,它不通过CPU,直接建立了外设与存储器之间的连接,所以得先给出外设与存储器的地址;既然是传输数据,就需给出数据量的大小和一次读取的数据宽度;配置好了这些,数据的基本信息就配置好了,然后就思考它们如何传输,在存储器内读取一个字节,应该增还是减地址,然后查找数据手册,找到DMA的配置寄存器DMA_CCRx,位7MINC对应存储器地址增量模式,位6对应外设地址增量模式,串口的地址是不变的相应的外设地址就设置为不增,而数据一般都传输多位,所以将位7设置成存储器地址增量模式。DMA有7个通道,有仲裁器来判断启动哪个,自然就要设置优先级。最后使能DMA,就开启了传输。整个过程看起来繁复,但理清了思路之后,就像用线串了起来,问题都迎刃而解。

看到最终的成果,感觉这几个月来的努力没有白费。在这个过程中,不仅仅是学习了STM32,了解数字温度计DS18B20和蓝牙通信,更为重要的是锻炼了自己分析问题解决问题的能力。

本次设计也存在很多不足之处,未能添加反馈调节温度的模块,只实现了温度测量与显示,及远程控制显示的系统。刚开始设计时急于求成,代码很容易就出错了,没理清头绪时,往往找了很久,好不容易把错误改正,编译不出错,实现的结果又和设想的偏差很大,后来才认识到踏实看技术手册,弄清寄存器作用,理清设计思路的重要性,这样出错也很容易去纠正。

29

武汉理工大学毕业设计(论文)

参考文献

[1] STMicroelectronics Corporation.RM0008 Reference manual[S].2011. [2] STMicroelectronics Corporation.STM32F103XX Datasheet[J].2007.

[3] 李宁.基于MDK的STM32处理器应用开发[M].北京:北京航空航天大学出版社.2008 [4] 刘军.例说STM32[M].北京:北京航空航天大学出版社.2011.

[5] 刘鹏程.基于ARM的温度测量系统[J].科技信息(学术研究).2008(18).77-78. [6] 樊昌信,曹丽娜.通信原理[M].北京:国防工业出版社.2006.

[7] 曾凡鑫.无线通信中的序列设计原理[M].北京:国防工业出版社.2007.

[8] 喻金钱.短距离无线通信详解:基于单片机控制[M].北京:航空航天大学出版社.2009. [9] 潘焱.无线通信系统与技术[M].北京:人民邮电出版社[M].2011.

[10] STMicroelectronics Corporation.The Definitive Guide to the ARM Cortex-M3[J].2010.

30

武汉理工大学毕业设计(论文)

致谢

大学本科的时光即将结束,回顾四年来的学习经历,面对现在的收获,我感到无限欣慰。

首先向指导老师王原丽老师表示衷心的感谢并致以崇高的敬意。王老师给予我很多重要的指导,对学术研究的严谨值得我好好学习,还要感谢老师为学生营造的浓郁学术氛围,以及学习、生活上的无私帮助!

同时向热心帮助过我的所有老师和同学表示由衷的感谢!在论文工作中,一直得到老师和学长的悉心指导,使我的论文可以又快又好的完成,值此论文完成之际,谨向各位老师和同学致以最崇高的谢意!

最后,衷心地感谢在百忙之中评阅论文和参加答辩的各位专家、教授。

31

武汉理工大学毕业设计(论文)

致谢

大学本科的时光即将结束,回顾四年来的学习经历,面对现在的收获,我感到无限欣慰。

首先向指导老师王原丽老师表示衷心的感谢并致以崇高的敬意。王老师给予我很多重要的指导,对学术研究的严谨值得我好好学习,还要感谢老师为学生营造的浓郁学术氛围,以及学习、生活上的无私帮助!

同时向热心帮助过我的所有老师和同学表示由衷的感谢!在论文工作中,一直得到老师和学长的悉心指导,使我的论文可以又快又好的完成,值此论文完成之际,谨向各位老师和同学致以最崇高的谢意!

最后,衷心地感谢在百忙之中评阅论文和参加答辩的各位专家、教授。

31

本文来源:https://www.bwwdw.com/article/57t6.html

Top