WinCE下调试串口的动态复用,自动Porter率_LPC1220_UA帕杰罗T_AUTOBAUD葡萄娱乐场

     
车机项目中用到了无数串口外设,如mp3机芯、GPS、蓝牙伍.0、雷达和轮胎压力监测等,而主CPU(TCC8玖XX)与小MCU(STM3二)之间也是经过串口通讯的。近年来之间,串口使用有点捉襟见肘的觉得,只可以把调节和测试串口拿出去用做普通串口。

2013年3月31日 17:00:11

     
调试串口用作常常串口自个儿没什么难点,以前在S3C贰四十上也做过。当时是把二4拾的调节和测试串口强制改为一般串口,系统运行后调节和测试串口就不可能符合规律使用了。但当下的品类仍在越发完善内部,调试串口照旧十分重要的,日常索要经过它,抓一些TRACE来分析和定位难题。所以,希望UALX570T0能在调节串口和平常串口之间方便切换。


     
同临时刻,UA昂科雷T0既用作调试串口,又作为平时串口就像一点都不大概,并且意义也非常小。思量了三个简练的法子,系统暗许将UA途锐T0用作普通串口,要求抓取TRACE时,在应用程序中配置UA卡宴T0的行事格局为调节和测试串口,然后重启系统。

工程文件地点:

     
熟习WinCE陆.0开首过程的都明白,调节和测试串口的开始化是在WinCE内核运转的最开头段,《S3C二四拾下WinCE陆.0的运行进度详解》曾有介绍,感兴趣的话能够看一看。调节和测试串口的初阶化代码一般在BSP目录下的Src\OAL\OALLIB\debug.c文件中。在该公文中驷不如舌做了两处修改,如下。

E:\Documents\program\Routine\example\LPC1220_UART\LPC1220_UART_AUTOBAUD\LPC1220_UART_AUTOBAUD.xmp

1 void OEMInitDebugSerial() 
2 {
3     pVirtualBOOTARGS = (tSYSTEM_PARAM *)OALPAtoVA(SYSTEM_PARAM_BASEADDRESS,FALSE);
4 }

main.c文件的内容:

    此处扩大了取得系统安插参数的虚拟地址。


 1 //——————————————————————————
 2 //
 3 //  Function:  OEMWriteDebugString
 4 //
 5 //  Output unicode string to debug serial port
 6 //
 7 VOID OEMWriteDebugString(UINT16 *string)
 8 {
 9     if (!pVirtualBOOTARGS->SysConfig.fDisableDebugSerial)
10     {
11         while (*string != L’\0′) OEMWriteDebugByte((UINT8)*string++);
12     }
13 }

 

     
当中,pVirtualBOOTA奥迪Q7GS->SysConfig.fDisableDebugSerial为控制调节和测试串口是或不是正规输出字符的变量。SysConfig是保存在NAND
Flash中一定区域的2个结构体,BOOT运转时能够读取到,并且位居内部存储器的钦定地点。应用程序中得以修改该协会,相关代码如下。

  1   
