UART
一般發送用查詢,接收用中斷。
CC2530的外設功能可用作串口,ADC,定時器,DMA等等。串口0,串口1,分別可以放在兩個不同的備用位置。
(容易混淆)
這裏我們就需要隱射
圖片可以看出來UATRT0,UART1,分別可以隱射到P0,P1(即備用位置1,備用位置2)
下面的表格是指定都在P0位置的外設的優先級
設置端口0的UART0優先
P2DIR&=~(3<<6);
下面的表格是指定都在P1,P2位置的外設的優先級
設置端口1的UART0優先
P2SEL&=~(1<<6);
個人總結
- 確定串口位置設置IO爲外設功能
- 配置對應優先級
- 確定在那個端口
假設cc2530的硬件連接爲
Usart0_Rx P0_2
Usart0_Tx P0_3
P0SEL |= 0x0c; //設置P0_2,P0_3 用作外設串口
P2DIR &= ~0XC0; //P0優先作爲UART0使用
PERCFG &= ~0x01;//將USART0安排在P0口
許久沒寫驅動,清晰了不少,是不是很簡單?
結合時鐘管理之後一起綜合~
//#ifndef __uart_H__
//#define __uart_H__
#include<iocc2530.h>
void uartinit();
void myprintf(char *data);
void clockinit();
uart.c
#include "uart.h"
void uartinit()
{
P0SEL|=0X3C; //設置爲外設功能
PERCFG&=~(1<<0); //備用位置1優先
P2DIR&=~(3<<6); //設置串口0優先
U0CSR|=(1<<7); //使用串口模式
U0BAUD|=216; //波特率 57600
U0GCR|=10; //U0GCR |=10;
UTX0IF=0; // UTX0IF=0,清除標誌位
U0CSR|=0X40; //使能接收器
IEN0|=(1<<2); //使能串口0中斷
IEN0|=(1<<7); //開總中斷
}
void myprintf(char *data)
{
while(*data!='\0')
{
U0DBUF= *data++;
while(UTX0IF==0); // (U0CSR & 0X02)
UTX0IF=0;
//U0CSR &=~0X02;
}
}
void clockinit()
{
CLKCONCMD &=~(1<<6);
while((SLEEPSTA & 0X40) ==0);
CLKCONCMD &=~0X47;
SLEEPCMD|=0X04;
}