寄存器串口很简单,用默认的时钟,直接就给出波特率即可。
本程是给出一收马上发的结构,所以最好一个一个来。
程序如下:
- /*[头文件]*/
- #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;
- }
- }
运行结果如下:
|