从零开始ZigBee学习(4)——串口、时钟

一、笔记

1、CC2530在正常运行的时候需要一个高频时钟信号和一个低频的时钟信号
   高频时钟信号,主要供给CPU,保证程序的运行。
   低频时钟信号,主要供给看门狗、睡眠定时器等偏上外设。
2、时钟信号的来源;
   高频信号有2个,芯片内部的16M RC电路;外接的32M石英晶振
   低频信号也有2个来源,芯片内部的32K RC电路,外接的32.768K石英晶振。
3、CC2530芯片默认上电的时候,是内部的2个RC电路作为高频和低频的时钟来源。
4、如果我们在用串口,特别是无线通信的时候,必须要用32M的石英晶振作为高频时钟来源。
5、高频时钟源特点:
   2高频时钟源可以同时起振产生高频时钟信号;
   而2个低频时钟源,某一时刻只能有1个起振,并且起振的这个时钟源供给CC2530.

Chipcon CC2430/1  cc2530/1
1、让SLEEPCMD的第2位为0;
2、SLEEPSTA寄存器的第6位为1表示32M 时钟源稳定
3、超过63微秒延时
4、把寄存器CLKCONCMD的低3位 设置为000,表示不分频输出
5、把寄存器CLKCONCMD的第6位 清0,设置32M作为系统主时钟
6、如果读CLKCONSTA这个寄存器的第6位为0,表示32M的时钟源已经作为了当前的系统主时钟,程序可以往下运行了。

二、准备

CMD:命令寄存器

STA:状态寄存器

1.步骤

(1)SLEEPCMD寄存器第2位:为1:两个高频时钟源都起振

                                                     为0:关闭当前没有供给CPU的时钟源

(2)SLEEPSTA寄存器第6位:为1:32M时钟源稳定

(3)超过63微秒延时

(4)把寄存器CLKCONCMD的低3位 设置为000,表示不分频输出

 (5)把寄存器CLKCONCMD的第6位 清0,设置32M作为系统主时钟;默认为1:16M

(6) 如果读CLKCONSTA这个寄存器的第6位为0,表示32M的时钟源已经作为了当前的系统主时钟,程序可以往下运行了。若为1则为16M

其他寄存器:

PERCFG设置部分外设的I/O位置,0为默认I位置1,1为默认位置2

D7

D6

D5

D4

D3

D2

D1

D0

未用

 定时器1

 定时器3

 定时器4

 未用

 未用

USART1

 USART0

P2DIR D0~D4设置P2_0P2_4的方向
                 D7D6位作为端口0外设优先级的控制

D7

D6

D5

D4

D3

D2

D1

D0

X

X

未使用

P2_4方向

P2_3方向

P2_2方向

P2_1方向

P2_0方向

 D7D6意义
 00第1优先级:USART 0
第2优先级:USART 1
第3优先级:定时器1
01第1优先级:USART 1
第2优先级:USART 0
第3优先级:定时器1
10第1优先级:定时器1通道0-1
第2优先级:USART 1
第3优先级:USART 0
第4优先级:定时器1通道2 –3
11 第1优先级:定时器1通道2-3
第2优先级:USART 0
第3优先级:USART 1
第4优先级:定时器1通道0 –1

UART串口通信的相关寄存器:

UxCSR:USARTx控制和状态寄存器

UxUCR: USARTx UART控制寄存器

UxGCR: USARTx通用控制寄存器

UxBUF: USARTx接受/发送数据缓冲寄存器

UxBAUD: USARTx波特率控制寄存器

 

 UTX0IF = 0; //清除UART0发送中断标志位

  URX0IF = 0;//清除UART0接收中断标志位

三、代码

串口相关:

#include<ioCC2530.h>
char ch;
void Cfg32M()
{
    SLEEPCMD &=0xFB; //fB 0 00 让2个时钟源都起振
    while(0==(SLEEPSTA & 0x40));  //  0100 0000  如果32M 晶振供电且稳定了,那么程序往下运行
    CLKCONCMD &=0xF8; //1111 1000 不分频输出

    CLKCONCMD &=0xBF;//1011 1111 让32M作为系统主时钟供给CPU
    while(1==(CLKCONSTA & 0x40));//如果32M确实供给CPU在工作,那么程序往下执行
    SLEEPCMD |=0x40;// 0000 0100 
}
void UartCfg()
{//串口0的备用位置1配置成波特率9600
   PERCFG &=0xFE;//1111 1110 选中串口0的的备用位置1
   P0SEL  |=0x0C;       //0000 1100 P0_2 p0_3为偏上外设功能
   
   U0CSR |=0Xc0;
   
   U0GCR =8;
   U0BAUD=59;
   EA=1;
   URX0IE=1;
}

void main()
{
  Cfg32M();
  UartCfg();
    while(1);
}

#pragma vector=URX0_VECTOR
__interrupt void sdfs(void)
{
    
    URX0IF=0;//串口0来数据的标志位,硬件会置1,我们软件要清0
    ch=U0DBUF;//从接受寄存器里取字节存入变量ch
    
    U0DBUF=ch;//把变量ch里的值赋给串口0发送数据寄存器
    while(0==UTX0IF);
    UTX0IF=0;
}

时钟相关:

#include<iocc2530.h>
#include"74LS164_8LED.h"
void delayus()
{
    char k=63;
    while(k--);
}

void delay()
{
  int i,j;
     for(i=0;i<1000;i++)
       for(j=0;j<800;j++);
}

void Init32M()
{
   SLEEPCMD &=0xFB;//1111 1011 开启2个高频时钟源
   while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M稳定
   delayus();
   CLKCONCMD &=0xF8;//1111 1000 不分频输出
   CLKCONCMD &=0XBF;//1011 1111 设置32M作为系统主时钟
   while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成为当前系统主时钟
}
void main()
{
     char i;
     LS164_Cfg();
     Init32M();
     while(1)
     {
         for(i=0;i<10;i++)
         {
            LS164_BYTE(i);
            delay();
         }
     }
}

教学视频链接:手把手教你学zigbee_哔哩哔哩_bilibili

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清园暖歌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值