當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]//USART.C/******************************************************************************************

//USART.C

/*********************************************************************************************************/
/* USART 收發(fā) */
/* 陳鵬 20110611*/
#include "SYSTEM.H"
#include "GPIO_INIT.H"
#include "USART.H"


//定義串口通道號最大值
#define UART_ChMax 1




//UART外設(shè)結(jié)構(gòu)指針
static const ?USART_TypeDef * USARTxN[5] = {USART1,USART2,USART3,UART4,UART5};


//相關(guān)UART狀態(tài)結(jié)構(gòu)
typedef struct
{
FlagStatus NewDataFlag;//接收到新數(shù)據(jù)
FlagStatus BuffFull; //接收Buff滿
FlagStatus IntRx; //是否開啟中斷接收
u8 *RxBuff;//接收Buff指針
u16 RxBuffSize;//接收緩沖區(qū)大小,一幀數(shù)據(jù)大小
u16 UartRxCnt;//接收數(shù)據(jù)計數(shù)器
} UartRx_TypeDef;


//UART1 接收狀態(tài)結(jié)構(gòu)
static UartRx_TypeDef UartRx[UART_ChMax + 1];


//////////////////////////////////////////////////////////////////
//加入以下代碼,支持printf函數(shù),而不需要選擇use MicroLIB ?
#if 1
#pragma import(__use_no_semihosting) ? ? ? ? ? ??
//標(biāo)準(zhǔn)庫需要的支持函數(shù) ? ? ? ? ? ? ? ??
struct __FILE?
{?
int handle;?
/* Whatever you require here. If the only file you are using is */?
/* standard output using printf() for debugging, no file handling */?
/* is required. */?
};?
/* FILE is typedef’ d in stdio.h. */?
FILE __stdout; ? ? ??
//定義_sys_exit()以避免使用半主機模式 ? ?
_sys_exit(int x)?
{?
x = x;?
}?
//重定義fputc函數(shù)?
int fputc(int ch, FILE *f)
{ ? ? ?
UARTx_SendByte(0,(u8)ch); ? ? ?
return ch;
}
#endif?
//end
//////////////////////////////////////////////////////////////////






