物联网实训Day03

系统时钟

振荡器

  1. 采用 32.768hz 和 32M 两种晶振。
  • 为什么是32.768?(2^15 = 32768)分频下来就是1秒钟。
  1. 晶振与RC振荡器的优缺点
  • 晶振:有源(通电可用、简单)、无源(需要结合);起振慢;稳定、高精度;成本高;受温度影响大;
  • RC振荡器:起振速度快;频率高;简单;成本低廉;精度低;受温度影响。
  1. CLKCONCMD(时钟控制命令寄存器)
    CLKCONCMD(时钟控制命令寄存器)
  • 系统时钟源复位之后为1,则在未设置时,为16MHz。(默认)
  1. 分频、倍频
  • 倍频,系统时钟高于时钟源,PLL
  • 选择的系统频率不能高于系统时钟源,最高只能达到系统时钟源的频率。
  1. 查看设置是否起效
  • CLKCONSTA时钟控制状态寄存器(只读)与CLKCONCMD(时钟控制命令寄存器)设置是否一致。
  1. SLEEPSTA睡眠模式控制状态寄存器
    SLEEPSTA睡眠模式控制状态寄存器

中断

  • 中断源 中断使能IEN(interrupt enable)
  • 中断类型
  • 中断优先级(优先级的数字大小与优先级别关系查看手册)
  • 中断处理过程
    中断处理过程
  • 当相应的中断源使能并发生时,中断标志位将自动置1,然后程序跳往中断服务程序的入口地址执行中断服务程序。待中断服务程序处理完毕后,软件中断清零还是硬件中断清零——查手册。(中断执行完之后中断标志位清零)
    中断处理
  • I/O中断:通过判断PxIFG寄存中的中断状态标志位可以判断哪个引脚发生中断。PxIFG寄存器有三个,分别是P0IFG、P1IFG和P2IFG。
  • 通用IO口中断设置:
    通用IO口中断设置
  • 作业:将KEY实验由查询方式改成中断方式(参考代码)
#include <ioCC2530.h>
#define LED1 P1_4
#define S5 P0_4
#define S6 P0_5
#define POINT_VECTOR VECT(13,0x6B)
#define ON 0
#define OFF 1
#define DOWN 0
#define UP 1
void led_init(void);
void key_init(void);
void delay_ms(int nms);
__interrupt void P0_ISR(void);
void main(void)
{
  led_init();
  key_init();
  while(1){
  }
  
}
void led_init(void)
{
  P1SEL&=~0x10;
  P1DIR |=0x10;
  LED1=OFF;//初始状态
  
}
void delay_ms(int nms)
{
  unsigned int i,j;
  for(i=nms;i>0;i--)
    for(j=578;j>0;j--);
}
void key_init(void)
{
  P0IFG=0x00;
  P0INP &=~0x30;
  P0IEN|=0x30;
  PICTL|=0X01;
  EA=1;
  IEN1|=0x20;
}
#pragma vector=POINT_VECTOR
__interrupt void P0_ISR(void)
{
  P0IEN&=~0x30;
  if(P0IFG>0)
  {
    if(P0IFG==0x10)
    {
      LED1=ON;
    }
    if(P0IFG==0x20)
    {
      LED1=OFF;
    }
    P0IFG=0;
  }
}

定时器

  1. 概述:CC2530有4个定时器:定时器1~4,另外还有一个睡眠定时器,和定时器2配合使用,可以使CC2530进入低功耗模式。
  2. 方式:自由运行模式(是模计数模式的一种)、模计数模式、正计数/倒计数模式
    1. 自由运行模式:在自由运行操作模式下,计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到0xFFFF溢出,计数器载入0x0000。自由运行模式可以用于产生独立的时间间隔,并输出信号频率。
    1. 模计数模式:当定时器运行在模计数器模式,16位计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到T1CC0(溢出)。寄存器T1CC0H:T1CC0L保存最终计数值,计算器将复位到0x0000,并继续递增。如果定时器开始于T1CC0以上的一个值,当达到最终计数值0xFFFF时,由硬件自动设置标志IRCON.T1IF和T1STAT.OVFIF。如果设置了相应的中断屏蔽位,将产生一个中断请求。模计数器模式可以用于周期不是0xFFFF的应用程序。
    1. 正计数/倒计数模式:在正计数/倒计数模式,计数器反复从0x0000开始,“正计数”直到达到T1CC0H:T1CC0L保存的值。然后计数器将“倒计数”直到0x0000。这个定时器的输出模式用于周期必须是对称输出脉冲而不是0xFFFF的应用程序。在正计数/倒计数模式,达到最终计数值时,设置标志位IRCON.T1IF和T1STAT.OVFIF。如果设置了相应的中断屏蔽位,将产生一个中断请求。
  1. 定时器
    1. 睡眠定时器:睡眠定时器用于设置系统进入和退出低功耗休眠模式之间的周期。睡眠定时器还用于当进入低功耗模式时,维持定时器2的定时。
    1. 定时器1是一个独立的16位定时器,支持典型的定时/计数功能,有5个独立的捕获/比较通道。每个通道使用一个I/O引脚。在定时器1中由T1CTL.DIV设置的分频器值进一步划分,这个分频值可以为1、8、32或128。因此当32MHz晶振用作系统时钟源时,定时器1可以使用最低时钟频率是1953.125Hz,最高是32MHz。 (1953.125 = 0.25*(10^6)/128)
    • MODE:00:暂停运行;01:自由运行,从0x0000到0xFFFF反复计数;10:模,从0x0000到T1CC0反复技术;11:正计数/倒计数,从0x0000到T1CC0反复计数且从T1CC0倒计数到0x0000。
    1. 定时器2主要用于为IEEE802.15.4 CSAM/CA算法提供定时,并且为IEEE802.15.4 MAC层提供一般的计时功能。16位定时器正计数,可变周期可精确到31.25ns。(500000/16 = 31250)
    1. 定时器3和定时器4是是两个8位定时器,每个定时器有两个独立的比较通道。每个通道上使用一个I/O引脚。时钟分频器,可以被1,2,4,8,16,32,64,128整除。
  • 作业:通过操作定时器相关寄存器,实现 500MS 翻转一次 LED 灯。(参考代码)
