新聞中心

STM32串口寄存器操作

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
//USART.C
/*********************************************************************************************************//* USART 收發(fā)  *//* 陳鵬 20110611*/#include "SYSTEM.H"#include "GPIO_INIT.H"#include "USART.H"http://定義串口通道號(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滿  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:失敗* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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 * 1;//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 = 0x2;//使能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ù)}/************************************************************************************************************************** 函數(shù) :  u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg)* 功能 :  串口配置* 參數(shù) :  ch:通道選擇,0->usart1;cfg:串口配置結(jié)構(gòu)指針* 返回 :  0:成功,非0:失敗* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ú)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ú)* 依賴 :  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ú)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ú)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ù)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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)啟了中斷接收{(diào)if(UartRx[ch].NewDataFlag == SET) //有新數(shù)據(jù){UartRx[ch].NewDataFlag = RESET;//清除標(biāo)志return 1;  //返回有新數(shù)據(jù)}elsereturn 0;  //無(wú)新數(shù)據(jù)}else //沒(méi)開(kāi)啟中斷接收{(diào)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:無(wú)新數(shù)據(jù)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(shí)間 :  20120403* 最后修改時(shí)間 : 20120403* 說(shuō)明 : 用于判斷接收緩沖區(qū)是否滿,會(huì)清除標(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:通道選擇* 返回 :  物* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ù)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ú)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ú)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ū)已滿{UartRx[0].UartRxCnt = 0;//接收計(jì)數(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ù) :  無(wú)* 返回 :  無(wú)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ū)已滿{UartRx[1].UartRxCnt = 0;//接收計(jì)數(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ù) :  無(wú)* 返回 :  無(wú)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ū)已滿{UartRx[2].UartRxCnt = 0;//接收計(jì)數(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ù) :  無(wú)* 返回 :  無(wú)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ū)已滿{UartRx[3].UartRxCnt = 0;//接收計(jì)數(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ù) :  無(wú)* 返回 :  無(wú)* 依賴 :  底層宏定義* 作者 :  陳鵬* 時(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ū)已滿{UartRx[4].UartRxCnt = 0;//接收計(jì)數(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"http://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)APIu8 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

本文引用地址:http://m.butianyuan.cn/article/201611/318037.htm


關(guān)鍵詞: STM32串口寄存

評(píng)論


技術(shù)專區(qū)

關(guān)閉