/*************************************************************************************************************************
* 函數(shù) : u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int)
* 功能 : 串口初始化
* 參數(shù) : ch:通道選擇,0->usart1;SYS_CLK當(dāng)前系統(tǒng)時鐘,Speed:串口速度,RX_Int:是否時能中斷接受
* 返回 : 0:成功,1:失敗
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : USART1~UART5,對應(yīng)通道0~4
*************************************************************************************************************************/
u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int)
{
USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; ? //獲取對應(yīng)通道硬件基址指針
u32 clock;
u8 irq_n;
float fclk;


if(ch > UART_ChMax)
return 1; //端口號超出范圍
//初始化UART IO
DeviceClockEnable(DEV_AFIO,ENABLE);//復(fù)用功能AFIO時鐘使能
switch (ch)
{
case 0: //通道0,USART1 ,TX:PA9;RX:PA10
{
DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 時鐘使能
DeviceClockEnable(DEV_USART1,ENABLE);//USART 1 時鐘使能
GPIOx_Init(GPIOA,BIT9,AF_PP, SPEED_10M); ? //PA09,TXD只能設(shè)置成復(fù)用推挽輸出
GPIOx_Init(GPIOA,BIT10,IN_FLOATING,IN_IN); ?//浮空輸入
DeviceReset(DEV_USART1);//復(fù)位串口1
irq_n = ?IRQ_USART1;//串口1中斷號
}break;
case 1: //通道1,USART2 ,TX:PA2;RX:PA3
{
DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 時鐘使能
DeviceClockEnable(DEV_USART2,ENABLE);//USART 2 時鐘使能
GPIOx_Init(GPIOA,BIT2,AF_PP, SPEED_10M); ? //PA2,TXD只能設(shè)置成復(fù)用推挽輸出
GPIOx_Init(GPIOA,BIT3,IN_FLOATING,IN_IN); ?//浮空輸入
DeviceReset(DEV_USART2);//復(fù)位串口2
irq_n = ?IRQ_USART2;//串口2中斷號
}break;
case 2: //通道2,USART3 ,TX:PD8;RX:PD9
{
DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 時鐘使能
DeviceClockEnable(DEV_USART3,ENABLE);//USART 3 時鐘使能
GPIOx_Init(GPIOD,BIT8,AF_PP, SPEED_10M); ? //PD8,TXD只能設(shè)置成復(fù)用推挽輸出
GPIOx_Init(GPIOD,BIT9,IN_FLOATING,IN_IN); ?//浮空輸入
DeviceReset(DEV_USART3);//復(fù)位串口3
irq_n = ?IRQ_USART3;//串口3中斷號
}break;
case 3: //通道3,UART4 ,TX:PC10;RX:PC11
{
DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 時鐘使能
DeviceClockEnable(DEV_UART4,ENABLE);//UART 4 時鐘使能
GPIOx_Init(GPIOC,BIT10,AF_PP, SPEED_10M); ? //PC10,TXD只能設(shè)置成復(fù)用推挽輸出
GPIOx_Init(GPIOD,BIT11,IN_FLOATING,IN_IN); ?//浮空輸入
DeviceReset(DEV_UART4);//復(fù)位串口3
irq_n = ?IRQ_UART4;//串口3中斷號
}break;
case 4: //通道4,UART5 ,TX:PC12;RX:PD2
{
DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 時鐘使能
DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 時鐘使能
DeviceClockEnable(DEV_UART5,ENABLE);//UART 5 時鐘使能
GPIOx_Init(GPIOC,BIT12,AF_PP, SPEED_10M); ? //PC12,TXD只能設(shè)置成復(fù)用推挽輸出
GPIOx_Init(GPIOD,BIT2,IN_FLOATING,IN_IN); ?//浮空輸入
DeviceReset(DEV_UART5);//復(fù)位串口3
irq_n = ?IRQ_UART5;//串口3中斷號
}break;
default : return 1;//端口號超出范圍,返回錯誤
}
//設(shè)置波特率分頻系數(shù)
clock = SYS_CLK * 1000000;//USART1時鐘
if(ch > 0)
clock /= 2; //USART2,3,4,5時鐘
fclk = (float)clock / 16.0 / Speed;//計算波特率分頻系數(shù)
clock = (u16)fclk;//得到波特率分頻系數(shù)整數(shù)部分
UARTx->BRR = ?clock << 4;//設(shè)置波特率整數(shù)部分
fclk -= clock;//得到波特率分頻系數(shù)小數(shù)部分
fclk *= 16;
UARTx->BRR |= 0xf & (u16)fclk;//設(shè)置波特率小數(shù)部分
//配置UART
UARTx->CR1 = 0x2000;//使能USART,1個開始位,8位數(shù)據(jù)
UARTx->CR1 |= 0x8;//置TE = 1;發(fā)送使能;發(fā)送第一個空閑位
UARTx->CR1 |= 0x04;//RE = 1;接收使能
SetUartRxBuff(ch,0,NULL);//設(shè)置串口接收緩沖區(qū)
UARTx_ClearRxInt(ch);? //清除串口接收中斷標(biāo)志
if(RX_Int)
{
UARTx->CR1 |= 0x20;//RXNEIE = 1,開RXNE中斷,即開啟接收中斷
NVIC_IntEnable(irq_n,1);//開啟USART1全局中斷
UartRx[ch].IntRx = SET;//中斷接收標(biāo)志有效
}?
else
{
NVIC_IntEnable(irq_n,0); //關(guān)閉USART全局中斷
UartRx[ch].IntRx = RESET;//中斷接收標(biāo)志無效
}
UARTx_SendByte(0,'S');//發(fā)送一字節(jié)數(shù)據(jù)
return 0; //初始化成功,返回0
}