/****************************************Copyright
(c)****************************************************
  2    **                            Guangzhou ZLGMCU Development Co.,
LTD
  3    **
  4    **                                 http://www.zlgmcu.com
  5    **
  6    **————–File
Info———————————————————————————
  7    ** File name:           main.c
  8    ** Last modified Date:  2010-11-04
  9    ** Last Version:        V1.0
10    ** Descriptions:        The main() function example template
11    **
12   
**——————————————————————————————————–
13    ** Created by:          He Zengfu
14    ** Created date:        2010-11-20
15    ** Version:             V1.00
16    ** Descriptions:        整理模板,添加用户应用程序
17    **
18   
**——————————————————————————————————–
19    ** Modified by:         Wu Yuanlang
20    ** Modified date:       2010-12-20
21    ** Version:             V1.00
22    ** Descriptions:        编写UA奥迪Q3T自动Porter率例程
23    **
24   
**——————————————————————————————————–
25    ** Modified by:         Wu yuanlang
26    ** Modified date:       2010-12-24
27    ** Version:             V1.00
28    ** Descriptions:       
检查、测试程序,并加上、修改注释和顺序风格
29    **
30    ** Rechecked by:
31   
*********************************************************************************************************/
32    #include “lpc12xx_libcfg.h”
33    #include “stdio.h”
34    #include “led.h”
35   
36   
/*********************************************************************************************************
37      宏定义
38   
*********************************************************************************************************/
39    #define UART_LCR_DLAB_EN   
((uint8_t)(1<<7))                           /* 除数锁存位  
ox80                */
40    #define UART_ACR_START     
((uint32_t)(1<<0))                          /*
自动Porter率运维位   0x0一          */
41   
42    #define UART_PORT          
1                                           /* 定义使用的UA奥迪Q7T端口     
使用串口1     */
43   
44    //根据串口,选拔相当的串口定义.
45    #if (UART_PORT == 0)
46    #define TEST_UART LPC_UART0
47    #define TEST_UART_RXD  IOCON_UART_RXD0_LOC0
48    #define TEST_UART_TXD  IOCON_UART_TXD0_LOC0
49   
50    #elif (UART_PORT == 1)
51    #define TEST_UART LPC_UART1
52    #define TEST_UART_RXD  IOCON_UART_RXD1_LOC0
53    #define TEST_UART_TXD  IOCON_UART_TXD1_LOC0
54    #endif
55   
56   
/*********************************************************************************************************
伍柒      全局变量定义
58   
*********************************************************************************************************/
59    uint8_t 
GucDlm;                                                        /*
用于保存波特率的除数寄存器值 */
60    uint8_t  GucDll;
61    uint32_t GulBaud;
62    char     GcStr[64];
63   
64   
/*********************************************************************************************************
65    ** Function name:       uartInit
66    ** Descriptions:       
串口伊始化,设置为七个人数据位,一人甘休位,无奇偶校验
67    ** input parameters:    无
68    ** output parameters:   无
69    ** Returned value:      无
70   
*********************************************************************************************************/
71    void uartInit (void)
72    {
73        UART_CFG_Type      UARTConfigStruct;
74        IOCON_PIO_CFG_Type PIO_mode;
75   
76        IOCON_StructInit(&PIO_mode);
77       
78       
79        /* 设置引脚为TXD、ENVISIONXD功效 */
80        PIO_mode.type = TEST_UART_RXD;
81        IOCON_SetFunc(&PIO_mode);
82        PIO_mode.type = TEST_UART_TXD;
83        IOCON_SetFunc(&PIO_mode);
84       
85       
86          
87    #if (UART_PORT ==
0)                                                    /*
打开UACR-VT石英钟模块             */
88        SYS_ResetPeripheral(SYS_PRESETCTRL_UART0_QX56ST,DISABLE);   
//复位外设
89        SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_UAPAJEROT0, ENABLE);        
//外设机械钟配置   
90        SYS_SetUA凯雷德T0ClockDiv(一);                               
//设置分频周密                
91    #endif
92   
93    #if (UART_PORT == 1)
94        SYS_ResetPeripheral(SYS_PRESETCTRL_UART1_RST,DISABLE);
95        SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_UART1, ENABLE);
96        SYS_SetUART1ClockDiv(1);
97    #endif
98       
99        UART_Init(TEST_UAQX56T);     
//初叶化串口//复位串口                    /*
使能UART                     */
100   
101        /* 将参数赋值给UA索罗德TConfigStruct */   
102        UART_GetConfig(TEST_UA哈弗T, &UA翼虎TConfigStruct);     
//将扭转的空结构体作为明日要用的串口的安排结构体.
103       
104         /* 设置为8位数据                */
105        UARTConfigStruct.databits = UART_CFG_DATABIT_八; 
//以后配备结构体:设置为七人数据.    
106       
107        /* 更新配备参数                 */
108        UART_SetConfig(TEST_UA奥德赛T, &UAKoleosTConfigStruct); 
//对结构体成员赋值.
109       
110        /* 使能发送作用                 */
111        UART_ConfigTXD(TEST_UART, ENABLE);               
//                              
112    }
113   
114   
/*********************************************************************************************************
115    ** Function name:       uartSendByte
116    ** Descriptions:       
向串口发送字节数据,并等候数据发送完结,使用查询办法
117    ** input parameters:    ucDat:   要发送的多寡
118    ** output parameters:   无
119    ** Returned value:      无
120   
*********************************************************************************************************/
121    void uartSendByte (uint8_t ucDat)
122    {
123        UART_Send(TEST_UART, &ucDat, 1,
UART_BLOKING_TIMEOUT);              /* 写入数据                    
*/
124        while (!(UART_GetLineStatus(TEST_UART) &
UART_LS_TX_EMPTY_ALL));    /* 等待数据发送完结             */
125    }
126   
127   
/*********************************************************************************************************
128    ** Function name:       uartSendStr
129    ** Descriptions:        向串口发送字符串
130    ** input parameters:    pucStr:  要发送的字符串指针
131    ** output parameters:   无
132    ** Returned value:      无
133   
*********************************************************************************************************/
134    void uartSendStr (char *pcStr)
135    {
136        while (1){
137            if (*pcStr == ‘\0’)
break;                                      /*
遭逢截止符,退出             */
138            uartSendByte(*pcStr++);
139        }
140    }
141   
142   
/*********************************************************************************************************
143    ** Function name:       main
144    ** Descriptions:        主函数(函数入口)
145    **     串口参数:      
UACRUISERTPorter率9600、九个数据位、三个截止位、无奇偶校验位
146    **     跳线连接:      
P0.8(奔驰M级XD一)、P0.九(TXD壹)(若选拔UAGL450T0则总是P0.一(揽胜XD0)和P0.二(TXD0))通过23贰电平
147    **                     
转换芯片分别连接到PC机串口的TXD、ENCOREXD;
148    **     操作方法:      
打开串口调试软件,运转程序,下位机等待PC向串口发送字符’a’或’A’,观望呈现窗口
149    **     现    象:       串口调试软件显示当前波特率
150    ** input parameters:    无
151    ** output parameters:   无
152    ** Returned value:      无
153   
*********************************************************************************************************/
154    int main (void)
155    { 
156       
SystemInit();                                                       /*
系统挂钟初步化               */
157        SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_IOCON,
ENABLE);                     /* IOCON模块机械钟使能                */
158        SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_GPIO1,
ENABLE);                     /* GPIO①石英钟使能                */
159   
160       
ledInit();                                                          /*
LED初始化                    */
161   
162       
163        
uartInit();                                                         /* 
串口早先化                  */
164       
165        while (1) {
166           
167       
168                                                                           
/* 运维自动波特率               */
169            UART_StartAutoBaud(TEST_UART,
UART_CFG_AUTOBAUD_MODE0, UART_CFG_ABRESTART_ENABLE);
170           
171            /* 等待总结Porter率达成           */
172            while (TEST_UART->ACR & UART_ACR_START)    //  
(ACR=1) 与    (UART_ACR_STA奥迪Q3T=1)   
//在自动Porter率功效结束后,系统会清除UARAV4T_ACR_START此位。               
173            {
17四            //等待的长河当中闪烁.   
175            ledOn();
176            myDelay(100);
177            ledOff();
178            myDelay(200);
179           
180            }
181               
182             /* 读取除数锁存器             */ 
18三            //在LC本田UR-V的DLAB=1的前提下读取DLL,DLM,然后去掉LCPAJERO的DLAB 
184            TEST_UART->LCR |=
UART_LCR_DLAB_EN;                          
185            GucDll          = TEST_UART->DLL;
186            GucDlm          = TEST_UART->DLM;
187            TEST_UART->LCR &= ~UART_LCR_DLAB_EN;
188           
189            /* Porter率总括,存在一定的引用误差   */   
190            //波特率计算公式:
UA奥迪Q3Tbaudrate=PCLK/(1六*(256*DLM+DLL)*(1+DivAddVal/MulVal))
191            GulBaud    = (MainClock / (16 * (256 * GucDlm +
GucDll)));
192           
193            /* 处理要发送的数量,然后向串口发送字符串            
*/
194            //函数原型int sprintf( char *buffer, const char *format
[, argument] … );
1九5            // (壹)格式化字符串上。
196            //  (2)字符/Ascii 码对照
197            //   (三)连接字符串
1玖捌            //四个参数,保存数据的指标指针,格式,数据源指针.  
将数据源格式化保存到数码指标指针处.
199            sprintf(GcStr, ” Baud is %4d bps \n”, GulBaud);
200            uartSendStr(GcStr);               
201           
202        }  
203    }
204   
205    #ifdef  DEBUG
206   
/*********************************************************************************************************
207    ** Function name:       check_failed
208    ** Descriptions:
209    ** input parameters:    无
210    ** output parameters:   无
211    ** Returned value:      无
212   
*********************************************************************************************************/
213    void check_failed (uint8_t *file, uint32_t line)
214    {
215       
while(1);                                                           /*
Infinite loop                */
216    }
217   
218    #endif
219   
220   
/*********************************************************************************************************
221    End Of File
222   
*********************************************************************************************************/

 1 void SysDisableDebugSerial(int nDisable)
 2 {
 3     GetSysConfig(&gSYSCONFIG);
 4     gSYSCONFIG.fDisableDebugSerial = nDisable;
 5     SetSysConfig(&gSYSCONFIG);
 6 }
 7 
 8 
 9 
