深入浅出第四讲 串口时钟
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;
}
以上是关于深入浅出第四讲 串口时钟的主要内容,如果未能解决你的问题,请参考以下文章