/*************************************************************************************************************************
* 函數(shù) : u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg)
* 功能 : 串口配置
* 參數(shù) : ch:通道選擇,0->usart1;cfg:串口配置結(jié)構(gòu)指針
* 返回 : 0:成功,非0:失敗
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120408
* 最后修改時間 : 20120408
* 說明 : USART1~UART5,對應(yīng)通道0~4 ,返回1:校驗設(shè)置錯誤,2:停止位設(shè)置錯誤,3:通道超出范圍
*************************************************************************************************************************/
u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg)
{
USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; ? //獲取對應(yīng)通道硬件基址指針


if(ch > UART_ChMax)//判斷端口是否超出范圍
return 3;
UARTx_PowerDown(ch);//進入掉電模式,進行配置
switch (cfg->OddEvenVerify)//設(shè)置校驗位
{
case UART_VERIFY_NULL://無校驗
{
UARTx->CR1 &= ~BIT12;//一個起始位,8個數(shù)據(jù)位
UARTx->CR1 &= ~BIT10;//禁止校驗控制
}break;
case UART_ODD://奇校驗
{
UARTx->CR1 |= BIT12;//一個起始位,9個數(shù)據(jù)位
UARTx->CR1 |= BIT10;//使能校驗控制
UARTx->CR1 |= BIT9;//奇校驗
}break;
case UART_EVEN://偶校驗
{
UARTx->CR1 |= BIT12;//一個起始位,9個數(shù)據(jù)位
UARTx->CR1 |= BIT10;//使能校驗控制
UARTx->CR1 &= ~BIT9;//偶校驗
}break;
default :?
{
UARTx_PowerOn(ch);//串口重新上電
return 1; //設(shè)置錯誤,返回校驗設(shè)置錯誤1
}
}
if(cfg->StopBitWidth == UART_STOP_1BIT) //設(shè)置停止位
{
UARTx->CR2 &= ~(0x3 << 12);//清除設(shè)置,默認(rèn)一個停止位
}
else if(cfg->StopBitWidth == UART_STOP_2BIT)
{
UARTx->CR2 &= ~(0x3 << 12);
UARTx->CR2 |= (0x2 << 12);//2個停止位
}?
else
{
UARTx_PowerOn(ch);//串口重新上電
return 2; //停止位設(shè)置錯誤,返回錯誤2
}
UARTx_PowerOn(ch);//串口重新上電
return 0; //設(shè)置完成,返回0
}






/*************************************************************************************************************************
* 函數(shù) : void UARTx_SendByte(u8 ch,u8 data)
* 功能 : UART單字節(jié)發(fā)送
* 參數(shù) : ch:通道號,dataL:要發(fā)送的數(shù)據(jù)
* 返回 : 無
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : 通道號為0 - 4;
*************************************************************************************************************************/
void UARTx_SendByte(u8 ch,u8 data)
{
USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; ? //獲取對應(yīng)通道硬件基址指針


if(ch > UART_ChMax)//判斷端口是否超出范圍
return;


while(!(UARTx->SR & 0x80));//等待發(fā)送寄存器為空,(否則連續(xù)發(fā)送時數(shù)據(jù)易丟失 )
? UARTx->DR = data;//發(fā)送數(shù)據(jù)
while(!(UARTx->SR & 0x40));//等待TC = 1;也就是發(fā)送完成
UARTx->SR &= ~(1 << 6);//清除發(fā)送完成標(biāo)志
}






/*************************************************************************************************************************
* 函數(shù) : void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number)
* 功能 : UART數(shù)據(jù)發(fā)送函數(shù)
* 參數(shù) : ch:通道號,tx_buff:發(fā)送緩沖區(qū),byte_number:需要發(fā)送的字節(jié)
* 返回 : 無
* 依賴 : void UART_SendByte(u8 ch,u8 data)
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : 非DMA方式,非FIFO方式發(fā)送
*************************************************************************************************************************/
void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number)
{
u8 i;


if(ch > UART_ChMax)//判斷端口是否超出范圍
return;
for(i = 0;i < byte_number;i++)//循環(huán)發(fā)送,直至發(fā)送完畢
{
UARTx_SendByte(ch,tx_buff[i]);
}
}






/*************************************************************************************************************************
* 函數(shù) : void UARTx_PowerDown(u8 ch)
* 功能 : UART掉電
* 參數(shù) : ch:通道選擇
* 返回 : 無
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : 進入低功耗模式;通道號為0 - 4;
*************************************************************************************************************************/
void UARTx_PowerDown(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return;
((USART_TypeDef *)USARTxN[ch])->BRR |= (1 << 13);//UE位寫一,開啟低功耗
}




