蓝牙40-BLE基础裸机程序开发课件.ppt

上传人(卖家):晟晟文业 文档编号:4926479 上传时间:2023-01-26 格式:PPT 页数:71 大小:1.74MB
下载 相关 举报
蓝牙40-BLE基础裸机程序开发课件.ppt_第1页
第1页 / 共71页
蓝牙40-BLE基础裸机程序开发课件.ppt_第2页
第2页 / 共71页
蓝牙40-BLE基础裸机程序开发课件.ppt_第3页
第3页 / 共71页
蓝牙40-BLE基础裸机程序开发课件.ppt_第4页
第4页 / 共71页
蓝牙40-BLE基础裸机程序开发课件.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

1、通用 I/O口基础程序开发定时器/计数器基础程序开发UART串口基础程序开发看门狗与低功耗基础程序开发A/D转换基础程序开发知识目标知识目标(1)掌握CC2540单片机内部寄存器的配置方法;(2)了解CC2540单片机内部硬件模块的工作原理;(3)掌握基础裸机程序的开发方法。技能目标技能目标(1)能测试CC2540单片机内部各模块的功能;(2)能在蓝牙开发板上进行基础实验的调试。项目分析项目分析 本项目将开始CC2540蓝牙4.0单片机裸机驱动程序的设计,裸机程序是没有操作系统支持,芯片带电后就可以开始执行的程序。与单片机程序一样,所有的功能、驱动代码都要自己编写,裸机程序是学习蓝牙4.0 B

2、LE协议栈开发的基础,协议栈通过调用相关的裸机驱动实现一定的功能。本项目主要介绍在CC2540蓝牙单片机上的I/O口、定时器、串口、看门狗和AD采集等五个常用模块的基本原理和应用,并分析了各模块的工作过程。本项目还将着重阐述五个模块中各任务的程序调试方法,使读者能够更好地了解CC2540蓝牙4.0单片机最小系统的基础程序开发。任务一 流水灯的设计任务描述任务描述 本任务要求利用延时程序与循环程序,对LED1、LED2和LED3三个小灯实现流水灯效果,时间间隔大约为0.5 s。知识链接知识链接 三个小灯实现流水灯的设计任务中涉及四个寄存器,即P1、P1DIR、P1SEL和P1INP。其中,P1D

3、IR是P1口各个管脚的方向控制寄存器,P1SEL是P1口各个管脚的功能选择寄存器,P1INP用来设置P1口各个管脚的输入模式。P1寄存器如表3-1所示,P1寄存器包含8个位,由P1_7P1_0组成。当P1口对应关键设置为I/O口时,该寄存器为相应端口的数据寄存器,其中每位对应各自的管脚,可以位寻址。P1DIR寄存器如表3-2所示,P1DIR是控制P1口管脚的方向控制寄存器。当对应位为1时,代表对应管脚为输出方向;若为0,则代表对应管脚为输入方向。P1SEL寄存器为P1口管脚的功能选择寄存器,用于选择P1对应端口是GPIO功能还是外设功能。P1SEL寄存器如表3-3所示。P1INP用于设置P1口

4、各个管脚的输入模式,当对应管脚为1时,I/O口输入时为三态输入模式;当对应管脚为0时,对应的端口输入时为上拉/下拉模式,复位值为0。任务实施任务实施 在本任务中,实现的流水灯效果即按LED1LED2LED3顺序亮,并不断循环(这里所说的LEDx亮是只有LEDx亮,x为1,2,3)。LED1、LED2和LED3 三个灯分别由P10、P11和P14控制,而且根据发光二极管的工作原理,对应I/O口为高电平时小灯亮。要想实现按LED1LED2LED3顺序亮,可以通过先点亮LED1,延时一会儿,关闭LED1的同时点亮LED2,延时一会儿,关闭LED2的同时点亮LED3,延时一会儿,关闭LED3,如此循环

