www.pudn.com > uart.zip > uart_drv.h, change:2015-10-13,size:4599b


/******************************************************************************* 
 * Copyright (c) 2015 Suzhou Robot Information Technology Co., Ltd. 
 * Filename   : usart.c 
 * Author     : zj       Version:0.0.1      Date:2015.09.06 
 * Description: 串口驱动模块,实现两路485通讯 
 * Others     : 
 * History    : 
 * <Author>  <Date>    <Version> <Description> 
 *  zj     2015.09.06   0.0.1     从YBMPS3030扩展板移植到YBBM3710电池巡检仪 
 ******************************************************************************/ 
 
#ifndef __UART_DRIVER_H__ 
#define __UART_DRIVER_H__ 
 
/***********************************头文件*************************************/ 
#include "stm32f10x.h" 
#include "loopbuffer.h" 
#include "gpio_set.h" 
#include <stdbool.h> // 标准bool类型定义  
#include <stdio.h> 
 
/***********************************宏定义*************************************/ 
#define USART_CH_CNT 2 // 串口数目 
 
/*********************************结构体定义***********************************/ 
typedef struct _usart_cfg{ 
    gpio_cfg_t iotx;    // 串口IO Tx引脚定义 
    gpio_cfg_t iorx;    // 串口IO Rx引脚定义 
    gpio_cfg_t iotxen;  // 串口IO 发送使能引脚定义 
    pin_status_t iotxen_status; // 串口IO 发送使能引脚状态 
    USART_TypeDef *reg; // 串口外围设备寄存器定义 
    uint32_t  clk;      // 串口外围设备时钟定义 
    IRQn_Type irq;      // 串口中断类型 
    USART_InitTypeDef cfg;      // 串口初始化配置定义 
}usart_cfg_t; /* 串口引脚定义 */ 
 
typedef struct _usart_info_t{ 
    unsigned int ORE_cnt;   // 指示ORE中断次数,表示接收丢弃数据次数 
    unsigned int Tx_cnt;    // 指示自上次清除以来发送数据字节数 
    unsigned int Rx_cnt;    // 指示自上次清除以来接收数据字节数 
    unsigned int OldRxcnt;  // 记录上次判断通信状态时,已经接收字节数 
}usart_info_t; /* 串口收发计数信息 */ 
 
typedef struct _uart_tick{ 
    u32 rx_en_lastTick; // 重启接收使能计数 
    u32 rx_ok_lastTick; // 接收数据可读取计数 
    u32 tx_en_lastTick; // 重启发送使能计数 
}uart_tick_t; /* 串口接收tick计时 */ 
 
typedef struct _uart{ 
    loop_buff_t rxbuf;      // 接收缓存 
    loop_buff_t txbuf;      // 发送缓存 
    usart_cfg_t *cfg;       // 串口引脚配置 
    unsigned char duplex;   // 全双工:true,半双工:false 
    /* 完成发送时准备接收使能时的Tick;发送完成时,置需要恢复的毫秒数, 
        倒数到零时,则置状态为使能接收 */ 
    uint32_t rxen_tick; 
    bool RxTickOkTag;   // 接收Tick计时完成标志,可以读取数据:true,不能读取数据:false 
    uart_tick_t uart_lastTick; // 收发计数上一次的Tick值 
    /* 接收帧最小字节数,理论上接收该数值字节数据所需时间(该数值*0.086+1ms)内没再收到数据, 
        则置RxTickOkTag为可接收状态 */ 
    uint16_t RxFrameNopNum; 
    uint16_t RxFrameMaxSize;// 接收帧最大字节数 
    usart_info_t info;      // 串口收发计数信息 
}uart_t; /* 串口主配置 */ 
typedef uart_t* puart_t; /* 串口主配置指针 */ 
 
//////////////////////////////////////////////////////////////////////////////// 
// 串口配置信息,详见文档<电池巡检仪MODBUS-RTU协议(内部版)>3.1节 
// ============================================================================ 
//| 485串口波特率                         | 校验方式                   | 停止位| 
// ---------------------------------------------------------------------------- 
//| 2字节                                 | 1字节                      | 1字节 | 
//| 0:2400,1:4800,2:9600,3:19200,4:115200 | 0:无校验 1:奇校验 2:偶校验 | 0/1/2 | 
// ============================================================================ 
//////////////////////////////////////////////////////////////////////////////// 
typedef struct _uart_config{ 
    unsigned short baudrate; 
    unsigned short parity; 
    unsigned short stopbits; 
}uart_config_t; // 串口配置 
 
/*********************************全局变量声明*********************************/ 
extern uart_t uartCfg[USART_CH_CNT]; // 串口主配置 
 
/*********************************接口函数声明*********************************/ 
/** 
 * 串口硬件相关初始化 
 */ 
void uart_init(uart_config_t *pCfg); 
 
/** 
 * 串口轮询函数 
 */ 
void uart_process(void); 
 
/** 
 *  向串口发送一字节数据,先添加到缓冲区,条件满足后才开始发送(打开发送中断) 
 */ 
bool uart_put_byte(uart_t *pUart, unsigned char UartData, unsigned int allDataLen); 
 
/** 
 * 设置调试打印串口 
 */ 
void set_print_uart(uart_t *pUart); 
 
/** 
 * 读取调试打印串口配置结构体 
 */ 
uart_t *get_print_uart(void); 
 
/** 
 * 串口公用中断处理 
 */ 
void UART_IRQHandler(puart_t _this); 
 
#ifdef UART_TEST 
/** 
 * 串口测试1: 测试串口发送,如果不出现乱码则通过 
 */ 
void uart_test1(void); 
#endif 
 
#endif /* __UART_DRIVER_H__ */