/*************************************************************************************************************************
* 函數(shù) : void UARTx_PowerOn(u8 ch)
* 功能 : UART上電
* 參數(shù) : ch:通道選擇
* 返回 : 無
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : 退出低功耗模式;通道號為0 - 4;
*************************************************************************************************************************/
void UARTx_PowerOn(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return;
? ((USART_TypeDef *)USARTxN[ch])->BRR &= ~(1 << 13);//UE位清零,退出低功耗模式
}






/*************************************************************************************************************************
* 函數(shù) : u8 GetUartNewFlag(u8 ch)
* 功能 : 獲取串口新數(shù)據(jù)標(biāo)志
* 參數(shù) : ch:通道選擇
* 返回 : 1:有新數(shù)據(jù),0:無新數(shù)據(jù)
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : 用于判斷是否有新的數(shù)據(jù),會清除掉新數(shù)據(jù)標(biāo)志的
*************************************************************************************************************************/
u8 GetUartNewFlag(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return 0;


if(UartRx[ch].IntRx == SET)//開啟了中斷接收
{
if(UartRx[ch].NewDataFlag == SET) //有新數(shù)據(jù)
{
UartRx[ch].NewDataFlag = RESET;//清除標(biāo)志
return 1; //返回有新數(shù)據(jù)
}
else
return 0; //無新數(shù)據(jù)
}
else //沒開啟中斷接收
{
if(((USART_TypeDef *)USARTxN[ch])->SR & BIT5)//RXNE=1,接收到新數(shù)據(jù)
{
((USART_TypeDef *)USARTxN[ch])->SR &= ~BIT5;//清除標(biāo)志
return 1;
}
else?
return 0;
}
}




/*************************************************************************************************************************
* 函數(shù) : u8 GetUartRxBuffFullFlag(u8 ch)
* 功能 : 獲取串口接收緩沖區(qū)滿標(biāo)志
* 參數(shù) : ch:通道選擇
* 返回 : 1:有新數(shù)據(jù),0:無新數(shù)據(jù)
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : 用于判斷接收緩沖區(qū)是否滿,會清除標(biāo)志
*************************************************************************************************************************/
u8 GetUartRxBuffFullFlag(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return 0;
if(UartRx[0].BuffFull == SET)//緩沖區(qū)已滿
{
UartRx[0].BuffFull = RESET;//清除滿標(biāo)志
return 1;
}
return 0;
}




/*************************************************************************************************************************
* 函數(shù) : void UART_ClearRxInt(u8 ch)
* 功能 : 清除串口接收中斷標(biāo)志
* 參數(shù) : ch:通道選擇
* 返回 : 物
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : 用于清除接收標(biāo)志
*************************************************************************************************************************/
void UARTx_ClearRxInt(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return;
((USART_TypeDef *)USARTxN[ch])->SR &= ~BIT5;//清除標(biāo)志
}




/*************************************************************************************************************************
* 函數(shù) : u8 GetUartNewData(u8 ch)
* 功能 : 獲取串口新數(shù)據(jù)
* 參數(shù) : ch:通道選擇
* 返回 : 收到的數(shù)據(jù)
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : 用于接收一個字節(jié)數(shù)據(jù)
*************************************************************************************************************************/
u8 GetUartNewData(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return 0;


return (((USART_TypeDef *)USARTxN[ch])->DR);//返回數(shù)據(jù)
}






/*************************************************************************************************************************
* 函數(shù) : void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff)
* 功能 : 設(shè)置串口接收緩沖區(qū)
* 參數(shù) : ch:通道選擇,RxBuffSize:緩沖區(qū)大小,RxBuff:緩沖區(qū)指針
* 返回 : 無
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20120403
* 最后修改時間 : 20120403
* 說明 : 一定要設(shè)置,否則開啟中斷接收時可能會異常
*************************************************************************************************************************/
void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return;
UartRx[ch].RxBuffSize = RxBuffSize; //設(shè)置緩沖區(qū)大小
UartRx[ch].RxBuff = RxBuff;//設(shè)置緩沖區(qū)指針
UartRx[0].UartRxCnt = 0;//計數(shù)器清零
}






