【AT91SAM3S】串口UART初始化及收发数据
2013-08-21 19:34
781 查看
SAM3S中的UART串口是一个两线异步收发器。这个串口能用来通信或者跟踪。有两个DMA通道与UART串口关联,可通过使用DMA处理串口传输以节省CPU时间。
SAM3S4C中有两个UART。与外设引脚的对应关系如下:
板子上使用的是UART0,及PA9和PA10引脚。
SAM3S的UART结构框图
串口初始化,收发数据 的步骤如下:
1、配置相应IO口的引脚(设置IO时钟及引脚工作模式)
2、打开UART时钟
3、复位并停止UART
4、设置UART功能(奇偶校验UART_MR、波特率UART_BRGR、DMA UART_PTCR、收发使能UART_CR 等)
5、收发数据 UART_THR UART_RHR
串口的初始化程序如下:
//引脚宏定义,串口0收发引脚分别对因PA9 PA10 #define PINS_UART { PIO_PA9A_URXD0|PIO_PA10A_UTXD0, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define CONSOLE_PINS {PINS_UART} //使用的串口的宏定义,使用UART0 #define CONSOLE_USART UART0 extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)
{
const Pin pPins[] = CONSOLE_PINS;
Uart *pUart = CONSOLE_USART;
/* Configure PIO */
PIO_Configure(pPins, PIO_LISTSIZE(pPins)); //配置对应引脚
/* Configure PMC */
PMC->PMC_PCER0 = 1 << CONSOLE_ID; //打开UART时钟
/* Reset and disable receiver & transmitter */
pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX
| UART_CR_RXDIS | UART_CR_TXDIS; //复位并停止UART
/* Configure mode */
pUart->UART_MR = UART_MR_PAR_NO; //设置奇偶校验(不校验)
/* Configure baudrate */
/* Asynchronous, no oversampling */
pUart->UART_BRGR = (masterClock / baudrate) / 16; //设置波特率
/* Disable PDC channel */
pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; //接收和发送都不使用DMA
/* Enable receiver and transmitter */
pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN; //使能传输
_ucIsConsoleInitialized=1 ; //置位初始化状态
}
串口发送一个字符:
extern void UART_PutChar( uint8_t c ) { Uart *pUart=CONSOLE_USART ; if ( !_ucIsConsoleInitialized )//每次发送数据都先判断一下串口是否已经被初始化了 { UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK); } /* Wait for the transmitter to be ready */ while ( (pUart->UART_SR & UART_SR_TXEMPTY) == 0 ) ;//等待串口状态寄存器中,发送寄存器为空的标志 /* Send character */ pUart->UART_THR=c ; //发送状态为空时,即可将字符丢到发送寄存器中。 } 串口接收一个字符: extern uint32_t UART_GetChar( void ) { Uart *pUart=CONSOLE_USART ; if ( !_ucIsConsoleInitialized ) //每次接收数据都要判断下串口是否被初始化了 { UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK); } while ( (pUart->UART_SR & UART_SR_RXRDY) == 0 ) ; //等待串口状态寄存器中的RXRDY置位,这个为表示串口完整地接收了一个数据 return pUart->UART_RHR ; //读取接收到的数据并返回。同时硬件自动复位RXRDY位。 } 之后就可以使用了,我在主函数中只用了一句来验证串口的状态: UART_PutChar(UART_GetChar()); 即,将电脑端来的数据发回去。验证下,完全正常了。 当然,这里使用的是查询方式接收数据。至于中断方式接收数据,在学会了使用中断之后会补上来的。
SAM3S4C中有两个UART。与外设引脚的对应关系如下:
板子上使用的是UART0,及PA9和PA10引脚。
SAM3S的UART结构框图
串口初始化,收发数据 的步骤如下:
1、配置相应IO口的引脚(设置IO时钟及引脚工作模式)
2、打开UART时钟
3、复位并停止UART
4、设置UART功能(奇偶校验UART_MR、波特率UART_BRGR、DMA UART_PTCR、收发使能UART_CR 等)
5、收发数据 UART_THR UART_RHR
串口的初始化程序如下:
//引脚宏定义,串口0收发引脚分别对因PA9 PA10 #define PINS_UART { PIO_PA9A_URXD0|PIO_PA10A_UTXD0, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define CONSOLE_PINS {PINS_UART} //使用的串口的宏定义,使用UART0 #define CONSOLE_USART UART0 extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)
{
const Pin pPins[] = CONSOLE_PINS;
Uart *pUart = CONSOLE_USART;
/* Configure PIO */
PIO_Configure(pPins, PIO_LISTSIZE(pPins)); //配置对应引脚
/* Configure PMC */
PMC->PMC_PCER0 = 1 << CONSOLE_ID; //打开UART时钟
/* Reset and disable receiver & transmitter */
pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX
| UART_CR_RXDIS | UART_CR_TXDIS; //复位并停止UART
/* Configure mode */
pUart->UART_MR = UART_MR_PAR_NO; //设置奇偶校验(不校验)
/* Configure baudrate */
/* Asynchronous, no oversampling */
pUart->UART_BRGR = (masterClock / baudrate) / 16; //设置波特率
/* Disable PDC channel */
pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; //接收和发送都不使用DMA
/* Enable receiver and transmitter */
pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN; //使能传输
_ucIsConsoleInitialized=1 ; //置位初始化状态
}
串口发送一个字符:
extern void UART_PutChar( uint8_t c ) { Uart *pUart=CONSOLE_USART ; if ( !_ucIsConsoleInitialized )//每次发送数据都先判断一下串口是否已经被初始化了 { UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK); } /* Wait for the transmitter to be ready */ while ( (pUart->UART_SR & UART_SR_TXEMPTY) == 0 ) ;//等待串口状态寄存器中,发送寄存器为空的标志 /* Send character */ pUart->UART_THR=c ; //发送状态为空时,即可将字符丢到发送寄存器中。 } 串口接收一个字符: extern uint32_t UART_GetChar( void ) { Uart *pUart=CONSOLE_USART ; if ( !_ucIsConsoleInitialized ) //每次接收数据都要判断下串口是否被初始化了 { UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK); } while ( (pUart->UART_SR & UART_SR_RXRDY) == 0 ) ; //等待串口状态寄存器中的RXRDY置位,这个为表示串口完整地接收了一个数据 return pUart->UART_RHR ; //读取接收到的数据并返回。同时硬件自动复位RXRDY位。 } 之后就可以使用了,我在主函数中只用了一句来验证串口的状态: UART_PutChar(UART_GetChar()); 即,将电脑端来的数据发回去。验证下,完全正常了。 当然,这里使用的是查询方式接收数据。至于中断方式接收数据,在学会了使用中断之后会补上来的。
相关文章推荐
- MTK之UART串口收发数据
- 【AT91SAM3S】英倍特串口示例工程05-UART中,串口是怎样初始化的
- MTK之UART串口收发数据
- tiny4412 UART 收发数据
- 一知半解学CubeMX——UART:空闲中断结合DMA实现不定长数据收发
- 汇编级UART串口初始化与打印
- STM8S_004_UART基本收发数据
- 有人串口转wifi模块 httpd client通信示例-用户使用网页通过服务器收发串口数据源码 小黄人软件
- STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记
- 示波器分析UART串口数据
- STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT
- mini2440 UART实现串口接收后转换为整型数据
- SYD8801 UART使用说明【uart轮发数据代码实现】【 uart中断发数据代码实现】【RFSleep函数对串口的影响】【中断中调用串口打印函数有可能会造成死机】
- c#收发串口数据的源码(封装了windows api的类)
- STM32F407的串口DMA收发数据----学习帖
- C#中使用seriport和单片机进行串口长数据收发不全,解决办法
- 串口MSComm控件五种不同校验方式对数据收发的影响
- 通过波形分析方法调试UART数据收发
- 串口MSComm控件五种不同校验方式对数据收发的影响
- c#收发串口数据的源码(封装了windows api的类)