#include<iocc2530.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
// #define LED1 P1_0 //定义 LED1 为 P10 口控制
// #define LED2 P1_1 //定义 LED2 为 P11 口控制
#define LED1 P1_4 //定义 LED1 为 P14 口控制
#define ON 0
#define OFF 1
#define Down 0
#define Up  1
void led_init(void);
void delay_ms(unsigned int nms);
void T1_init(void);

/*************************************************
*.函数说明:LED灯初始化函数,配置LED灯相应端口
*.函数名称:led_init(void)
*.参数说明:无
**************************************************/
void led_init(void)
{
  P1SEL &=~0x10;                 //p1.4为普通IO
  P1DIR |= 0x10;                 //p1.4为输出
  LED1 = OFF;                    //LED1初始化为熄灭
}


/*************************************************
*函数名称:void Delay_Ms(unsigned int xms)
*功能描述:延时函数
*参数说明:xms:延时的时间(以 MS 为单位)
**************************************************/
void delay_ms(unsigned int nms)
{
  unsigned int i,j;
  for(i=nms;i>0;i--)
    for(j=578;j>0;j--);
}



/**************************************************
*.函 数 名 : T1_init(void)
*.功能描述 : Timer1 中断方式初始化函数
*.输入参数 : NONE
*.输出参数 : NONE
*.返 回 值 : NONE
***************************************************/
void T1_init(void)
{
/*  T1CTL|=0x0c; //128 分频,自由运行模式
//  T1CTL |=0x02;   //模 运行模式
  T1IE = 1; //开 Timer1 中断
  EA = 1; //开总中断
*/
  //16MHz RC是默认的时钟源,没有校准的时候误差是正负18%
    //定时器的工作频率 16MHz / 128 = 125000Hz
    //定时500ms,也就是计数62500
    //周期应该是1秒,实测940毫秒,RC的误差,切换到外部晶振应该会准确一些的。
  T1CTL |= 0x0c;    //128分频,取模模式
  T1CC0L = (62500 & 0xff);      //配置通道0的低8位
  T1CC0H = 62500 >> 8;          //配置通道0的高8位
  TIMIF |= 0x20;  //打开定时器的中断溢出标志
  T1IE = 1;	    //打开定时器1的中断
  EA = 1;         //打开总中断
  T1CCTL0 |= 0x46;//打开通道0的中断,设置为比较器模式,下降沿计数。
  T1CTL |= 0x02;  //设置为取模模式,定时器开始工作
  
}


void main(void)
{ 
  led_init();//初始化 LED 端口配置
  T1_init();   //初始化Timer1
  while(1)
  {
    
  }
}
/**************************************************
函 数 名 : T1_ISR
功能描述 : 中断服务函数
输入参数 : NONE
输出参数 : NONE
返 回 值 : NONE
***************************************************/

#pragma vector = T1_VECTOR //Timer1 中断向量
__interrupt void T1_ISR(void)
{
  if ((T1STAT & 0x01) == 0x01) {  //通道1中断标志
        LED1 = ~LED1;
        T1STAT &= ~0x01;//清除通道1的中断标志
    }
    
    T1STAT &= ~0x20;    //清除定时器1的中断标志
/*
  static unsigned char cnt = 0;
  IRCON = 0x00; //清中断标志, 也可由硬件自动完成
  cnt++;
  if(cnt == 1) 
  { 
    cnt = 0; //计数清零
    LED1=~LED1;//1 次中断后 LED 取反,闪烁一轮(0.5 秒时间)
  }
  */
}

超声波模块HC-SR04

  • 工作原理
    1. 采用IO口TRIG触发测距,给至少10us的高电平信号;
    1. 模块自动发送8个40khz的方波,自动检测是否有信号返回;
    1. 有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平*声速(340m/s)/2)或uS/58=厘米;(0.01m除以340m/s再乘以来回两倍距离,再乘以10^6,转换为uS单位,得到58.82352个周期)
  • 作业:结合超声波模块及Timer1定时器实现超声波测距(倒车雷达)(参考代码下篇下下篇见)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路灯谣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值