日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

//USART.C

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


//定義串口通道號(hào)最大值
#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滿(mǎn)
FlagStatus IntRx; //是否開(kāi)啟中斷接收
u8 *RxBuff;//接收Buff指針
u16 RxBuffSize;//接收緩沖區(qū)大小,一幀數(shù)據(jù)大小
u16 UartRxCnt;//接收數(shù)據(jù)計(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)庫(kù)需要的支持函數(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()以避免使用半主機(jī)模式 ? ?
_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)時(shí)鐘,Speed:串口速度,RX_Int:是否時(shí)能中斷接受
* 返回 : 0:成功,1:失敗
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20120403
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : USART1~UART5,對(duì)應(yīng)通道0~4
*************************************************************************************************************************/
u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int)
{
USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; ? //獲取對(duì)應(yīng)通道硬件基址指針
u32 clock;
u8 irq_n;
float fclk;


if(ch > UART_ChMax)
return 1; //端口號(hào)超出范圍
//初始化UART IO
DeviceClockEnable(DEV_AFIO,ENABLE);//復(fù)用功能AFIO時(shí)鐘使能
switch (ch)
{
case 0: //通道0,USART1 ,TX:PA9;RX:PA10
{
DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 時(shí)鐘使能
DeviceClockEnable(DEV_USART1,ENABLE);//USART 1 時(shí)鐘使能
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中斷號(hào)
}break;
case 1: //通道1,USART2 ,TX:PA2;RX:PA3
{
DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 時(shí)鐘使能
DeviceClockEnable(DEV_USART2,ENABLE);//USART 2 時(shí)鐘使能
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中斷號(hào)
}break;
case 2: //通道2,USART3 ,TX:PD8;RX:PD9
{
DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 時(shí)鐘使能
DeviceClockEnable(DEV_USART3,ENABLE);//USART 3 時(shí)鐘使能
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中斷號(hào)
}break;
case 3: //通道3,UART4 ,TX:PC10;RX:PC11
{
DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 時(shí)鐘使能
DeviceClockEnable(DEV_UART4,ENABLE);//UART 4 時(shí)鐘使能
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中斷號(hào)
}break;
case 4: //通道4,UART5 ,TX:PC12;RX:PD2
{
DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 時(shí)鐘使能
DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 時(shí)鐘使能
DeviceClockEnable(DEV_UART5,ENABLE);//UART 5 時(shí)鐘使能
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中斷號(hào)
}break;
default : return 1;//端口號(hào)超出范圍,返回錯(cuò)誤
}
//設(shè)置波特率分頻系數(shù)
clock = SYS_CLK * 1000000;//USART1時(shí)鐘
if(ch > 0)
clock /= 2; //USART2,3,4,5時(shí)鐘
fclk = (float)clock / 16.0 / Speed;//計(jì)算波特率分頻系數(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個(gè)開(kāi)始位,8位數(shù)據(jù)
UARTx->CR1 |= 0x8;//置TE = 1;發(fā)送使能;發(fā)送第一個(gè)空閑位
UARTx->CR1 |= 0x04;//RE = 1;接收使能
SetUartRxBuff(ch,0,NULL);//設(shè)置串口接收緩沖區(qū)
UARTx_ClearRxInt(ch);? //清除串口接收中斷標(biāo)志
if(RX_Int)
{
UARTx->CR1 |= 0x20;//RXNEIE = 1,開(kāi)RXNE中斷,即開(kāi)啟接收中斷
NVIC_IntEnable(irq_n,1);//開(kāi)啟USART1全局中斷
UartRx[ch].IntRx = SET;//中斷接收標(biāo)志有效
}?
else
{
NVIC_IntEnable(irq_n,0); //關(guān)閉USART全局中斷
UartRx[ch].IntRx = RESET;//中斷接收標(biāo)志無(wú)效
}
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:失敗
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20120408
* 最后修改時(shí)間 : 20120408
* 說(shuō)明 : USART1~UART5,對(duì)應(yīng)通道0~4 ,返回1:校驗(yàn)設(shè)置錯(cuò)誤,2:停止位設(shè)置錯(cuò)誤,3:通道超出范圍
*************************************************************************************************************************/
u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg)
{
USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; ? //獲取對(duì)應(yīng)通道硬件基址指針


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






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


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


while(!(UARTx->SR & 0x80));//等待發(fā)送寄存器為空,(否則連續(xù)發(fā)送時(shí)數(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:通道號(hào),tx_buff:發(fā)送緩沖區(qū),byte_number:需要發(fā)送的字節(jié)
* 返回 : 無(wú)
* 依賴(lài) : void UART_SendByte(u8 ch,u8 data)
* 作者 : 陳鵬
* 時(shí)間 : 20120403
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 非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:通道選擇
* 返回 : 無(wú)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20120403
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 進(jìn)入低功耗模式;通道號(hào)為0 - 4;
*************************************************************************************************************************/
void UARTx_PowerDown(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return;
((USART_TypeDef *)USARTxN[ch])->BRR |= (1 << 13);//UE位寫(xiě)一,開(kāi)啟低功耗
}




/*************************************************************************************************************************
* 函數(shù) : void UARTx_PowerOn(u8 ch)
* 功能 : UART上電
* 參數(shù) : ch:通道選擇
* 返回 : 無(wú)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20120403
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 退出低功耗模式;通道號(hào)為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:無(wú)新數(shù)據(jù)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20120403
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 用于判斷是否有新的數(shù)據(jù),會(huì)清除掉新數(shù)據(jù)標(biāo)志的
*************************************************************************************************************************/
u8 GetUartNewFlag(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return 0;


if(UartRx[ch].IntRx == SET)//開(kāi)啟了中斷接收
{
if(UartRx[ch].NewDataFlag == SET) //有新數(shù)據(jù)
{
UartRx[ch].NewDataFlag = RESET;//清除標(biāo)志
return 1; //返回有新數(shù)據(jù)
}
else
return 0; //無(wú)新數(shù)據(jù)
}
else //沒(méi)開(kāi)啟中斷接收
{
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ū)滿(mǎn)標(biāo)志
* 參數(shù) : ch:通道選擇
* 返回 : 1:有新數(shù)據(jù),0:無(wú)新數(shù)據(jù)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20120403
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 用于判斷接收緩沖區(qū)是否滿(mǎn),會(huì)清除標(biāo)志
*************************************************************************************************************************/
u8 GetUartRxBuffFullFlag(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return 0;
if(UartRx[0].BuffFull == SET)//緩沖區(qū)已滿(mǎn)
{
UartRx[0].BuffFull = RESET;//清除滿(mǎn)標(biāo)志
return 1;
}
return 0;
}




/*************************************************************************************************************************
* 函數(shù) : void UART_ClearRxInt(u8 ch)
* 功能 : 清除串口接收中斷標(biāo)志
* 參數(shù) : ch:通道選擇
* 返回 : 物
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20120403
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 用于清除接收標(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ù)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20120403
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 用于接收一個(gè)字節(jié)數(shù)據(jù)
*************************************************************************************************************************/
u8 GetUartNewData(u8 ch)
{
if(ch > UART_ChMax)//判斷端口是否超出范圍
return 0;


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






/*************************************************************************************************************************
* 函數(shù) : void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff)
* 功能 : 設(shè)置串口接收緩沖區(qū)
* 參數(shù) : ch:通道選擇,RxBuffSize:緩沖區(qū)大小,RxBuff:緩沖區(qū)指針
* 返回 : 無(wú)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20120403
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 一定要設(shè)置,否則開(kāi)啟中斷接收時(shí)可能會(huì)異常
*************************************************************************************************************************/
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;//計(jì)數(shù)器清零
}






/*************************************************************************************************************************
* 函數(shù) : void USART1_IRQHandler (void)
* 功能 : UART1中斷接收函數(shù)
* 參數(shù) : 無(wú)
* 返回 : 無(wú)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20110611
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 無(wú)
*************************************************************************************************************************/
void USART1_IRQHandler (void)
{
if((USART1->SR & BIT2) || (USART1->SR & BIT1))//如果NE = 1發(fā)送噪聲錯(cuò)誤 ?//如果FE = 1,發(fā)送幀錯(cuò)誤
{
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ū)已滿(mǎn)
{
?UartRx[0].UartRxCnt = 0;//接收計(jì)數(shù)器清零
?UartRx[0].BuffFull = SET;//緩沖區(qū)已滿(mǎn)標(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ù) : 無(wú)
* 返回 : 無(wú)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20110611
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 無(wú)
*************************************************************************************************************************/
void USART2_IRQHandler (void)
{
if((USART2->SR & BIT2) || (USART2->SR & BIT1))//如果NE = 1發(fā)送噪聲錯(cuò)誤 ?//如果FE = 1,發(fā)送幀錯(cuò)誤
{
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ū)已滿(mǎn)
{
?UartRx[1].UartRxCnt = 0;//接收計(jì)數(shù)器清零
?UartRx[1].BuffFull = SET;//緩沖區(qū)已滿(mǎn)標(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ù) : 無(wú)
* 返回 : 無(wú)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20110611
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 無(wú)
*************************************************************************************************************************/
void USART3_IRQHandler (void)
{
if((USART3->SR & BIT2) || (USART3->SR & BIT1))//如果NE = 1發(fā)送噪聲錯(cuò)誤 ?//如果FE = 1,發(fā)送幀錯(cuò)誤
{
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ū)已滿(mǎn)
{
?UartRx[2].UartRxCnt = 0;//接收計(jì)數(shù)器清零
?UartRx[2].BuffFull = SET;//緩沖區(qū)已滿(mǎn)標(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ù) : 無(wú)
* 返回 : 無(wú)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20110611
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 無(wú)
*************************************************************************************************************************/
void UART4_IRQHandler (void)
{
if((UART4->SR & BIT2) || (UART4->SR & BIT1))//如果NE = 1發(fā)送噪聲錯(cuò)誤 ?//如果FE = 1,發(fā)送幀錯(cuò)誤
{
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ū)已滿(mǎn)
{
?UartRx[3].UartRxCnt = 0;//接收計(jì)數(shù)器清零
?UartRx[3].BuffFull = SET;//緩沖區(qū)已滿(mǎn)標(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ù) : 無(wú)
* 返回 : 無(wú)
* 依賴(lài) : 底層宏定義
* 作者 : 陳鵬
* 時(shí)間 : 20110611
* 最后修改時(shí)間 : 20120403
* 說(shuō)明 : 無(wú)
*************************************************************************************************************************/
void UART5_IRQHandler (void)
{
if((UART5->SR & BIT2) || (UART5->SR & BIT1))//如果NE = 1發(fā)送噪聲錯(cuò)誤 ?//如果FE = 1,發(fā)送幀錯(cuò)誤
{
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ū)已滿(mǎn)
{
?UartRx[4].UartRxCnt = 0;//接收計(jì)數(shù)器清零
?UartRx[4].BuffFull = SET;//緩沖區(qū)已滿(mǎn)標(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;//奇偶校驗(yàn),奇,偶,無(wú)
u8 StopBitWidth;//停止位位寬1,2
} UART_Config_TypeDef;


//奇偶校驗(yàn)
#define UART_VERIFY_NULL 0//無(wú)校驗(yàn)
#define UART_ODD 1//奇校驗(yàn)
#define UART_EVEN 2//偶校驗(yàn)
//停止位
#define UART_STOP_1BIT 0//一個(gè)停止位
#define UART_STOP_2BIT 1//2個(gè)停止位




//相關(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ū)滿(mǎn)標(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)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