【程序】CC2530单片机使用默认16MHz时钟或外部32MHz时钟实现115200波特率串口USART0的printf输出

程序代码:

#include <iocc2530.h>
#include <stdio.h>

#define _BV(n) (1 << (n))

#define CLKCONCMD_OSC _BV(6)
#define CLKCONCMD_CLKSPD 0x07

#define CLKCONSTA_OSC _BV(6)

#define P0SEL_SELP0_3 _BV(3)
#define P0SEL_SELP0_2 _BV(2)

#define U0CSR_MODE _BV(7)
#define U0CSR_RE _BV(6)
#define U0CSR_RX_BYTE _BV(2)
#define U0CSR_TX_BYTE _BV(1)

//#define SYSCLK_32MHz // 选择时钟源

__near_func int putchar(int c)
{
  if (c == '\n')
    putchar('\r');
  
  U0DBUF = c; // 发送字符
  while ((U0CSR & U0CSR_TX_BYTE) == 0); // 等待字符发送完毕
  U0CSR &= ~U0CSR_TX_BYTE; // 清除发送成功标志位
  return c;
}

#ifdef SYSCLK_32MHz
void clock_init(void)
{
  CLKCONCMD &= ~CLKCONCMD_OSC; // 选择系统时钟为32-MHz XOSC
  while (CLKCONSTA & CLKCONSTA_OSC); // 等待系统时钟变为32-MHz XOSC
  CLKCONCMD &= ~CLKCONCMD_CLKSPD; // 将系统主时钟频率设为32MHz
}
#endif

void usart_init(void)
{
  U0CSR = U0CSR_MODE | U0CSR_RE; // 选UART模式, 允许接收
  P0SEL = P0SEL_SELP0_2 | P0SEL_SELP0_3; // 将P0.2和P0.3设为外设输出
  
  // 波特率: 115200
#ifdef SYSCLK_32MHz
  U0GCR = 11; // BAUD_E
  U0BAUD = 216; // BAUD_M
#else
  // 16MHz默认时钟
  U0GCR = 12;
  U0BAUD = 225; // 若出现乱码, 微调此寄存器的值
#endif
}

int main(void)
{
  char data;
  
#ifdef SYSCLK_32MHz
  clock_init();
#endif
  usart_init();
  
  printf("Hello CC2530! CLKCONCMD=0x%02x\n", CLKCONCMD);
  while (1)
  {
    // 字符接收
    if (U0CSR & U0CSR_RX_BYTE)
    {
      data = U0DBUF;
      printf("Key 0x%02x!\n", data);
    }
  }
}
程序运行结果:

开发环境:


烧写工具:


猜你喜欢

转载自blog.csdn.net/ZLK1214/article/details/80341146