10 void CSysAppDlg::OnBnClickedCheckDebugserial()
11 {
1贰     // TODO: 在此添加控件布告处理程序代码
13     CReg Reg;
14 
15     UpdateData(TRUE);
16     SysDisableDebugSerial(m_bDisableDebugSerial);
17 
18     Reg.Open(HKEY_LOCAL_MACHINE, _T(“Drivers\\BuiltIn\\Serial3”), KEY_ALL_ACCESS);
19     Reg.SetSZ(_T(“Dll”), m_bDisableDebugSerial ? _T(“tcc_serial.dll”) : _T(“-tcc_serial.dll”));
20     Reg.Flush();
21 }


      
能够看来,在改动变量fDisableDebug塞里al的还要,还亟需修改UAHavalT0对应的注册表。在禁止使用调节和测试串口时,DLL键值设置为科学的,在启用调节和测试串口时,DLL键值前加壹当中横杠。确定保证UA奥德赛T0要么用作调节和测试串口,要么用作日常串口,贰者必居其壹。应用程序设置界面如下图所示。

上面详细分析那几个函数和调用到的函数.

      葡萄娱乐场 1

对于串口的寄存器,先列表出来他们:

     
经测试,以上修改基本达成了预测的效益,实现了WinCE下调节和测试串口的动态复用。

葡萄娱乐场 2

我们用的要害是

DLL  除数锁存器的最低有效位 DLLSB

DLM 除数锁存器的参天有效位 DLMSB

LCQX56 线路控制寄存器

FDTiggo 小数分频寄存器

AC卡宴 自动Porter率控制寄存器

波特率的总计公式如下:

葡萄娱乐场 3

 

 

 

葡萄娱乐场 4

 

1.宏定义:


#define UART_LCR_DLAB_EN   
((uint8_t)(1<<7))                           /* 除数锁存位  
ox80                */
#define UART_ACR_START     
((uint32_t)(1<<0))                          /*
自动Porter率运行位   0x01          */


 

那五个宏定义分别对应的是

LC翼虎 线路控制寄存器中的DLAB位(除数锁存器访问位(DLAB) 包罗在LCHaval[7]
中,可完成对除数锁存器的造访。[本条位很要紧,从上边包车型地铁寄存器表的备注能够看到那个位的情事是很多操作的前提.])

AC昂科威 自动Porter率控制寄存器的SAT汉兰达T位 (自动Porter率运维位)

 

二.串口引脚寄存器宏定义(起别称):


4四    //依据串口,选取适用的串口定义.
45    #if (UART_PORT == 0)
46    #define TEST_UART LPC_UART0
47    #define TEST_UART_RXD  IOCON_UART_RXD0_LOC0
48    #define TEST_UART_TXD  IOCON_UART_TXD0_LOC0
49   
50    #elif (UART_PORT == 1)
51    #define TEST_UART LPC_UART1
52    #define TEST_UART_RXD  IOCON_UART_RXD1_LOC0
53    #define TEST_UART_TXD  IOCON_UART_TXD1_LOC0
54    #endif


出于有多少个串口,所以经过串口的精选来定义相关的引脚寄存器

三.用来总计和封存Porter率的全局变量


59    uint8_t 
GucDlm;                                                        /*
用于保存Porter率的除数寄存器值 */
60    uint8_t  GucDll;
61    uint32_t GulBaud;
62    char     GcStr[64];


GucDlm,GucDll,居尔Bauld,GcStr分别对应DLM,DLL,BauldRate,最终发送的字符串.

四.串口开首化进程


64   
/*********************************************************************************************************
    65    ** Function name:       uartInit
    66    ** Descriptions:       
串口开端化,设置为6位数据位,1人停止位,无奇偶校验
    67    ** input parameters:    无
    68    ** output parameters:   无
    69    ** Returned value:      无
    70   
*********************************************************************************************************/
    71    void uartInit (void)
    72    {
    73        UART_CFG_Type      UARTConfigStruct;
    74        IOCON_PIO_CFG_Type PIO_mode;
    75   
    76        IOCON_StructInit(&PIO_mode);
    77       
    78       
    79        /* 设置引脚为TXD、奥迪Q伍XD功效 */
    80        PIO_mode.type = TEST_UART_RXD;
    81        IOCON_SetFunc(&PIO_mode);
    82        PIO_mode.type = TEST_UART_TXD;
    83        IOCON_SetFunc(&PIO_mode);
    84       
    85       
    86          
    87    #if (UART_PORT ==
0)                                                    /*
打开UALX570T石英钟模块             */
    88       