/*************************************************************************************************************************
* 函數(shù) : void USART1_IRQHandler (void)
* 功能 : UART1中斷接收函數(shù)
* 參數(shù) : 無
* 返回 : 無
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20110611
* 最后修改時間 : 20120403
* 說明 : 無
*************************************************************************************************************************/
void USART1_IRQHandler (void)
{
if((USART1->SR & BIT2) || (USART1->SR & BIT1))//如果NE = 1發(fā)送噪聲錯誤 ?//如果FE = 1,發(fā)送幀錯誤
{
if(USART1->SR);
if(USART1->DR);//復(fù)位NE操作序列
}
else if(UartRx[0].RxBuffSize > 0)//接收緩沖區(qū)大于0
{
(UartRx[0].RxBuff)[(UartRx[0].UartRxCnt) ++] = USART1->DR;//將數(shù)據(jù)存放到緩沖區(qū)
if(UartRx[0].UartRxCnt == UartRx[0].RxBuffSize)//緩沖區(qū)已滿
{
?UartRx[0].UartRxCnt = 0;//接收計數(shù)器清零
?UartRx[0].BuffFull = SET;//緩沖區(qū)已滿標(biāo)志
}
}
UartRx[0].NewDataFlag = SET;//收到新數(shù)據(jù)標(biāo)志
UARTx_ClearRxInt(0);? //清除串口接收中斷標(biāo)志
}


#if UART_ChMax > 0
/*************************************************************************************************************************
* 函數(shù) : void USART2_IRQHandler (void)
* 功能 : UART2中斷接收函數(shù)
* 參數(shù) : 無
* 返回 : 無
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20110611
* 最后修改時間 : 20120403
* 說明 : 無
*************************************************************************************************************************/
void USART2_IRQHandler (void)
{
if((USART2->SR & BIT2) || (USART2->SR & BIT1))//如果NE = 1發(fā)送噪聲錯誤 ?//如果FE = 1,發(fā)送幀錯誤
{
if(USART2->SR);
if(USART2->DR);//復(fù)位NE操作序列
}
else if(UartRx[1].RxBuffSize > 0)//接收緩沖區(qū)大于0
{
(UartRx[1].RxBuff)[(UartRx[1].UartRxCnt) ++] = USART1->DR;//將數(shù)據(jù)存放到緩沖區(qū)
if(UartRx[1].UartRxCnt == UartRx[1].RxBuffSize)//緩沖區(qū)已滿
{
?UartRx[1].UartRxCnt = 0;//接收計數(shù)器清零
?UartRx[1].BuffFull = SET;//緩沖區(qū)已滿標(biāo)志
}
}
UartRx[1].NewDataFlag = SET;//收到新數(shù)據(jù)標(biāo)志
UARTx_ClearRxInt(1);? //清除串口接收中斷標(biāo)志
}
#endif




#if UART_ChMax > 1
/*************************************************************************************************************************
* 函數(shù) : void USART3_IRQHandler (void)
* 功能 : UART3中斷接收函數(shù)
* 參數(shù) : 無
* 返回 : 無
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20110611
* 最后修改時間 : 20120403
* 說明 : 無
*************************************************************************************************************************/
void USART3_IRQHandler (void)
{
if((USART3->SR & BIT2) || (USART3->SR & BIT1))//如果NE = 1發(fā)送噪聲錯誤 ?//如果FE = 1,發(fā)送幀錯誤
{
if(USART3->SR);
if(USART3->DR);//復(fù)位NE操作序列
}
else if(UartRx[2].RxBuffSize > 0)//接收緩沖區(qū)大于0
{
(UartRx[2].RxBuff)[(UartRx[2].UartRxCnt) ++] = USART1->DR;//將數(shù)據(jù)存放到緩沖區(qū)
if(UartRx[2].UartRxCnt == UartRx[2].RxBuffSize)//緩沖區(qū)已滿
{
?UartRx[2].UartRxCnt = 0;//接收計數(shù)器清零
?UartRx[2].BuffFull = SET;//緩沖區(qū)已滿標(biāo)志
}
}
UartRx[2].NewDataFlag = SET;//收到新數(shù)據(jù)標(biāo)志
UART_ClearRxInt(2);? //清除串口接收中斷標(biāo)志
}
#endif




