赞
踩
Ps:本例程主要作用是,展示如何使用串口发送和接收
主板为:逐飞RT1064 + 母板
1)简介:RT1052 芯片具有多达 8 个 LPUART 外设用于串口通讯,它是 Low Power Universal
Asynchronous Receiver Transmitter 的缩写,即低功耗异步收发器,它可以灵活地与外部设
备进行全双工数据交换。有别于 USART(Universal synchronous asynchronous receivertransmitter), UART 是在 USART 基础上裁剪掉了同步通信功能,只支持异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。UART 在 RT1052 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个 UART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。
2)UART 在 RT1052 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一
个 UART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的
串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。
3)UARTX_TX/RX的对应引脚与USART_X对应定义
typedef enum //枚举串口引脚 { UART1_TX_B12, UART1_RX_B13, UART2_TX_B18, UART2_TX_D11, UART2_RX_B19, UART2_RX_D10, UART3_TX_B22, UART3_TX_C8, UART3_TX_E13, UART3_RX_B23, UART3_RX_C9, UART3_RX_E14, UART4_TX_C16, UART4_TX_D0 , UART4_TX_E19, UART4_RX_C17, UART4_RX_D1 , UART4_RX_E20, UART5_TX_C28, UART5_TX_E23, UART5_RX_C29, UART5_RX_E24, UART6_TX_B2 , UART6_TX_E25, UART6_RX_B3 , UART6_RX_E26, UART7_TX_D8 , UART7_TX_E31, UART7_RX_D9 , UART7_RX_D18, UART8_TX_B26, UART8_TX_D16, UART8_TX_D24, UART8_RX_B27, UART8_RX_D17, UART8_RX_D25, }UARTPIN_enum; /此枚举定义不允许用户修改 typedef enum //枚举串口号 { USART_0,//RT1064没有串口0 这里仅用于占位 USART_1, USART_2, USART_3, USART_4, USART_5, USART_6, USART_7, USART_8, }UARTN_enum;
1)注意uart_data,本数值为实验检测值
uint8 example_rx_buffer; lpuart_transfer_t example_receivexfer; lpuart_handle_t example_g_lpuartHandle; uint8 uart_data; void example_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData) { if(kStatus_LPUART_RxIdle == status) { //数据已经被写入到了 之前设置的BUFF中 //本例程使用的BUFF为 example_rx_buffer uart_data = example_rx_buffer;//将数据取出 } handle->rxDataSize = example_receivexfer.dataSize; //还原缓冲区长度 handle->rxData = example_receivexfer.data; //还原缓冲区地址 }
1)uart_int()初始化函数
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口初始化
// @param uartn 串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
// @param baud 串口波特率
// @param tx_pin 串口发送引脚
// @param rx_pin 串口接收引脚
// @return uint32 实际波特率
// Sample usage: uart_init(USART_1,115200,UART1_TX_B12,UART1_RX_B13); // 初始化串口1 波特率115200 发送引脚使用B12 接收引脚使用B13
//-------------------------------------------------------------------------------------------------------------------
void uart_init(UARTN_enum uartn, uint32 baud, UARTPIN_enum tx_pin, UARTPIN_enum rx_pin)
2) NVIC_SetPriority()中断函数
①串口中断定义
LPUART1_IRQn = 20, /**< LPUART1 TX interrupt and RX interrupt */
LPUART2_IRQn = 21, /**< LPUART2 TX interrupt and RX interrupt */
LPUART3_IRQn = 22, /**< LPUART3 TX interrupt and RX interrupt */
LPUART4_IRQn = 23, /**< LPUART4 TX interrupt and RX interrupt */
LPUART5_IRQn = 24, /**< LPUART5 TX interrupt and RX interrupt */
LPUART6_IRQn = 25, /**< LPUART6 TX interrupt and RX interrupt */
LPUART7_IRQn = 26, /**< LPUART7 TX interrupt and RX interrupt */
LPUART8_IRQn = 27, /**< LPUART8 TX interrupt and RX interrupt */
NVIC_SetPriority(LPUART8_IRQn,15);//设置串口中断优先级 范围0-15 越小优先级越高
3)uart_rx_irq(串口接收中断)
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口接收中断设置
// @param uartn 串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
// @param status 1:打开中断 0:关闭中断
// @return void
// Sample usage: uart_rx_irq(USART_1,1); // 打开串口1接收中断
//-------------------------------------------------------------------------------------------------------------------
void uart_rx_irq(UARTN_enum uartn,uint8 status)
4)配置串口接收的缓冲区及缓冲区长度
//配置串口接收的缓冲区及缓冲区长度
example_receivexfer.dataSize = 1;
example_receivexfer.data = &example_rx_buffer;
5)设置中断函数及其参数
uart_set_handle()
//------------------------------------------------------------------------------------------------------------------- // @brief 串口接收中断设置 // @param uartn 串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8) // @param *handle 串口中断结构体变量 // @param *callback 中断后需要执行的函数 // @param *tx_buff 需要发送数据的地址 // @param *tx_count 需要发送的字节数 // @param *rx_buff 需要接收数据的地址 // @param *rx_count 需要接收的字节数 // @return void // Sample usage: uart_set_handle(USART_1, &csi_g_lpuartHandle, uart1_call_back, NULL, 0, buff, 1);//串口1 的中断回调函数设置为uart1_call_back 不需要发送中断 接收缓存为buff 接收到1个字节就中断 //------------------------------------------------------------------------------------------------------------------- void uart_set_handle(UARTN_enum uartn, lpuart_handle_t *handle, lpuart_transfer_callback_t callback, uint8 *tx_buff, uint32 tx_count, uint8 *rx_buff, uint32 rx_count) //设置中断函数及其参数 uart_set_handle(USART_8, &example_g_lpuartHandle, example_uart_callback, NULL, 0, example_receivexfer.data, 1);
6)uart_putchar()串口字节输出
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口字节输出
// @param uartn 串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
// @param dat 需要发送的字节
// @return void
// Sample usage: uart_putchar(USART_1,0xA5); // 串口1发送0xA5
//-------------------------------------------------------------------------------------------------------------------
void uart_putchar(UARTN_enum uartn, uint8 dat)
while(1)
{
uart_send++;
//串口字节发送
uart_putchar(USART_8,uart_send);
//更多功能函数 自行查阅zf_uart文件
systick_delay_ms(100);
}
(1)实验现象说明:将RX TX短接
//通过在线调试可以看到 uart_data数据在持续加1操作
#include "headfile.h" uint8 example_rx_buffer; lpuart_transfer_t example_receivexfer; lpuart_handle_t example_g_lpuartHandle; uint8 uart_data; void example_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData) { if(kStatus_LPUART_RxIdle == status) { //数据已经被写入到了 之前设置的BUFF中 //本例程使用的BUFF为 example_rx_buffer uart_data = example_rx_buffer;//将数据取出 } handle->rxDataSize = example_receivexfer.dataSize; //还原缓冲区长度 handle->rxData = example_receivexfer.data; //还原缓冲区地址 } //实验现象说明:将RX TX短接 //通过在线调试可以看到 uart_data数据在持续加一操作 uint8 uart_send; int main(void) { DisableGlobalIRQ(); board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口 //初始换串口 波特率为115200 TX为D16 RX为D17 uart_init (USART_8, 115200,UART8_TX_D16,UART8_RX_D17); NVIC_SetPriority(LPUART8_IRQn,15); //设置串口中断优先级 范围0-15 越小优先级越高 uart_rx_irq(USART_8,1); //配置串口接收的缓冲区及缓冲区长度 example_receivexfer.dataSize = 1; example_receivexfer.data = &example_rx_buffer; //设置中断函数及其参数 uart_set_handle(USART_8, &example_g_lpuartHandle, example_uart_callback, NULL, 0, example_receivexfer.data, 1); EnableGlobalIRQ(0); while(1) { uart_send++; //串口字节发送 uart_putchar(USART_8,uart_send); //更多功能函数 自行查阅zf_uart文件 systick_delay_ms(100); } }
1)RX与DX短接时,uart_data与uart_send同时增长(调试窗口)
1)RX与DX不短接时,只有uart_send同时增长(调试窗口),说明没有收到数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。