SYS_ResetPeripheral(SYS_PRESETCTRL_UART0_XC60ST,DISABLE);   
//复位外设
    89        SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_UART0, ENABLE);        
//外设挂钟配置   
    90        SYS_SetUA猎豹CS六T0ClockDiv(一);                               
//设置分频全面                
    91    #endif
    92   
    93    #if (UART_PORT == 1)
    94       
SYS_ResetPeripheral(SYS_PRESETCTRL_UART1_RST,DISABLE);
    95        SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_UART1, ENABLE);
    96        SYS_SetUART1ClockDiv(1);
    97    #endif
    98       
    99        UART_Init(TEST_UA中华VT);     
//起始化串口//复位串口                    /*
使能UART                     */
   100   
   101        /* 将参数赋值给UA本田UR-VTConfigStruct */   
   102        UART_GetConfig(TEST_UAXC90T, &UATiguanTConfigStruct);     
//将扭转的空结构体作为前日要用的串口的布置结构体.
   103       
   104         /* 设置为8位数据                */
   105        UARTConfigStruct.databits = UART_CFG_DATABIT_8; 
//以往计划结构体:设置为陆人数据.    
   106       
   107        /* 更新配备参数                 */
   108        UART_SetConfig(TEST_UA卡宴T, &UAGL450TConfigStruct); 
//对结构体成员赋值.
   109       
   110        /* 使能发送成效                 */
   111        UART_ConfigTXD(TEST_UART, ENABLE);               
//                              
   112    }


4.1串口开头化的大致进程:

空串口配置结构体

空引脚配置结构体

IO引脚配置结构体起先化

用引脚寄存器 给引脚配置结构体赋值,设置引脚为TXD、福睿斯XD.

依照串口号来:复位外设,配置外设石英钟,设置分频全面.

复位串口,

将转移的空结构体作为前天要用的串口的计划结构体.

串口配置结构体成员赋值.

串口发送使能

4.2空串口配置结构体


UART_CFG_Type      UARTConfigStruct;

 

typedef struct {
    uint32_t    baudrate;  /* !< UART baud rate */  波特率
    uint8_t     databits;  /* !< Number of data bits
                                            This parameter can be a
value of @ref UART_databit_type */ //数据位
    uint8_t     stopbits;  /* !< Number of stop bits 
                                            This parameter can be a
value of @ref UART_stopbit_type */ //停止位
    uint8_t     parity;    /* !< Parity selection 
                                            This parameter can be a
value of @ref UART_parity_type */ //优先级
    uint8_t     fifolevel; /* !< Rx FIFO trigger level 
                                            This parameter can be a
value of @ref FIFO_level_type */  //FIFO等级
    uint8_t     fifodma;   /* !< DMA mode 
                                            This parameter can be a
value of @ref FIFO_dmamode_type */ //FIFO直接内部存款和储蓄器读取
    uint8_t     txdbreak;  /* !< enable: TXD forceed to logic 0
                                            This parameter can be a
value of @ref TXD_break_forced_type */  //txdbreak 中断?
} UART_CFG_Type;


 

四.三空IO引脚配置结构体


IOCON_PIO_CFG_Type PIO_mode;

typedef struct {
    uint16_t    type;     /*!< low 八 bits is address offset, other
is func >//低多个人是地点偏移,别的的是效果函数
                                                 This parameter can be a
value of @ref PIO_type */
    uint8_t     pinmode;  /*!<  Pin mode >引脚形式
                                                 This parameter can be a
value of @ref PIO_pin_mode */
    uint8_t     invert;   /*!<  Inverted function >电平反转
                                                 This parameter can be a
value of @ref Invert_input_mode */
    uint8_t     ad;       /*!<  analog/digital mode >AD模数
                                                 This parameter can be a
value of @ref Analog_digital_mode */
    uint16_t    pmode;    /*!<  Push/pull mode for I2C
>I2C类型,上拉要么推挽.
                                                 This parameter can be a
value of @ref Push_Pull_mode */
    uint16_t    od;       /*!<  Open drive >开漏形式
                                                 This parameter can be a
value of @ref Open_drain_mode */
    uint16_t    drive;    /*!<  Pin driver function
>驱动电流形式
                                                 This parameter can be a
value of @ref Drive_current_mode */
    uint16_t    sm;       /*!<  萨姆ple mode >采集样品格局
                                                 This parameter can be a
value of @ref Sample_mode */
    uint32_t    cd;       /*!<  Clock Divider
>选取用于输入滤波器采集样品机械钟的外设石英钟分频器
                                                 This parameter can be a
value of @ref clock_divider_num */
} IOCON_PIO_CFG_Type;


随便列举二个引脚寄存器的各位的表示,例如:PIO贰_11

葡萄娱乐场 5葡萄娱乐场 6

肆.四IO引脚布局结构体起首化


IOCON_StructInit(&PIO_mode);


这边调用了IOCON_StructInit函数,

void IOCON_StructInit ( IOCON_PIO_CFG_Type \mode)
{
   mode->type = 0x0;
   mode->pinmode = IOCON_PIO_MODE_PULLUP;
   mode->invert = IOCON_PIO_INV_NOT;
   mode->pmode = IOCON_PIO_PMODE_DISABLE;
   mode->od = IOCON_PIO_OD_DISABLE;
   mode->drive = IOCON_PIO_DRV_2MA_12MA;
   mode->ad = IOCON_PIO_AD_DIGITAL;
   mode->sm = IOCON_PIO_SMODE_BYPASS;
   mode->cd = IOCON_PIO_CLKDIV_0;
}*

能够看到,那里只是给空的IO引脚配置结构体赋值(相当于上电复位).

四.5用引脚寄存器 给引脚配置结构体赋值,设置引脚为TXD、HummerH二XD.


