一、笔记
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_0到P2_4的方向
D7、D6位作为端口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