5、,这就完成了LED流水灯的设计。图图3-1 LED3-1 LED硬件原理图硬件原理图 按项目二IAR的操作说明建立工程,注意在编程过程中程序中的所有符号必须在英文状态下输入。相关代码如程序清单3.1 所示。程序清单3.1 /*程序开头的注释,初学者必须掌握,跟程序一样重要 Description:流水灯1;蓝牙开发板上的三个小灯实现流水灯的功能 Date:2016.03.03;作者:,修改时间:无 修改说明:无 Description:LED1-P10、LED2-P11、LED3-P14,对应I/O为高小灯亮 Function List:任务二 按键控制流水灯任务描述任务描述 本任务要求利用按

6、键控制流水灯的方向,当按下按键S1时,小灯由LED1LED3方向点亮;当按下按键S2时,小灯改变方向,由LED3LED1方向点亮。时间间隔大约为 0.5 s。知识链接知识链接 根据硬件电路分析,本任务中的按键平时是高电平,按下后是低电平,即按键低电平有效。按键查询比较常用的有三种方式。第一种是最简单的,即直接一个判断语句。如果检测到按键按下,即检测到按键值为0,就执行相关操作。这种方式有个弊端,即若按着按键不松或按的时间稍微长一点,则系统会认为按了好多次。当然在按键的程序中一般都会加入去抖动延时,但这并不能完全解决上述问题。第二种方法是在按键扫描程序中加入一个检测程序,检测到按键松开,然后执行

7、后面的操作。这是大多数的按键扫描程序,在一般场合也比较好用。这个程序比第一种方法好一些。但是,判断按键释放的方法的效率较低,如果用户一直按下此按键,那么程序在此卡住,即使有中断会打断,但中断处理完,还得回来等待释放,并且其他按键也将被屏蔽。第三种方法就是要避免上面两种方法的弊端,在此之前,应了解一个完整的按键在按下的过程中会发生什么。在未按下按键、按下按键中及按键释放过程中,按键输入脚电平变化顺序是高低高。好的按键扫描程序算法不是判断按键是否被按下,而是判断按键电平变化的顺序是否是高低高,其他按键电平变化顺序都是非法的,这也是按键扫描的基本原理。同一个按键长按、短按的判断及组合按键的判断都是同

8、一原理,只是在判断长按、短按时要加入定时器来实现,而组合按键也是通过设定标志量来达到组合按键的要求的。本任务在实施前将给出三种按键的程序。首先给出的是第一种方法,也是最简单、易懂的查询方法。其按键硬件原理图如图3-2 所示。通过原理图可以得出本任务涉及的两个按键S1、S2对应管脚分别为P0_0、P0_1,在定义时需要定义对应的管脚为输入模式。在下面给出的三种方法的按键程序中,按键定义与I/O口定义是相同的,延时程序也可直接调用上一个任务中的。图图3-2 3-2 查询方法一的按键硬件原理图查询方法一的按键硬件原理图 按键查询方法一相关代码如程序清单3.2所示。程序清单3.2#define key

9、_s1 P0_0/KEY1为P0.0口控制#define key_s2 P0_1/KEY2为P0.1口控制 P1DIR=0 xff;/P1口全部设置为输出 P0DIR=0 xfc;/P1口P1_0与P1_1设置为输入,P0SEL默认为0 if(key_s1=0)delay(10);/加入延时去抖动 /加入相关操作,如“LED1=1;”按键查询方法二相关代码如程序清单3.3所示。程序清单3.3 if(key_s1=0)delay(10);/加入延时去抖动 /加入相关操作,如“LED1=1;”if(key_s1=0)while(!key_s1);/松手检测 /加入相关操作,如“LED1=1;”按按

10、键查询方法三相关代码如程序清单3.4所示。程序清单3.4 if(key_s1=1)Key_s1_flag1=1;/检测按键在没有按下时的高电平状态 if(key_s1=0)&(Key_s1_flag1=1)/检测按键在按下时电平由高变低的情况 delay(10);/加入延时去抖动 Key_s1_flag1=0;Key_s1_flag2=1;任务实施任务实施 本任务要求,当按下按键S1时,小灯由LED1LED3方向点亮,当按下按键S2时,小灯改变方向,由LED3LED1方向点亮,时间间隔大约为0.5 s。其相关代码如程序清单3.5所示。程序清单3.5#include/调入头文件#define u

11、char unsigned char#define led1 P1_0#define led2 P1_1#define led3 P1_4任务一 定时器查询方式实现流水灯的设计任务描述任务描述 本任务要求利用CC2540定时器实现时间间隔,对LED1、LED2和LED3三个小灯实现流水灯功能,时间间隔为1 s。知识链接知识链接 在上一模块的任务中,时间间隔都是采用delay延时程序实现的,这种延时在调试中使用很多,但要想把延时时间准确一点儿,需要测试计算,即使测试过的延时也不一定准确,因为在运行过程中可能会有中断或受其他干扰影响,很难做到时间的准确定位。在程序运行过程中,有时需要精确地清楚每个

12、模块运行的时间,有时需要清楚主程序运行一个周期的时间,所以对各函数的调用和延时方面提出了严格的要求,如精准测量及后面项目中用到的PWM波的调制等。知识链接知识链接 本任务将利用定时器T1(16位)实现LED流水灯的设计。用定时器控制流水灯的时间间隔,间隔1 s轮流点亮各盏灯。定时器的本质是单片机内部的一个时钟,来自系统主时钟的分频,这个时钟会自动计数,当计数器溢出时会产生一个中断请求并置位溢出标志位。使用定时器T1需要配置T1CTL、T1STAT和IRCON三个寄存器。任务实施任务实施 本任务要求利用定时器查询方式实现1 s间隔,并用蓝牙开发板上三个小灯实现流水灯的功能。其相关代码如程序清单3

13、.6所示。程序清单3.6 /*Description:流水灯1;利用定时器T1对蓝牙开发板上的三个小灯实现流水灯的功能 Date:2016.03.05;作者:,修改时间:无,修改说明:无 Description:任务二 定时器中断方式实现小灯闪烁任务描述任务描述 本任务要求利用定时器T1中断实现精确定时,并在定时器中断服务函数中实现计数,要求每秒钟LED1变化一次,60 s后LED2亮。知识链接知识链接 定时器配置好后,启动定时器就开始自动计数,若溢出则会产生一个中断。在中断允许的情况下,若中断标志被置1,则会发出中断请求,进入相应中断程序,因为中断要求相应速度快,所以要在中断处理程序中尽量减

14、少比较烦琐的操作,比较好的方法是设定对应标志量,在外面对标志量进行检测,如果标志量置位,就说明已经发生了中断,可以执行相关的操作,这样不影响中断相应的速度。当中断发生时,无论该中断使能或禁止,CPU 都会在中断标志寄存器中设置中断标志位。如果当设置中断标志时中断使能,那么在下一个指令周期由硬件强行产生一个LCALL 到对应的向量地址,运行中断服务程序。每个中断都有自己对应的SFR寄存器中的中断请求标志,相应的标志位请求的每个中断可以分别使能或禁止。中断标志要用软件清除,涉及IEN0(0 xA8)和IEN1(0 xB8)两个寄存器。寄存器IEN0的详细说明如表3-6所示。任务实施任务实施 本任务

15、要求利用定时器T1实现定时,并在定时器中断函数中实现计数,要求每秒钟LED1变化一次,60 s后LED2亮。其相关代码如程序清单3.7所示。程序清单3.7#include#define led1 P1_0#define led2 P1_1 unsigned char T1num;/记录进入定时器T1中断的次数 /*I/O初始化*任务一 UART串口发送功能驱动的实现任务描述任务描述 本任务要求利用CC2540串口通信功能向串口调试助手发送指定字符串“”,并在串口调试助手上显示。知识链接知识链接 UART是通用异步收发器(异步串行通信口)的英文缩写,包括了RS232、RS499、RS423、RS

16、422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。RS232、RS499、RS423、RS422和RS485等是对应各种异步串行通信口的接口标准和总线标准,它们规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容。相关概念还将在协议栈串口编程中做详细介绍,这里只需要掌握相关串口寄存器的使用即可。本任务将利用CC2540串口通信功能向串口发送固定字符串。UART0对应的外部设备I/O引脚为RX-P0_2和TX-P0_3。配置串口的步骤为:首先配置对应的I/O口映射,使用外部设备功能,然后配置相应串口的控制寄存器和状态寄存器,最后配置串口工作的波特率。本

17、任务涉及的寄存器有U0CSR、U0GCR、U0BAUD及U0DBUF接收/传送数据缓冲区。U0CSR、U0GCR和U0BAUD寄存器的说明分别如表3-8表3-10所示。(1)UART裸机发送驱动原理。当UART收/发数据缓冲寄存器UxBUF写入数据时,该字节发送到输出引脚TXDx,然后按位发送出去。UxBUF寄存器是双缓冲的。当字节发送开始时,UxCSR.ACTIVE位变成高电平,而当字节传送结束时变为低电平。传送结束时,UxCSR.TX_BYTE位为1。当收/发数据缓冲寄存器就绪,准备接受新的发送数据时,就产生了一个中断请求。该中断在传送开始之后立刻发生,因此,当字节正在发送时,新的字节能够

18、装入数据缓冲寄存器。(2)UART裸机接收驱动原理。当UxCSR.RE位写入1时,数据接收就开始了。UART会在输入引脚RXD中寻找有效起始位,并置UxCSR.ACTIVE位为1。当检测出有效起始位时,收到的字节就传入接收寄存器,UxCSR.RX_BYTE位为1。该操作完成产生接收中断。同时,UxCSR.ACTIVE位为0。寄存器UxBUF提供接收到的数据字节。当UxBUF读出时,UxCSR.RX_BYTE位由硬件清零。在串口通信中波特率的配置比较重要,其计算公式如下。其中,f为系统时钟。由公式计算配置比较麻烦,这里提供专门针对32 MHz系统时钟设置的表格。本任务要求通信波特率设置为115

19、200 b/s,因此可以直接查表3-11。将蓝牙开发板接上USB数据线,CC2540就通过PL2303芯片与虚拟COM口直接通信,但在使用之前需要安装PL2303USB转串口驱动,这在项目二中已经做过介绍。连接好之后,打开设备管理器就会看到连接的串口号,如图3-3所示。任务实施任务实施图图2-17 2-17 底板底板PCBPCB 连接下载器开始调试程序,其相关代码如程序清单3.8所示。程序清单3.8#include#include#define uint unsigned int#define uchar unsigned char /-定义LED的端口-#define LED1 P1_0#d

20、efine LED2 P1_1char Txdata15;/存放“n”共15个字符 /-延时函数-下载运行程序并打开串口调试助手,选择对应的COM4口,选择波特率为115 200 b/s,如图3-4所示,可以看到上位机串口调试助手不断接收到字符“”。图图3-4 3-4 串口调试助手接收到字符串口调试助手接收到字符任务二 UART发送字符命令控制LED任务描述任务描述 本任务要求利用串口调试助手发送指定字符串“L1#”来控制蓝牙开发板上LED1的亮灭,发送指定字符串“L2#”来控制蓝牙开发板上LED2的亮灭,达到通过串口调试助手上位机控制蓝牙开发板下位机的功能。知识链接知识链接 本任务在上一任务

21、的基础上增加了一个接收函数,在串口调试助手中发送“L1#”可以改变LED1的状态,发送“L2#”可以改变LED2的状态。设计的关键在于接收函数能够接收到数据并进行判断:若是三个字符并以L开头、以#结尾,则再判断中间字符。若中间字符为1,则改变LED1的状态;若中间字符为2,则改变LED2的状态。任务实施任务实施 打开串口调试助手,在字符发送模式下(不能选择十六进制发送),连接USB数据线,选择相应的COM口,在数据发送窗口输入“L1#”,单击“手动发送”按钮,蓝牙开发板上对应LED1变化;在数据发送窗口输入“L2#”,单击“手动发送”按钮,蓝牙开发板上对应LED2变化。其相关代码如程序清单3.

22、9所示。程序清单3.9#include#include#define uint unsigned int#define uchar unsigned char /定义控制LED灯的端口#define LED1 P1_0/定义LED1为P10口控制#define LED2 P1_1/定义LED2为P11口控制char Rxdata3;/定义数组用于接收数据,接收数据为3个字符 uchar RXTXflag=1;/定义标志位任务一 看门狗基础程序开发任务描述任务描述 本任务要求配置CC2540内部看门狗相关寄存器,并在主程序中实现看门狗基本程序在蓝牙开发板上的应用。知识链接知识链接 看门狗,又称w

23、atchdog,好的程序或系统基本都会用到看门狗,其作用是防止程序发生死循环,或防止程序跑飞,但千万不要忘记喂狗,否则程序会直接跑飞。看门狗其实就是一个定时器电路,一般有一个输入和一个输出就可以直接复位单片机。单片机正常工作时,启动了看门狗,主程序需要每隔一段时间输出一个信号喂狗,即给看门狗时间清零(喂狗的间隔时间不能超过看门狗定时的时间),如果超过规定的时间不喂狗(一般在程序跑飞时),那么看门狗定时时间就会超过,看门狗给出一个复位信号到单片机,使单片机复位,防止单片机死机。看门狗可用于受到电气噪声、电源故障和静电放电等影响的应用,或需要高可靠性的环境。看门狗的工作原理为:在系统运行后,启动了

24、看门狗,看门狗就开始自动计数,如果到了一定时间还不去清看门狗定时时间,那么看门狗计数器就会溢出,从而引起看门狗中断,造成系统复位,所以在使用时要注意看门狗计数值清零(喂狗)。CC2540的看门狗很简单,只要配置WDCTL寄存器就可以了,其详细介绍如表3-12所示。任务实施任务实施 本任务选择看门狗模式并设定复位周期为1 s,即如果在1 s时间内不清除看门狗WDT(1 s内不喂狗),看门狗输出触发CC2540的RST管脚,单片机自动复位。如表3-12 所示,让WDCTL=0 xA0,然后让WDCTL=0 x50。因此,本任务包含两个子程序,一个子程序是看门狗初始化,包括设置看门狗相关参数和启动看

25、门狗,另一个子程序是喂狗子程序。本任务要求主程序在运行过程中每秒钟都喂狗,即调用喂狗子程序。程序中先让LED1闪烁一次然后进入死循环,一直让LED2闪烁,如果程序正常运行,那么会看到LED1闪烁一次然后一直都是LED2闪烁;如果没有及时喂狗(把最后一句喂狗程序屏蔽),那么会看到一直是LED1闪烁然后LED2闪烁,表示程序不停在复位,其相关代码如程序清单3.10所示。程序清单3.10#include#define uint unsigned int#define uchar unsigned char /定义控制LED灯的端口#define led1 P1_0/定义LED1为P10口控制#def

26、ine led2 P1_1/定义LED2为P11口控制 /-延时函数-void delay_ms(uint xms)/i=xms,即延时i毫秒 uint i,j;任务一 低功耗基础程序开发任务描述任务描述 本任务要求正确配置CC2540睡眠相关寄存器,并实现系统睡眠和唤醒基础程序在蓝牙开发板上的应用。知识链接知识链接 现代电子产品开发过程中的低功耗显得越来越重要,尤其是很多手持设备,除了在硬件设计上要考虑低功耗外,还需要在软件上做文章,当系统有很少任务要处理时,可以设置单片机进入睡眠模式,从而降低功耗。本任务就是关于CC2540睡眠和唤醒状态的设定。知识链接知识链接 在使用睡眠模式时可能会遇到

27、以下两个问题。(1)睡眠后静态电流还很大,可能有以下两个原因。睡眠无效,即进入睡眠后,模/数转换、比较器、定时器、看门狗、JTAG口和掉电检测等还在耗电或直接被睡眠中断唤醒。因此,需要关闭相关模块并在处理完中断服务程序后,重新进入睡眠状态。单片机虽然睡眠了,但有可能是单片机的显示器接口和发光二极管等消耗的电量太大,所以,将端口设置为输入且无用的端口时也需要考虑功耗问题。(2)睡眠后唤醒不了的原因睡眠前没有打开对应的外部中断端口。外部中断端口不是异步低电平触发中断。没有开启全局中断。CC2540单片机的电源管理工作方式主要有以下四种。全功能模式:高频晶振(32 MHz)和低频晶振(32.768

28、kHz)全部工作,数字处理模块正常工作。PM1:高频晶振关闭,低频晶振工作,数字核心模块正常工作。PM2:低频晶振工作,数字核心模块关闭,系统通过RESET、外部中断或睡眠计数器溢出唤醒。PM3:晶振全部关闭,数字处理核心模块关闭,系统只能通过RESET或外部中断唤醒。此模式下功耗最低。任务实施任务实施 本任务中主程序实现LED1闪烁,并在LED1取反10次(闪5次)后进入睡眠模式,由按键S1唤醒,重新运行程序,LED1变化10次。其相关代码如程序清单3.11所示。程序清单3.11#include#define uint unsigned int#define uchar unsigned c

29、har#define led1 P1_0/定义LED1为P1_0口控制#define key_s1 P0_0/定义S1为P0_0口控制/-延时函数-任务描述任务描述 本任务要求使用CC2540内部温度传感器,通过A/D转换实现温度检测并在串口调试助手上打印出来。知识链接知识链接 CC2540自带A/D转换模块,并且其芯片内部集成了温度传感器。本任务就是实现采集芯片内部温度并通过串口发送到串口调试助手上显示出来的功能。在测试时,用手去触摸芯片会明显感觉温度变化的现象,松开手温度会恢复(排除芯片温度正好与手的温度差不多的情况,那样会感觉不明显,可以采用别的方法来改变芯片的温度)。任务实施任务实施

30、本任务要求使用CC2540内部温度传感器,配置A/D转换与温度传感器相关寄存器并实现在串口调试助手上显示芯片温度。其相关代码如程序清单3.12所示。程序清单3.12#include#define uint unsigned int#define uchar unsigned char uchar tempnum8;/定义保存温度值的数组 /-延时函数-void delayms(uint a)连接USB串口线和下载线,下载运行程序,打开串口调试助手,选择COM4口,调节波特率为115 200 b/s,在串口调试助手会显示温度值,如图3-5所示。其显示值即为当前芯片内部的温度。图图3-5 3-5 串口调试助手显示芯片内部温度串口调试助手显示芯片内部温度

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(蓝牙40-BLE基础裸机程序开发课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|