/* 设置引脚为TXD、GL450XD功效 */
    PIO_mode.type = TEST_UART_RXD;
    IOCON_SetFunc(&PIO_mode);
    PIO_mode.type = TEST_UART_TXD;
    IOCON_SetFunc(&PIO_mode);


能够见到通过给IO引脚配置寄存器结构体赋值累配置为TXD也许福特ExplorerXD

此间调用了IOCON_SetFunc函数

void IOCON_SetFunc ( IOCON_PIO_CFG_Type \mode)
{
    uint32_t offset;
    uint32_t func; 
    uint32_t tmp;
    uint32_t *p = (uint32_t *)&LPC_IOCON->PIO2_28;*

*    CHECK_PARAM( PARAM_IOCON_PIO_TYPE(mode->type) );
    CHECK_PARAM( PARAM_IOCON_PIO_MODE(mode->pinmode));
    CHECK_PARAM( PARAM_IOCON_PIO_DRV(mode->drive) );
    CHECK_PARAM( PARAM_IOCON_PIO_AD(mode->ad) );
    CHECK_PARAM( PARAM_IOCON_PIO_OD(mode->od));  
    CHECK_PARAM( PARAM_IOCON_PIO_INV(mode->invert) );
    CHECK_PARAM( PARAM_IOCON_PIO_SMODE(mode->sm));
    CHECK_PARAM( PARAM_IOCON_PIO_CLKDIV(mode->cd));*

*    offset = (mode->type >> 6);
    func = (mode->type & 0xf);*

*    if(offset == 0x24 || offset == 0x25){ //0x90, 0x94 right shift 2
bit
       tmp =
(uint32_t)(func|(mode->pmode)|(mode->od)|(mode->invert)|(mode->sm)|(mode->cd));*

*    }else{
       tmp =
(uint32_t)(func|(mode->pinmode)|(mode->drive)|(mode->ad)|(mode->od)|(mode->invert)|(mode->sm)|(mode->cd));
    }
    *(uint32_t *)(p + offset) = tmp;
}*

对应于IO引脚配置寄存器的Func域.

四.陆依照串口号来:复位外设,配置外设石英钟,设置分频周详.


#if (UART_PORT ==
0)                                                    /*
打开UA锐界T时钟模块             */
    SYS_ResetPeripheral(SYS_PRESETCTRL_UART0_汉兰达ST,DISABLE);   
//复位外设
    SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_UA揽胜T0, ENABLE);        
//外设时钟配置   
    SYS_SetUAHighlanderT0ClockDiv(一);                               
//设置分频周密                
#endif

#if (UART_PORT == 1)
    SYS_ResetPeripheral(SYS_PRESETCTRL_UART1_RST,DISABLE);
    SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_UART1, ENABLE);
    SYS_SetUART1ClockDiv(1);
#endif


能够看到此间有四个基本点步骤:复位外设,外设机械钟配置,设置分频周到.

复位外设

调用了SYS_ResetPeripheral函数,

/\*
  * @brief  Reset peripheral复位外设.
  *
  * @param  CRUISERSTBlock: Peripheral type 外设类型. 
  * @param  CmdState: Command State.  命令状态
  *         This parameter can be DISABLE or ENABLE.
  * @retval None.
  */
void SYS_ResetPeripheral(uint32_t RSTBlock, FunctionalState
CmdState)
{
    if (CmdState == ENABLE){
        LPC_SYSCON->PRESETCTRL &= ~(RSTBlock);
    } else {
        LPC_SYSCON->PRESETCTRL |= (RSTBlock);
    }
}*

外设机械钟配置

调用了SYS_ConfigAHBCLK函数,

/\*
  * @brief  Disable or enable system and peripheral clock.
  *
  * @param  AHBClk_Type: AHB clock type.外设机械钟类型
  * @param  CmdState: Enable or disable the clock for System or
  *                      peripheral blocks.  命令状态
  *         This parameter can be ENABLE or DISABLE. 
  * @retval None.
  */               
void SYS_ConfigAHBCLK(uint32_t AHBClk_Type, FunctionalState
CmdState)
{
    if(CmdState) LPC_SYSCON->SYSAHBCLKCTRL |= AHBClk_Type;
    else LPC_SYSCON->SYSAHBCLKCTRL &= ~(AHBClk_Type);
}*

设置分频全面

调用了SYS_SetUART0ClockDiv函数

/\*
  * @brief  Set clock divider value for UART0.
  *
  * @param  DivNum: The divider for UART0 clock. 
  *         This parameter can be one of the following values:
  *             @arg 0: disable UART0
  *             @arg 1~255: Divided by this number
  * @retval None.
  *                FUART0 = FMainClk / DivNum
  */
void SYS_SetUART0ClockDiv(uint32_t DivNum)
{
    LPC_SYSCON->UART0CLKDIV = (DivNum & 0xFF);
}*

DivNum & 0xFF ,1 与0xFF,还是为1.

肆.7复位串口,


UART_Init(TEST_UALX570T);      //起头化串口//复位串口                   
/* 使能UART                     */


调用了UART_Init函数

/\
  * @brief       Initializes the UA途锐Tx
peripheral.开端化串口外设.//开头化能够知道为复位么?
  * @param    UARTx   UART peripheral selected, should be LPC_UART0,
LPC_UA中华VT一.选项的串口(LPC_UART0或者LPC_UART1)
  * @return     None
  */
