寄存器串口很简单,用默认的时钟,直接就给出波特率即可。
本程是给出一收马上发的结构,所以最好一个一个来。
程序如下:
/*[头文件]*/
#include "sam.h"
/*定义波特率,时钟,不需要奇偶校验*/
#define BAUDRATE 9600
#define MCK CHIP_FREQ_MAINCK_RC_4MHZ
#define PAR UART_MR_PAR_NO
/*[主程序]*/
int main (void)
{
/*关掉看门狗*/
WDT->WDT_MR = WDT_MR_WDDIS;
/*使能UART0时钟*/
PMC->PMC_PCER0 = (1 << ID_UART0);
/*设置PA9和PA10为串行通信口URXD0和UTXD0*/
uint32_t mask = PIO_PA9 | PIO_PA10;
PIOA->PIO_PDR = mask;
PIOA->PIO_ABCDSR[0] &= ~mask; //这时里选择A口外设功能即UART0
PIOA->PIO_ABCDSR[1] &= ~mask; //这里是选择A口外设功能即UART0
/*使能接收器及发送器*/
UART0->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
/*本芯片的UART支持的格式仅有:8位数据位、发送时停止位为1位。但我们可以设置校验位,不过为了简单起见,这里不使用校验*/
UART0->UART_MR = UART_MR_PAR_NO;
/*设置通信波特率*/
UART0->UART_BRGR = UART_BRGR_CD(MCK / (16 *BAUDRATE));
/*回环测试时用,正常工作可删除它*/
//UART0->UART_MR = UART_MR_CHMODE_REMOTE_LOOPBACK;
uint32_t data;
while(1)
{
/*接收*/
while ((UART0->UART_SR & UART_SR_RXRDY) == 0);
data = UART0->UART_RHR;
/* 发送*/
while((UART0->UART_SR & UART_SR_TXRDY) == 0);
UART0->UART_THR = data;
}
}
运行结果如下:
|