#if UART_ChMax > 2
/*************************************************************************************************************************
* 函數(shù) : void UART4_IRQHandler (void)
* 功能 : UART4中斷接收函數(shù)
* 參數(shù) : 無
* 返回 : 無
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20110611
* 最后修改時間 : 20120403
* 說明 : 無
*************************************************************************************************************************/
void UART4_IRQHandler (void)
{
if((UART4->SR & BIT2) || (UART4->SR & BIT1))//如果NE = 1發(fā)送噪聲錯誤 ?//如果FE = 1,發(fā)送幀錯誤
{
if(UART4->SR);
if(UART4->DR);//復(fù)位NE操作序列
}
else if(UartRx[3].RxBuffSize > 0)//接收緩沖區(qū)大于0
{
(UartRx[3].RxBuff)[(UartRx[3].UartRxCnt) ++] = USART1->DR;//將數(shù)據(jù)存放到緩沖區(qū)
if(UartRx[3].UartRxCnt == UartRx[3].RxBuffSize)//緩沖區(qū)已滿
{
?UartRx[3].UartRxCnt = 0;//接收計數(shù)器清零
?UartRx[3].BuffFull = SET;//緩沖區(qū)已滿標(biāo)志
}
}
UartRx[3].NewDataFlag = SET;//收到新數(shù)據(jù)標(biāo)志
UART_ClearRxInt(3);? //清除串口接收中斷標(biāo)志
}
#endif






#if UART_ChMax > 3
/*************************************************************************************************************************
* 函數(shù) : void UART5_IRQHandler (void)
* 功能 : UART5中斷接收函數(shù)
* 參數(shù) : 無
* 返回 : 無
* 依賴 : 底層宏定義
* 作者 : 陳鵬
* 時間 : 20110611
* 最后修改時間 : 20120403
* 說明 : 無
*************************************************************************************************************************/
void UART5_IRQHandler (void)
{
if((UART5->SR & BIT2) || (UART5->SR & BIT1))//如果NE = 1發(fā)送噪聲錯誤 ?//如果FE = 1,發(fā)送幀錯誤
{
if(UART5->SR);
if(UART5->DR);//復(fù)位NE操作序列
}
else if(UartRx[4].RxBuffSize > 0)//接收緩沖區(qū)大于0
{
(UartRx[4].RxBuff)[(UartRx[4].UartRxCnt) ++] = USART1->DR;//將數(shù)據(jù)存放到緩沖區(qū)
if(UartRx[4].UartRxCnt == UartRx[4].RxBuffSize)//緩沖區(qū)已滿
{
?UartRx[4].UartRxCnt = 0;//接收計數(shù)器清零
?UartRx[4].BuffFull = SET;//緩沖區(qū)已滿標(biāo)志
}
}
UartRx[4].NewDataFlag = SET;//收到新數(shù)據(jù)標(biāo)志
UART_ClearRxInt(4);? //清除串口接收中斷標(biāo)志
}
#endif




#undef UART_ChMax



//USART.H
/**************************************************************************************************/
/* USART 通用同步異步串行發(fā)送接收*/
/* 陳鵬 20110609*/


#ifndef _USART_H
#define _USART_H


#include "system.h"
#include "stdio.h"


//UART配置相關(guān)結(jié)構(gòu)定義
typedef struct
{
u8 OddEvenVerify;//奇偶校驗,奇,偶,無
u8 StopBitWidth;//停止位位寬1,2
} UART_Config_TypeDef;


//奇偶校驗
#define UART_VERIFY_NULL 0//無校驗
#define UART_ODD 1//奇校驗
#define UART_EVEN 2//偶校驗
//停止位
#define UART_STOP_1BIT 0//一個停止位
#define UART_STOP_2BIT 1//2個停止位




//相關(guān)API
u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int);//串口初始化
u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg); //串口配置
void UARTx_SendByte(u8 ch,u8 data); //UART單字節(jié)發(fā)送
void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number); //UART數(shù)據(jù)發(fā)送函數(shù)
void UARTx_PowerDown(u8 ch); //UART掉電
void UARTx_PowerOn(u8 ch); //UART上電
u8 GetUartNewFlag(u8 ch); //獲取串口新數(shù)據(jù)標(biāo)志
u8 GetUartRxBuffFullFlag(u8 ch); //獲取串口接收緩沖區(qū)滿標(biāo)志
u8 GetUartNewData(u8 ch); //獲取串口新數(shù)據(jù)
void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff);//設(shè)置串口接收緩沖區(qū)
void UARTx_ClearRxInt(u8 ch); //清除串口接收中斷標(biāo)志






#endif


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