void UART_Init(LPC_UART_TypeDef *UARTx)
{
    volatile uint32_t tmp;       
//volatile关键字的效率是防范编写翻译器对词条语句进行优化.
    CHECK_PARAM(PARAM_UARTx(UARTx));*

*    UAGL450Tx->FD凯雷德 = 0x10;           //set to default value: 0x10小数分频寄存器。生成波特率分频器的石英钟输入*

*    /* Empty the registers */
    UARTx->FCR = ( UART_FCR_FIFO_EN | UART_FCR_RX_RS |
UART_FCR_TX_RS);*

*    while (UARTx->LSR & UART_LS_RX_DATA_READY){
        tmp = UARTx->RBR;        // Dummy reading
    }*

*    UARTx->TER = UART_TER_TXEN;
    while (!(UARTx->LSR & UART_LS_TX_EMPTY));  // Wait for current
transmit complete*

*    UARTx->TER = 0;             // Disable Tx
    UARTx->IER = 0;             // Disable interrupt
    UARTx->LCR = 0;             // Set LCR to default state
    UARTx->ACR = 0;             // Set ACR to default state
   
    if (UARTx == LPC_UART0){  
#ifdef _MODEM       
        UARTx->MCR = 0;         // Set Modem Control to default
state
        tmp = UARTx->MSR;       // Dummy Reading to Clear Status
#endif       
#ifdef _RS485       
        UARTx->RS485CTRL = 0;   // Set RS485 control to default
state
        UARTx->ADRMATCH = 0;    // Set RS485 addr match to default
state
        UARTx->RS485DLY = 0;    // Set RS485 delay timer to default
state
#endif       
    }
#ifdef _IRDA
    else{
   
        UARTx->ICR = 0;         // Set IrDA to default state
    }
#endif
    tmp = UARTx->LSR;           // Dummy reading*

*    tmp = uart_get_num(UARTx);*

*    UART_Configration[tmp].baudrate = 0;
    UART_Configration[tmp].databits = UART_CFG_DATABIT_8;
    UART_Configration[tmp].stopbits = UART_CFG_STOPBIT_1;
    UART_Configration[tmp].parity = UART_CFG_PARITY_NONE;
    UART_Configration[tmp].fifolevel = UART_CFG_FIFOTRG_1;
    UART_Configration[tmp].fifodma = UART_CFG_DMAMODE_DISABLE;
    UART_Configration[tmp].txdbreak = UART_CFG_TXDBREAK_DISABLE;*

}

4.八将转变的空结构体作为后天要用的串口的配备结构体.


/* 将参数赋值给UA本田UR-VTConfigStruct */   
    UART_GetConfig(TEST_UAEnclaveT, &UA汉兰达TConfigStruct);     
//将转变的空结构体作为当今要用的串口的配备结构体.


/\
  * @brief     Get configuration the UARTx according to the specified
parameters in the UART_CFG_Type.
  *             将扭转的空结构体作为当今要用的串口的布署结构体.
  * @param   UARTx   UART peripheral selected, should be LPC_UART0,
LPC_UART1.
  * @param   config    UART_ConfigStruct Pointer to a UART_CFG_Type
structure
  *                             that contains the configuration
information for the specified UART periphera.
  * @return    None
  */*

void UART_GetConfig(LPC_UART_TypeDef \UARTx, UART_CFG_Type
*config)
{
    uint32_t tmp;*

*    CHECK_PARAM(PARAM_UARTx(UARTx));
    tmp = uart_get_num(UARTx);
    *config = UART_Configration[tmp];
}*

肆.9串口配置结构体成员赋值.


/* 设置为8位数据                */
    UARTConfigStruct.databits = UART_CFG_DATABIT_8; 
//现在布局结构体:设置为6位数据. 


4.十对结构体成员赋值.更新配备参数


/* 更新配备参数                 */
    UART_SetConfig(TEST_UAKugaT, &UAEvoqueTConfigStruct);  //对结构体成员赋值.


 

/\
  * @brief   Config the UARTx according to the specified parameters in
the UART_CFG_Type.
  * @param UARTx   UART peripheral selected, should be LPC_UART0,
LPC_UART1.
  * @param config    UART_ConfigStruct Pointer to a UART_CFG_Type
structure
  *                          that contains the configuration
information for the specified UART periphera.
  * @return  None
  */
void UART_SetConfig(LPC_UART_TypeDef *UARTx, UART_CFG_Type
*config)
{
    uint8_t tmp;*

*    CHECK_PARAM(PARAM_UARTx(UARTx));
    CHECK_PARAM(PARAM_UART_DATABIT(config->databits));
    CHECK_PARAM(PARAM_UART_PARITY(config->parity));
    CHECK_PARAM(PARAM_UART_STOPBIT(config->stopbits));
    CHECK_PARAM(PARAM_UART_FIFO_LEVEL(config->fifolevel));
    CHECK_PARAM(PARAM_UART_FIFO_DMA(config->fifodma));*

*    tmp = uart_get_num(UARTx);
   
    if(UART_Configration[tmp].baudrate != (*config).baudrate){
       
        uart_set_divisors(UARTx, (config->baudrate));       
        UART_Configration[tmp].baudrate =
(*config).baudrate;      
    }*

*    UARTx->LCR =
(((config->databits)|(config->parity)|(config->stopbits)|\
                 (config->txdbreak)) & UART_LCR_BITMASK);
  
    UARTx->FCR = ((UART_FCR_FIFO_EN |
(config->fifodma)|(config->fifolevel))&\
                   UART_FCR_BITMASK);*

*    UART_Configration[tmp].databits = (*config).databits;
    UART_Configration[tmp].stopbits = (*config).stopbits;
    UART_Configration[tmp].parity = (*config).parity;
    UART_Configration[tmp].txdbreak = (*config).txdbreak;
    UART_Configration[tmp].fifolevel = (*config).fifolevel;
    UART_Configration[tmp].fifodma = (*config).fifodma;*

*  
}*

四.1一串口发送使能


/* 使能发送作用                 */
    UART_ConfigTXD(TEST_UART, ENABLE);                // 


/\*
  * @brief    Enable/Disable transmission on UABMWX三T TxD
pin使能有些串口的出殡引脚
  * @param UARTx   UART peripheral selected, should be LPC_UART0,
LPC_UART1
  * @param NewState New State of Tx transmission function, should be:
  *                            – ENABLE: Enable this function
  *                            – DISABLE: Disable this function
  * @return none
  */
