主要是由VB等面向对象编程的语言的启发,想把nuv1xx芯片的一些外部接口/设备通过清晰明了的一个键值对化的配置可以直接改变设备属性(如VB中对按钮的长、宽、按钮文字等信息就是通过键值对来配置的)。既能使这些设备的配置对开发者来说更简单明了,也有利于通过rom的配置文件去简单地改变片上设备的配置,于是写了一下的代码。不过因为水平、精力有限,只写了简单UART接口的配置中间层API(当然,如果从BSP中去修改,效率肯定比中间外加一层要好,但还是水平、精力问题,没有从BSP里面修改,只是BSP上再铺上一层**肋的中间层)。其中也遇到一些问题,希望高手指点迷津!
/**
*******************************************************************************
* @file Mid_Uart.h
* @version V1.0 仅普通TTL串口通信功能
* @date 2012.01.18
* @brief MidInterface of UART 串口中间层接口.
*******************************************************************************
* @copy EPhon
*
* INTERNAL FILE,DON'T PUBLIC.
*
* <h2><center>© COPYRIGHT 2012 EPhon </center></h2>
*******************************************************************************
*/
#ifndef __MID_UART
#define __MID_UART
/*---------------------------- Include ---------------------------------------*/
#include <DrvUART.h>
#include <DrvGPIO.h>
/*---------------------------- Variable Define -------------------------------*/
// 初值为9600波特率、8位数据、无校验位、1停止位、1字节中断
typedef struct DevUART
{
STR_UART_T StrSet;
E_UART_PORT DevID; //UART_PORT0
E_DRVGPIO_FUNC DevIO; //E_FUNC_UART0
uint8_t DevEnable;
uint8_t IntEnable;
uint32_t IntMode; //(DRVUART_RLSINT | DRVUART_THREINT | DRVUART_RDAINT)
void (*IntHandle)(); //void UART_INT_HANDLE(uint32_t u32IntStatus);
/* 构造函数 */
/* DevUART(): DevID(UART_PORT0), DevIO(E_FUNC_UART0)
{};
StrSet.u32BaudRate = 115200;
StrSet.u8cDataBits = DRVUART_DATABITS_8;
StrSet.u8cStopBits = DRVUART_STOPBITS_1;
StrSet.u8cParity = DRVUART_PARITY_NONE;
StrSet.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;
DevID = UART_PORT0;
DevIO = E_FUNC_UART0; //E_FUNC_UART0
DevEnable = 1;
IntEnable = 1;
IntMode = DRVUART_RDAINT; */
}STR_UART_EP;
/*---------------------------- Function Declare ------------------------------*/
uint8_t SetUART(STR_UART_EP*);
#endif
/**
*******************************************************************************
* @file Mid_Uart.c
* @version V1.0 仅普通TTL串口通信功能
* @date 2012.01.18
* @brief MidInterface of UART 串口中间层接口.
*******************************************************************************
* @copy EPhon
*
* INTERNAL FILE,DON'T PUBLIC.
*
* <h2><center>© COPYRIGHT 2012 EPhon </center></h2>
*******************************************************************************
*/
/*---------------------------- Include ---------------------------------------*/
#include "Mid_Uart.h"
/*---------------------------- Variable Define -------------------------------*/
/*---------------------------- Function Declare ------------------------------*/
/**
*******************************************************************************
* @brief UART Setting 串口设置
* @param[in] strUART Address of Structure for Configuration配置参数结构体首地址
* @retval 0 Setting Error.设置失败
* @retval 1 Setting is successful.设置成功
*
* @par Description
* @details This function use to set for UART.
* @note
*******************************************************************************
*/
uint8_t SetUART(STR_UART_EP *strUART){
if(!strUART->DevEnable)
DrvUART_Close(strUART->DevID);
else
{
if(DrvUART_Open(strUART->DevID, &(strUART->StrSet)) != E_SUCCESS)
return 0;
DrvGPIO_InitFunction(strUART->DevIO);
if(strUART->IntEnable)
DrvUART_EnableInt(strUART->DevID, strUART->IntMode, strUART->IntHandle);
else
DrvUART_DisableInt(strUART->DevID, strUART->IntMode);
}
return 1;
}
其实用这种方法去配置片上设备还有一个重要的考虑,就是能加入一定的默认配置,比如说我希望“数据位8位 停止位1位 校验位无”等等这些一般通用的配置可以作为一种默认配置,不需要开发者每次都不厌其烦地去复制一遍,既麻烦,也冗杂。可是我想希望给那个类似“类”的结构体“DevUART”写一个构造函数,却无法通过编译,貌似那是C++才有的语法(本人还不懂C++)。不知道有没有办法可以实现我这个让结构体的元素可以有一个默认的初始值。或者如果想用C++去写程序(像Lee老师写LOOK一样),貌似是需要MDK 4.2以上版本以及sourcery G++?关键是这个G++不知道去哪下啊,官网上的好像是7天试用版,根本不够用啊。望高手指点。 |