程序代码:
#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);
}
}
}
程序运行结果:
开发环境:
烧写工具: