6.串口、时钟

47 篇文章 15 订阅
13 篇文章 0 订阅

预备知识

  1. CC2530在正常运行的时候需要一个高频时钟信号和一个低频的时钟信号

    高频时钟信号,主要供给CPU,保证程序的运行。

    低频时钟信号,主要供给看门狗、睡眠定时器等偏上外设。

  2. CC2530时钟信号的来源:

    • 高频信号有2个,芯片内部的16M RC电路;外接的32M石英晶振

    • 低频信号也有2个来源,芯片内部的32K RC电路,外接的32.768K石英晶振。

  3. CC2530芯片默认上电的时候,是内部的2个RC电路作为高频和低频的时钟来源。

    • 如果使用串口,特别是无线通信的时候,必须要用32M的石英晶振作为高频时钟来源。
  4. 高频时钟源特点:

    • 2高频时钟源可以同时起振产生高频时钟信号;

    • 2个低频时钟源,某一时刻只能有1个起振,并且起振的这个时钟源供给CC2530.

系统时钟转换

系统高频时钟源切换的步骤:

  1. 让2个高频时钟源起振(SLEEPCMD)

  2. 等待目标时钟源振荡稳定(SLEEPSTA )

  3. 延时一小段时间63us

  4. 不分频输出(CLKCONCMD )

  5. 选中目标高频时钟源作为系统主时钟(CLKCONCMD )

  6. 确认一下当前工作的系统时钟是不是所选的高频时钟(CLKCONSTA)

配置实现

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的时钟源已经作为了当前的系统主时钟,程序可以往下运行了。

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成功成为当前系统主时钟
}

相关寄存器

SLEEPCMD寄存器

image-20231014110046294

SLEEPSTA寄存器

image-20231014110331259

CLKCONCMD寄存器

系统时钟的源既可以用 16 MHzRC 振荡器,也可以采用 32 MHz晶振。时钟的控制使用CLKCONCMD寄存器执行

PCON.IDLE在默认状态下处于供电模式

如果当进入供电模式(设置 PCON.IDLE)且 CLKCONCMD.OSC = 0 时,自动变为 32 MHz。

如果当进入供电模式设置了 PCON.IDLE 且 CLKCONCMD.OSC = 1,它继续运行在 16 MHz。

image-20231014110623799

CLKCONSTA寄存器

CLKCONSTA 寄存器是一个只读的寄存器,用于获得当前时钟状态

image-20231014111105250

串口通信

配置实现

初始化配置:

  1. 指定串口的IO位置;

  2. 相应IO配置成偏上外设功能:

  3. 8个数据位、1个停止位、无流控、无校验确立。

  4. 波特率:

  5. 开CPU中断、对应串口接收中断:

中断配置:

  1. 清除接收中断标志位
  2. 接收数据
  3. 等待发送完成
  4. 清除发送完成标志位
void USART_Init(){
  //串口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;
}

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

相关寄存器

引脚映射

image-20231014113243742

image-20231014113433811

PERCFG寄存器

image-20231014113548563

U0CSR寄存器

U0CSR是USART0控制和状态寄存器,其各个位的作用如下:

(1)Bit[7]表示USART模式,值为0表示SPI模式,值为1表示UART模式。

(2)Bit[6]表示是否启用UART接收器,值为0表示禁用接收器,值为1表示启动接收器。

(3)Bit[5]表示SPI 主机或者从机模式,值为0表示SPI主模式,值为1表示SPI从模式。

(4)Bit[4]表示UART 帧的停止位错误状态,值为0表示无错误,值为1表示有错误。

(5)Bit[3]表示UART奇偶错误状态,值为0无错误,值为1表示有错误。

(6)Bit[2]表示传送字节状态,值为0表示没有收到字节,值为1表示准备好接收字节。

(7)Bit[1]表示传送字节状态,值为0表示字节没有被传送,值为1表示写到数据缓存寄存器的最后字节被传送。

(8)Bit[0],USART传送/接收主动状态、在 SPI 从模式下该位等于从模式选择,0:USART 空闲 ,1:USART 忙碌。

image-20231014114722135

波特率配置

image-20231014114757525

IEN0中断使能寄存器

image-20231014115155885

其他中断相关寄存器

URX0IF是串口0 RX中断标志寄存器,1用于USART0接收中断标志位。

image-20231014115710010

UTX0IF是USART0的TX中断标志标志寄存器,值为0表示无中断未决,值为1表示中断未决。

image-20231014115651003

U0DBUF是USART0的缓存寄存器,用于接收或发送数据时的缓存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

追上

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

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

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

打赏作者

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

抵扣说明:

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

余额充值