深入浅出第四讲 串口时钟

Posted 超级可爱的夹心小朋友

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出第四讲 串口时钟相关的知识,希望对你有一定的参考价值。

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

系统高频时钟切换步骤:(从16M RC 切换到32M )
1.让2个高频时钟源起振
2.等待目标时钟源震荡稳定
3.延时一小段时间63us
4.不分频输出 不分频32M,二分频16M,
5.选中目标高频时钟源作为系统主时钟源
6.确认一下当前工作的系统时钟是不是所选的高频时钟
SLEEPCMD 、SLEEPSTA 、CLKCONCMD 、CLKCONSTA ,CMD:写寄存器,STA:状态寄存器

1.让SLEEPCMD第2位为0
2.让SLEEPSTA寄存器的第6位为1,表示32M时钟源稳定
3.超过63us延时
4.把寄存器CLKCONCMD的低3位设置为000,表示不分频输出
5.把寄存器CLKCONCMD的第6位清0,设置为32M作为系统主时钟(如果置1 则是16M)
6如果读CLKCONSTA这个寄存器的第6位为0,表示32M的时钟源已经作为系统主时钟,系统可以继续运行了。(检查作用)

例题1:让数码管显示0-9,16M输出
#include<iocc2530>
#include"74LS164_8LED.h"
void delay()
{
  int i,j;
  for(i=0;i<1000;i++)
    for(j=0;j<800;j++)
}
void main()
{
 char i;
  LS164_Cfg();//初始化
  while(1)
  {
    for(i=0;i<10;i++)
     {
          LS164_BYTE(i);//数码管显示从0到9
            delay();//延时函数
     }
  }
}

例题2:让数码管显示0-9,32M输出
#include<iocc2530>
#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()
{
  SEELPCMD &=0xFB; //1111 1011 开启2个高频时钟源
  while(SLEEPSTA &0x40);// 0100 0000 等待32M稳定
  delayus();//延时63u函数
  CLKCONCMD &=0xF8;//1111 1000 不分频输出
  CLKCONCMD &=0xBF;//1011 1111 设置32M作为主时钟
  while(CLKCONSTA &0x40);//0100 0000 等待32M成功成为当前系统主时钟
}
void main()
{
 char i;
  LS164_Cfg();//初始化
  while(1)
  {
    for(i=0;i<10;i++)
     {
          LS164_BYTE(i);//数码管显示从0到9
            delay();//延时函数
     }
  }
}

掌握时钟的切换、控制串口
CC2530具有2个串口,且每个串口都可以配置选择控制脚
串口位置的配置:
1.指定串口的IO位置;备用位置1备用位置2
2.相应IO配置成片上外设功能;
3.8个数据位、1个停止位、无流控、无校验确立。
4.波特率;
5.开CPU中断、对应串口接收中断;

#include<iocc2530.h>
void Init32M()
{
  SEELPCMD &=0xFB; //1111 1011 开启2个高频时钟源
  while(SLEEPSTA &0x40);// 0100 0000 等待32M稳定
  delayus();//延时63u函数
  CLKCONCMD &=0xF8;//1111 1000 不分频输出
  CLKCONCMD &=0xBF;//1011 1111 设置32M作为主时钟
  while(CLKCONSTA &0x40);//0100 0000 等待32M成功成为当前系统主时钟
}
void UartCfg()
{//串口0的备用位置1配置成波特率9600
   PERCFG &=0xF1;//1111 0001 选择串口0的备用位置1;
   P0SEL |=0x0C;//0000 1100 P0_2 P0_3为片上外设功能
   U0CSR |=0xC0;//
   U0GCR =8;
   U0BAUD =59;
    EA=1; //打开总中断
    URX0IE=1;
}
void main()
{
   Init32M();
   UartCfg();
   while(1);
}

#pragma vector=URX0_VECTOR
__interrupt void URX0_IR0(void)
{
     char ch;
     URX0IF=0;//串口来数据位的标志,硬件会置1,软件清0
     ch=U0DBUF;//从接受寄存器里取字节存入ch

     U0DBUF=ch;//把变量ch里的值赋给发送串口0 发送寄存器
     while(UTX0IF==0);
     UTX0IF=0;
   
}

以上是关于深入浅出第四讲 串口时钟的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出第四讲 串口时钟

Spring繁华的AOP王国----第四讲

《从入门到精通云服务器》第四讲—DDOS攻击

51单片机上位机编写与串口通信-深入了解串口

DataWhales深入浅出Pytorch-第三章/第四章

DataWhales深入浅出Pytorch-第三章/第四章