void UART_ConfigTXD(LPC_UART_TypeDef *UARTx, FunctionalState
NewState)
{
    CHECK_PARAM(PARAM_UARTx(UARTx));
    if (NewState == ENABLE) {  
        UARTx->TER |= UART_TER_TXEN;        //相或置1   x|一 = 一
    }else{
        UARTx->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK;
//(~一)&0x80 = 0.零和任意数相与为0;
    }
}*

2013年4月1日 0:

5.串口发送字节数据uartSendByte


/*********************************************************************************************************
   115    ** Function name:       uartSendByte
   116    ** Descriptions:       
向串口发送字节数据,并伺机数据发送完结,使用查询办法
   117    ** input parameters:    ucDat:   要发送的数目
   118    ** output parameters:   无
   119    ** Returned value:      无
   120   
*********************************************************************************************************/
   121    void uartSendByte (uint8_t ucDat)
   122    {
   123        UART_Send(TEST_UART, &ucDat, 1,
UART_BLOKING_TIMEOUT);              /* 写入数据                    
*/
   124        while (!(UART_GetLineStatus(TEST_UART) &
UART_LS_TX_EMPTY_ALL));    /* 等待数据发送达成             */
   125    }


 

能够见到,串口发送字节数据调用了UA大切诺基T_Send函数,

其一函数有八个参数:

  • 发送数据的串口
  • 发送的数目内容(指针)
  • 发送到数据长度

回到 已经发送到字节数.

 

/\
  * @brief    Send a block of data via UA昂科雷T
peripheral通过串口外设发送一块数据.                   
  * @param UARTx   Selected UART used to send data, should be
LPC_UART0, LPC_UART1.串口号
  * @param txbuf   Pointer to Transmit buffer数据指针
  * @param buflen  Length of Transmit buffer, a multiple of 1陆 is
better.发送数据的长短
  *                        16 is the best because the FIFO number is

  1.   * @param timeout     UART_process_time_delay definition 处理时延
      * @return  Number of bytes sent.重回已发送的bytes数.
      */
    uint32_t UART_Send(LPC_UART_TypeDef *UARTx, uint8_t *txbuf,
    uint32_t buflen,\
                           uint32_t timeout)
    {
        uint32_t bToSend, bSent, timeOut, fifo_cnt;
        uint8_t *pChar = txbuf;*

*    CHECK_PARAM(PARAM_UARTx(UARTx));
    CHECK_PARAM(PARAM_UART_PROCESS_DELAY(timeout));*

*    bToSend = buflen;*

*    bSent = 0;
    while (bToSend){
        timeOut = timeout;
        // Wait for THR empty with timeout
        while (!(UARTx->LSR & UART_LS_TX_EMPTY)) {
            if (timeOut == 0) break;
            timeOut–;
        }
        if(timeOut == 0) break;     // Time out!
        fifo_cnt = UART_TX_FIFO_SIZE;
        while (fifo_cnt && bToSend){
            UARTx->THR = ((*pChar++) & UART_THR_MASKBIT);
            fifo_cnt–;
            bToSend–;
            bSent++;
        }
    }
    return bSent;
}*

陆.串口发送字符串


127   
/*********************************************************************************************************
128    ** Function name:       uartSendStr
129    ** Descriptions:        向串口发送字符串
130    ** input parameters:    pucStr:  要发送的字符串指针
131    ** output parameters:   无
132    ** Returned value:      无
133   
*********************************************************************************************************/
134    void uartSendStr (char *pcStr)
135    {
136        while (1){
137            if (*pcStr == ‘\0’)
break;                                      /*
碰到停止符,退出             */
138            uartSendByte(*pcStr++);
139        }
140    }


串口发送字符串函数便是调用了串口发送字节函数.

那便是说总结起来, 发送字符串—>发送字节–>UAMuranoT_Send

7.主函数


142   
/*********************************************************************************************************
143    ** Function name:       main
144    ** Descriptions:        主函数(函数入口)
145    **     串口参数:      
UALX570TPorter率9600、几个数据位、二个甘休位、无奇偶校验位
146    **     跳线连接:      
P0.八(帕杰罗XD一)、P0.玖(TXD一)(若采纳UA凯雷德T0则连接P0.壹(GL450XD0)和P0.2(TXD0))通过23贰电平
147    **                     
转换芯片分别连接到PC机串口的TXD、LacrosseXD;
148    **     操作方法:      
打开串口调节和测试软件,运维程序,下位机等待PC向串口发送字符’a’或’A’,阅览显示窗口
149    **     现    象:       串口调节和测试软件展现当前Porter率
150    ** input parameters:    无
151    ** output parameters:   无
152    ** Returned value:      无
153   
*********************************************************************************************************/
154    int main (void)
155    { 

             
uartInit();                                                        
/*  串口开头化                  */

164       
165        while (1) {
166           
167       
168                                                                           
/* 运营自动Porter率               */
169            UART_StartAutoBaud(TEST_UART,
UART_CFG_AUTOBAUD_MODE0, UART_CFG_ABRESTART_ENABLE);
170           
171            /* 等待总结Porter率完毕           */
172            while (TEST_UART->ACR & UART_ACR_START)    //  
(ACR=1) 与    (UART_ACR_STA途胜T=1)   
//在机动Porter率功用截至后,系统会清除UA哈弗T_ACR_START此位。               
173            {
179           
180            }
181               
182             /* 读取除数锁存器             */ 
1八3            //在LCHaval的DLAB=一的前提下读取DLL,DLM,然后去掉LCXC90的DLAB 
184            TEST_UART->LCR |=
UART_LCR_DLAB_EN;                          
185            GucDll          = TEST_UART->DLL;
186            GucDlm          = TEST_UART->DLM;
187            TEST_UART->LCR &= ~UART_LCR_DLAB_EN;
188           
189            /* Porter率总计,存在一定的标称误差   */   
190            //Porter率总结公式:
UA奥德赛Tbaudrate=PCLK/(1陆*(256*DLM+DLL)*(1+DivAddVal/MulVal))
191            GulBaud    = (MainClock / (16 * (256 * GucDlm +
GucDll)));
192           
193            /* 处理要发送的多少,然后向串口发送字符串            
*/
1玖肆            //函数原型int sprintf( char *buffer, const char
*format [, argument] … );
195            // (一)格式化字符串上。
196            //  (2)字符/Ascii 码对照
197            //   (三)连接字符串
1九八            //八个参数,保存数据的指标指针,格式,数据源指针.  
将数据源格式化保存到数码目标指针处.
199            sprintf(GcStr, ” Baud is %4d bps \n”, GulBaud);
200            uartSendStr(GcStr);               
201           
202        }  
203    }


