lld_uart.c
来自「本程序为ST公司开发的源代码」· C语言 代码 · 共 1,337 行 · 第 1/5 页
C
1,337 行
UART_tenSwitch LLD_UART_enSetRxEnable(UART_tenId enId, UART_tenSwitch enVal)
{
UART_tenSwitch enTemp;
if( UART_EN_0 == enId )
{
enTemp = rd16(Uart0,UART_CR,RxEnable);
/* Return current value */
if( UART_EN_CURRENT == enVal )
{
return(enTemp);
}
if( enTemp != enVal )
{
wr16(Uart0,UART_CR,RxEnable,enVal);
}
}
else if( UART_EN_1 == enId )
{
enTemp = rd16(Uart1,UART_CR,RxEnable);
/* Return current value */
if( UART_EN_CURRENT == enVal )
{
return(enTemp);
}
if( enTemp != enVal )
{
wr16(Uart1,UART_CR,RxEnable,enVal);
}
}
return(enVal);
}
/************************************************************************
* *
* FUNCTIONS *
* *
* LLD_UART_enSetRun *
* *
* DESCRIPTION *
* *
* set/reset Run enable bit on UART_CR register *
* *
* *
* CALLS *
* *
* LLD macros *
* *
* INPUTS *
* *
* UART_tenId enId: Uart identificator *
* UART_tenSwitch enVal: switch value *
* *
* OUTPUTS *
* *
* UART_SWITCH val *
* *
************************************************************************/
UART_tenSwitch LLD_UART_enSetRun(UART_tenId enId, UART_tenSwitch enVal)
{
UART_tenSwitch enTemp;
if( UART_EN_0 == enId )
{
enTemp = rd16(Uart0,UART_CR,Run);
/* Return current value */
if( UART_EN_CURRENT == enVal )
{
return(enTemp);
}
if( enTemp != enVal )
{
wr16(Uart0,UART_CR,Run,enVal);
}
}
else if( UART_EN_1 == enId )
{
enTemp = rd16(Uart1,UART_CR,Run);
/* Return current value */
if( UART_EN_CURRENT == enVal )
{
return(enTemp);
}
if( enTemp != enVal )
{
wr16(Uart1,UART_CR,Run,enVal);
}
}
return(enVal);
}
/************************************************************************
* *
* FUNCTIONS *
* *
* LLD_UART_vSetParity *
* *
* DESCRIPTION *
* *
* set/reset Parity bit on UART_CR register *
* *
* *
* CALLS *
* *
* LLD macros *
* *
* INPUTS *
* *
* UART_tenId enId: Uart identificator *
* UART_tenParity enVal: switch value *
* *
* OUTPUTS *
* *
* UART_SWITCH val *
* *
************************************************************************/
tVoid LLD_UART_vSetParity(UART_tenId enId, UART_tenParity enVal)
{
if( (enId >= UART_EN_0 ) || ( enId <= UART_EN_1) )
{
if( UART_EN_NONE == enVal )
{
if( (arUARTSetting[enId].tMode == UART_EN_EIGHT_BITS_PA) )
{
LLD_UART_vSetMode(enId, UART_EN_EIGHT_BITS);
}
if( (arUARTSetting[enId].tMode == UART_EN_SEVEN_BITS_PA) )
{
/* No 7 Bit transmission without parity supported by HW */
LLD_UART_vSetMode(enId, UART_EN_EIGHT_BITS);
}
}
else
{
UART_tenParity enTemp, enParityVal, enRunStat;
/* Bit value to be set */
enParityVal = (UART_EN_EVEN == enVal) ? UART_EN_OFF : UART_EN_ON;
if( UART_EN_0 == enId )
{
enRunStat = rd16(Uart0,UART_CR,Run); /* Read current status */
wr16(Uart0,UART_CR,Run,UART_EN_OFF); /* Stop UART before set register */
enTemp = rd16(Uart0,UART_CR,ParityOdd);
if( enTemp != enParityVal )
{
wr16(Uart0,UART_CR,ParityOdd,enParityVal);
}
wr16(Uart0,UART_CR,Run,enRunStat); /* Restore status */
}
else if( UART_EN_1 == enId )
{
enRunStat = rd16(Uart1,UART_CR,Run); /* Read current status */
wr16(Uart1,UART_CR,Run,UART_EN_OFF); /* Stop UART before set register */
enTemp = rd16(Uart1,UART_CR,ParityOdd);
if( enTemp != enParityVal )
{
wr16(Uart1,UART_CR,ParityOdd,enParityVal);
}
wr16(Uart1,UART_CR,Run,enRunStat); /* Restore status */
}
/* @@@@ToDo 18.11.2002 Ka: */
/* switch the mode to enable parity */
if( arUARTSetting[enId].tMode == UART_EN_EIGHT_BITS )
{
LLD_UART_vSetMode(enId, UART_EN_EIGHT_BITS_PA);
}
if( arUARTSetting[enId].tMode == UART_EN_SEVEN_BITS_PA )
{
LLD_UART_vSetMode(enId, UART_EN_SEVEN_BITS_PA);
}
}
arUARTSetting[enId].tParity = enVal;
}
}
/************************************************************************
* *
* FUNCTIONS *
* *
* LLD_UART_vSetStopBits *
* *
* DESCRIPTION *
* *
* set stop bit filed on UART_CR register *
* *
* *
* CALLS *
* *
* LLD macros *
* *
* INPUTS *
* *
* UART_tenId enId: Uart identificator *
* UART_tenStopBits enStopBits: Stop bit number *
* *
* OUTPUTS *
* *
* None *
* *
************************************************************************/
tVoid LLD_UART_vSetStopBits(UART_tenId enId, UART_tenStopBits enStopBits)
{
UART_tenParity enRunStat;
if( UART_EN_0 == enId )
{
enRunStat = rd16(Uart0,UART_CR,Run); /* Read current status */
wr16(Uart0,UART_CR,Run,UART_EN_OFF); /* Stop UART before set register */
/* read to mem comp to avoid other bits to be overwrite */
wr16(Uart0,UART_CR,StopBits,enStopBits);
wr16(Uart0,UART_CR,Run,enRunStat); /* Restore status */
arUARTSetting[enId].tStopBits = enStopBits;
}
else if( UART_EN_1 == enId )
{
enRunStat = rd16(Uart1,UART_CR,Run); /* Read current status */
wr16(Uart1,UART_CR,Run,UART_EN_OFF); /* Stop UART before set register */
/* read to mem comp to avoid other bits to be overwrite */
wr16(Uart1,UART_CR,StopBits,enStopBits);
wr16(Uart1,UART_CR,Run,enRunStat); /* Restore status */
arUARTSetting[enId].tStopBits = enStopBits;
}
}
/************************************************************************
* *
* FUNCTIONS *
* *
* LLD_UART_vSetMode *
* *
* DESCRIPTION *
* *
* set mode bit filed on UART_CR register *
* *
* *
* CALLS *
* *
* LLD macros *
* *
* INPUTS *
* *
* UART_tenId enId: Uart identificator *
* UART_tenMode enMode: Mode identificator *
*
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?