柒.一主函数根本流程

  1. 一.串口初步化uartInit();    
  2. 二.运行自动Porter率UA途乐T_StartAutoBaud
  3. 3.等待
  4. 4.读除数锁存器
  5. 5.乘除Porter率
  6. 陆.拍卖待发送字符串
  7. 七.基于Porter率发送字符串

7.2串口发轫化

串口起初化已经在上面讲过了,见”4.串口早先化进程”部分

七.三起动自动波特率


/*
  * @brief     Start Auto Baudrate activity运转自动Porter率活动:配置
  * @param  UARTx   UART peripheral selected, should be LPC_UART0,
LPC_UART1
  * @param  mode    UART_auto_baudrate_mode_type
串口自动Porter率情势类型
  * @param  restart   UART_auto_baudrate_restart_type
definitions串口自动Porter率复位类型
  * @return   none
  */
void UART_StartAutoBaud(LPC_UART_TypeDef *UARTx, uint8_t mode,
uint8_t restart)
{
    CHECK_PARAM(PARAM_UARTx(UARTx));
    CHECK_PARAM(PARAM_UART_AB_MODE(mode));
    CHECK_PARAM(PARAM_UART_AB_RESTART(restart));      
   
    // Clear DLL and DLM value
    //在UART_LCR_DLAB_EN置壹的前提下,清除DLL和DLM,LC凯雷德.
    UARTx->LCR |= UART_LCR_DLAB_EN; //
按位或置壹,UALANDT_LCR_DLAB_EN 串口线路控制器除数锁存器访问位 置一
    UAPRADOTx->DLL = 0;                    //DLL 除数锁存器
最低有效字节.
    UAWranglerTx->DLM = 0;                    //DLM
除数锁存器最高有效字节.
    UARTx->LCR &= ~UART_LCR_DLAB_EN;//LC揽胜决定要发送或接收的多少字符的格式.清除LCRubicon=0.
   
    // FDR value must be reset to default value
    UAHighlanderTx->FD奥迪Q伍 = 0x10;//FD酷路泽=xxxx xxxx MULVAL
DIVADDVAL;那里最终多少人为0,说明禁止使用了小数分频;如若DIVADDVAL为0,那么小数分频器将被禁止使用,并且不会对石英钟进行分频。
    UARTx->ACR = (UART_ACR_STA科雷傲T | (mode) |
(restart));//自动Porter率控制器ACLAND=UA景逸SUVT_ACR_STA库罗德T 或 mode 或
重运行.假使最终是一,那么就自动Porter率运维.


能够见到,自动Porter率设置 首要是

  1. 一.解除除数锁存器
  2. 贰.禁止小数分频器
  3. 叁.起先自动Porter率位.

7.四等候系统清除UALX570T_ACR_START


171            /* 等待总计Porter率实现           */
  172            while (TEST_UART->ACR & UART_ACR_START)    //  
(ACR=1) 与    (UART_ACR_STA索罗德T=一)   
//在机动波特率功效甘休后,系统会清除UA索罗德T_ACR_START此位。               


倘诺有二个0,那么就跳出循环.

为0的情致正是自动Porter率结束.

七.5读除数锁存器


/* 读取除数锁存器             */ 
1八三            //在LCENCORE的DLAB=一的前提下读取DLL,DLM,然后去掉LC猎豹CS陆的DLAB 
184            TEST_UART->LCR |=
UART_LCR_DLAB_EN;                          
185            GucDll          = TEST_UART->DLL;
186            GucDlm          = TEST_UART->DLM;
187            TEST_UART->LCR &= ~UART_LCR_DLAB_EN;


读除数锁存器的始末的前提是DLAB=一,读完后清零.

葡萄娱乐场 7

7.6划算Porter率


/* Porter率计算,存在一定的引用误差   */   
   190            //Porter率计算公式:
UA奥迪Q3Tbaudrate=PCLK/(1陆*(256*DLM+DLL)*(1+DivAddVal/MulVal))
   191            GulBaud    = (MainClock / (16 * (256 * GucDlm +
GucDll)));


计算波特率就二个公式:

葡萄娱乐场 8

七.7甩卖带发送的字符串

此处即将展现的字符串举办处理,彰显Porter率参数.


/* 处理要发送的多少,然后向串口发送字符串             */
   1九四            //函数原型int sprintf( char *buffer, const char
*format [, argument] … );
   1玖5            // (一)格式化字符串上。
   196            //  (2)字符/Ascii 码对照
   19七            //   (三)连接字符串
   1九捌            //多个参数,保存数据的指标指针,格式,数据源指针.  
将数据源格式化保存到多少指标指针处.
   199            sprintf(GcStr, ” Baud is %4d bps \n”, GulBaud);


重点是sprintf函数的使用.

作者们那里运用的是,将格式化后的字符串保存到GcStr中.

用参数居尔Baud 填充%四d,那么源字符串 “Baud is %4d
bps\n”,经过参数GulBaud填充后,变成了大致9600左右的数据.

最后输出

Baud is 9615 bps

七.八串口依照波特率发送数据


uartSendStr(GcStr);   


uartSendStr下面已经讲过了,见”陆.串口发送字符串”

整治时间

2013年4月1日 13:40:22