#include "RS232.h"
|
|
#include "gpio.h"
|
#include "1gprs.h"
|
#include "string.h"
|
#include "devicegpioinit.h"
|
|
unsigned char UTR_rec_buff[RX232_LENGTH];
|
unsigned char UTR_rec_cnt = 0;
|
unsigned char UTR_rec_finish_flag = 0;
|
|
/*GPRS´®¿Ú³õʼ»¯*/
|
void GPRS_Usart_Init(uint32 system_BaudRate) // ´®¿Ú1 DMAͨµÀ3
|
{
|
|
UART_SInitTypeDef UART_para; // UART³õʼ»¯½á¹¹Ìå
|
CMU_ClocksType CMU_Clocks; // ϵͳ¸÷ʱÖÓÆµÂʽṹÌå ÔÚ´ËÓë¼ÆËã²¨ÌØÂÊÓйØ
|
|
// /*UART IO ÅäÖÃ*/
|
CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
|
AltFunIO(GPRSRS232_TXD_EN_PIN_GROUP, GPRSRS232_TXD_EN_PIN_NUM, ALTFUN_NORMAL); // PE4 UART1 TX
|
AltFunIO(GPRSRS232_RXD_EN_PIN_GROUP, GPRSRS232_RXD_EN_PIN_NUM, ALTFUN_NORMAL); // PE3 UART1 RX
|
//----------------------------------------------------------------------------------------
|
|
// UART¹¤×÷ʱÖÓÔ´Ñ¡Ôñ Ö»ÓÐUART0¡¢1ÐèҪѡÔñ ÆäËûUART¶Ë¿ÚÔݲ»ÐèÒª Ö±½Ó×¢Êͼ´¿É
|
UART_para.ClockSrc = CMU_OPCCR1_UART1CKS_APBCLK; // UART0¹¤×÷ʱÖÓÑ¡Ôñ
|
UART_para.BaudRate = system_BaudRate;
|
UART_para.DataBit = Eight8Bit; // Êý¾ÝλÊý
|
UART_para.ParityBit = NONE; // ÆæÅ¼Ð£Ñé
|
UART_para.StopBit = OneBit; // ֹͣλ
|
|
CMU_GetClocksFreq(&CMU_Clocks); // »ñȡϵͳ¸÷ʱÖÓÆµÂÊ
|
UART_SInit(UART1, &UART_para, &CMU_Clocks); // ³õʼ»¯uart
|
|
/*NVICÖжÏÓÅÏȼ¶ÒÔ¼°ÊÇ·ñ´ò¿ªÖжÏÅäÖÃ*/
|
NVIC_DisableIRQ(UART1_IRQn);
|
// NVIC_SetPriority(UART1_IRQn,2);//ÖжÏÓÅÏȼ¶ÅäÖÃ
|
// NVIC_EnableIRQ(UART1_IRQn); //ÖжϷþÎñº¯Êý¿ª
|
|
UARTx_CSR_RXEN_Setable(UART1, ENABLE); // ´ò¿ª½ÓÊÕʹÄÜ
|
UARTx_CSR_TXEN_Setable(UART1, ENABLE); // ´ò¿ª·¢ËÍʹÄÜ
|
|
UARTx_ISR_RXBF_Clr(UART1);
|
|
////--------DMAͨµÀ3ÅäÖÃ----------------------------------------------------------------
|
DMA_InitTypeDef DMA_InitStructure; // DMA³õʼ»¯²ÎÊý½á¹¹Ìå
|
|
CMU_PERCLK_SetableEx(DMACLK, ENABLE); // DMAʱÖÓʹÄÜ
|
DMA_GCR_DMAEN_Setable(ENABLE); // DMA×ÜʹÄÜ
|
|
DMA_InitStructure.CHx = DMA_CH3; // DMAͨµÀºÅÉèÖÃ
|
DMA_InitStructure.CHxPRI = DMA_CHxCR_CHxPRI_HIGH; // ͨµÀÓÅÏȼ¶ÉèÖÃ
|
DMA_InitStructure.CHxINC = DMA_CHxCR_CHxINC_INCREASE; // ͨµÀµØÖ·Ôö³¤·½Ïò
|
DMA_InitStructure.CHxSSEL = DMA_CHxCR_CH3SSEL_UART1_RX; // ÍâÉèͨµÀÑ¡Ôñ
|
DMA_InitStructure.CHxDIR = DMA_CHxCR_DIR_TO_RAM; // Êý¾Ý´«Êä·½ÏòÉèÖÃ
|
DMA_InitStructure.CHxTSIZE = LINKRXDBOUND; // ͨµÀ´«Ê䳤¶È
|
DMA_InitStructure.CHxRAMAD = (uint32)LinkDlg.UartBuff; // Ä¿±êµØÖ·
|
DMA_InitStructure.CHxBDW = DMA_CHxCR_BDW_8BITS; // ͨµÀ´«Êä´ø¿í
|
|
DMA_InitStructure.CHxFTIE = DISABLE; // ͨµÀ´«ÊäÍê³ÉÖжÏʹÄÜ
|
DMA_InitStructure.CHxHTIE = DISABLE; // ͨµÀ´«Êä°ë³ÌÖÕ¶ËʹÄÜ
|
DMA_InitStructure.CHxEN = ENABLE; // ͨµÀʹÄÜ
|
|
NVIC_DisableIRQ(DMA_IRQn);
|
// NVIC_SetPriority(DMA_IRQn,3);//ÖжÏÓÅÏȼ¶ÅäÖÃ
|
// NVIC_EnableIRQ(DMA_IRQn);
|
|
// DMA_CHxCR_CHxFTIE_Setable(MODBUS_DMA_RX_CHANNEL,ENABLE);//ͨµÀ´«ÊäÍê³ÉÖжÏʹÄÜ
|
|
DMA_ISR_DMACHFT_Clr(DMA_CH3); // ÇåDMA´«ÊäÍê³É±êÖ¾
|
|
DMA_Init(&DMA_InitStructure); // DMAÅäÖòÎÊýдÈë
|
}
|
|
/*ÉÏλ»ú´®¿Ú³õʼ»¯*/
|
void UTR_Uart_Init(uint32 system_BaudRate) // ´®¿Ú5 DMAͨµÀ5
|
{
|
UART_SInitTypeDef UART_para; // UART³õʼ»¯½á¹¹Ìå
|
CMU_ClocksType CMU_Clocks; // ϵͳ¸÷ʱÖÓÆµÂʽṹÌå ÔÚ´ËÓë¼ÆËã²¨ÌØÂÊÓйØ
|
|
// /*UART5 IO ÅäÖÃ*/
|
CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
|
AltFunIO(URXD_EN_PIN_GROUP, URXD_EN_PIN_NUM, ALTFUN_NORMAL);
|
AltFunIO(UTXD_EN_PIN_GROUP, UTXD_EN_PIN_NUM, ALTFUN_NORMAL);
|
////-----------------------------------------------------------------------------
|
|
// UART¹¤×÷ʱÖÓÔ´Ñ¡Ôñ Ö»ÓÐUART0¡¢1ÐèҪѡÔñ ÆäËûUART¶Ë¿ÚÔݲ»ÐèÒª Ö±½Ó×¢Êͼ´¿É
|
// UART_para.ClockSrc = CMU_OPCCR1_UART1CKS_APBCLK; //UART0¹¤×÷ʱÖÓÑ¡Ôñ
|
UART_para.BaudRate = system_BaudRate;
|
UART_para.DataBit = Eight8Bit; // Êý¾ÝλÊý
|
UART_para.ParityBit = NONE; // ÆæÅ¼Ð£Ñé
|
UART_para.StopBit = OneBit; // ֹͣλ
|
|
CMU_GetClocksFreq(&CMU_Clocks); // »ñȡϵͳ¸÷ʱÖÓÆµÂÊ
|
UART_SInit(UART5, &UART_para, &CMU_Clocks); // ³õʼ»¯uart
|
|
// UARTx_IER_RXBF_IE_Setable(UART5, ENABLE);//½ÓÊÕ»º´æÂúÖжÏʹÄÜ ÐèҪʹÓýÓÊÕÖжϴò¿ª´Ë´¦ÉèÖÃ
|
// UARTx_IER_TXSE_IE_Setable(UART5, ENABLE)£»//·¢ËÍ»º´æ¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿ÕÖжÏʹÄÜ ÐèҪʹÓ÷¢ËÍÖжϴò¿ª´Ë´¦ÉèÖÃ
|
|
/*NVICÖжÏÓÅÏȼ¶ÒÔ¼°ÊÇ·ñ´ò¿ªÖжÏÅäÖÃ*/
|
NVIC_DisableIRQ(UART5_IRQn);
|
// NVIC_SetPriority(UART5_IRQn,2);//ÖжÏÓÅÏȼ¶ÅäÖÃ
|
// NVIC_EnableIRQ(UART5_IRQn); //ÖжϷþÎñº¯Êý¿ª
|
|
UARTx_CSR_RXEN_Setable(UART5, ENABLE); // ´ò¿ª½ÓÊÕʹÄÜ
|
UARTx_CSR_TXEN_Setable(UART5, ENABLE); // ´ò¿ª·¢ËÍʹÄÜ
|
|
UARTx_ISR_RXBF_Clr(UART5);
|
|
//--------DMAͨµÀ5ÅäÖÃ----------------------------------------------------------------
|
DMA_InitTypeDef DMA_InitStructure; // DMA³õʼ»¯²ÎÊý½á¹¹Ìå
|
|
CMU_PERCLK_SetableEx(DMACLK, ENABLE); // DMAʱÖÓʹÄÜ
|
DMA_GCR_DMAEN_Setable(ENABLE); // DMA×ÜʹÄÜ
|
|
DMA_InitStructure.CHx = DMA_CH5; // DMAͨµÀºÅÉèÖÃ
|
DMA_InitStructure.CHxPRI = DMA_CHxCR_CHxPRI_HIGH; // ͨµÀÓÅÏȼ¶ÉèÖÃ
|
DMA_InitStructure.CHxINC = DMA_CHxCR_CHxINC_INCREASE; // ͨµÀµØÖ·Ôö³¤·½Ïò
|
DMA_InitStructure.CHxSSEL = DMA_CHxCR_CH5SSEL_UART5_RX; // ÍâÉèͨµÀÑ¡Ôñ
|
DMA_InitStructure.CHxDIR = DMA_CHxCR_DIR_TO_RAM; // Êý¾Ý´«Êä·½ÏòÉèÖÃ
|
DMA_InitStructure.CHxTSIZE = LINKRXDBOUND; // ͨµÀ´«Ê䳤¶È
|
DMA_InitStructure.CHxRAMAD = (u32)(UTR_rec_buff); // Ä¿±êµØÖ·
|
DMA_InitStructure.CHxBDW = DMA_CHxCR_BDW_8BITS; // ͨµÀ´«Êä´ø¿í
|
|
DMA_InitStructure.CHxFTIE = DISABLE; // ͨµÀ´«ÊäÍê³ÉÖжÏʹÄÜ
|
DMA_InitStructure.CHxHTIE = DISABLE; // ͨµÀ´«Êä°ë³ÌÖÕ¶ËʹÄÜ
|
|
DMA_InitStructure.CHxEN = ENABLE; // ͨµÀʹÄÜ
|
|
NVIC_DisableIRQ(DMA_IRQn);
|
// NVIC_SetPriority(DMA_IRQn,3);//ÖжÏÓÅÏȼ¶ÅäÖÃ
|
// NVIC_EnableIRQ(DMA_IRQn);
|
|
// DMA_CHxCR_CHxFTIE_Setable(UART5,ENABLE);//ͨµÀ´«ÊäÍê³ÉÖжÏʹÄÜ
|
|
DMA_ISR_DMACHFT_Clr(DMA_CH5);
|
|
DMA_Init(&DMA_InitStructure); // DMAÅäÖòÎÊýдÈë
|
|
UTRXD_RE_L;
|
}
|
|
//---------GPRS--------------------------------------------------------------------
|
void gprsuart_sendbyte(uint8_t Byte)
|
{
|
UARTx_TXBUF_Write(UART1, Byte); // ½«·¢ËÍÊý¾ÝдÈë·¢ËͼĴæÆ÷
|
while (RESET == UARTx_ISR_TXSE_Chk(UART1))
|
; // µÈ´ý·¢ËÍÍê³É
|
}
|
|
void GPRS_UartSendCode(char *code)
|
{
|
unsigned char len;
|
unsigned char i;
|
|
len = strlen(code); // ¼ÆËãµ÷ÊÔÐÅÏ¢µÄ³¤¶È
|
for (i = 0; i < len; i++)
|
{
|
gprsuart_sendbyte(*code);
|
code++;
|
}
|
|
delay_ms(1);
|
}
|
|
//---------ÉÏλ»ú--------------------------------------------------------------------
|
void UTR_sendbyte(unsigned char dat)
|
{
|
|
UTRXD_RE_H;
|
|
UARTx_TXBUF_Write(UART5, dat); // ½«·¢ËÍÊý¾ÝдÈë·¢ËͼĴæÆ÷
|
while (RESET == UARTx_ISR_TXSE_Chk(UART5))
|
; // µÈ´ý·¢ËÍÍê³É
|
|
UTRXD_RE_L;
|
}
|
|
void UTR_Send_Data(uint8 *buf, uint16 len)
|
{
|
uint16 t;
|
UTRXD_RE_H;
|
for (t = 0; t < len; t++) // send data
|
{
|
UARTx_TXBUF_Write(UART5, buf[t]); // ½«·¢ËÍÊý¾ÝдÈë·¢ËͼĴæÆ÷
|
while (RESET == UARTx_ISR_TXSE_Chk(UART5))
|
; // µÈ´ý·¢ËÍÍê³É
|
}
|
|
while (RESET == UARTx_ISR_TXSE_Chk(UART5))
|
; // µÈ´ý·¢ËÍÍê³É
|
|
UTRXD_RE_L;
|
}
|
|
void UTR_DMA_Send_Data(uint8 *buf, uint16 len)
|
{
|
while (DMA_ISR_DMACHFT_Chk(DMA_CH5) == RESET)
|
{
|
};
|
DMA_ISR_DMACHFT_Clr(DMA_CH5); // ÇåDMA´«ÊäÍê³É±êÖ¾
|
UARTx_ISR_TXSE_Clr(UART5); // Çå·¢ËÍ¿ÕÇÒÒÆÎ»¼Ä´æÆ÷¿Õ±êÖ¾
|
// µÈ´ý·¢ËÍÍê³É
|
while (UARTx_ISR_TXSE_Chk(UART5) == RESET)
|
{
|
};
|
UARTx_ISR_TXSE_Clr(UART5); // Çå·¢ËÍ¿ÕÇÒÒÆÎ»¼Ä´æÆ÷¿Õ±êÖ¾
|
|
// ·¢ËÍÍêʧÄÜDMA
|
DMA_CHxCR_ChxEN_Setable(DMA_CH5, DISABLE); // ͨµÀ1ʧÄÜ
|
}
|
|
//-----------------------------------------------------------------------------------------
|
|
// printf()ÖØ¶¨Ïò
|
// int fputc(int c, FILE * stream)
|
//{
|
// UTRXD_RE_H;
|
|
// UARTx_TXBUF_Write(UART5, c); //½«·¢ËÍÊý¾ÝдÈë·¢ËͼĴæÆ÷
|
// while(RESET == UARTx_ISR_TXSE_Chk(UART5))//µÈ´ý·¢ËÍÍê³É
|
// {
|
|
// }
|
|
// return c;
|
|
// UTRXD_RE_L;
|
//}
|
|
//======================================================================================
|
// ´®¿Ú·¢Ë͵÷ÊÔÐÅÏ¢ RS485·¢Ë͵÷ÊÔÐÅÏ¢
|
void UartDebugFun(char *str)
|
{
|
unsigned char len;
|
len = strlen(str); // ¼ÆËãµ÷ÊÔÐÅÏ¢µÄ³¤¶È
|
UTR_Send_Data((u8 *)str, len);
|
delay_ms(1);
|
}
|
|
///*--------------------------------ÖжϷþÎñº¯Êý--------------------------------------------------*/
|
uint8_t RX_dat;
|
uint8_t RX_flag;
|
void UART1_IRQHandler(void)
|
{
|
|
// ½ÓÊÕÖжϴ¦Àí
|
if ((ENABLE == UARTx_IER_RXBF_IE_Getable(UART1)) && (SET == UARTx_ISR_RXBF_Chk(UART1)))
|
{
|
DMA_ISR_DMACHFT_Clr(DMA_CH3);
|
|
DMA_CHxCR_ChxEN_Setable(DMA_CH3, DISABLE); // ͨµÀʧÄÜ
|
|
DMA_CHxMAR_Write(DMA_CH3, (uint32)LinkDlg.UartBuff);
|
|
DMA_CHxCR_ChxEN_Setable(DMA_CH3, ENABLE); // ͨµÀʹÄÜ
|
}
|
}
|
|
void UART5_IRQHandler(void)
|
{
|
|
// ½ÓÊÕÖжϴ¦Àí
|
if ((ENABLE == UARTx_IER_RXBF_IE_Getable(UART5)) && (SET == UARTx_ISR_RXBF_Chk(UART5)))
|
{
|
|
DMA_ISR_DMACHFT_Clr(DMA_CH5);
|
|
DMA_CHxCR_ChxEN_Setable(DMA_CH5, DISABLE); // ͨµÀʧÄÜ
|
|
DMA_CHxMAR_Write(DMA_CH5, (u32)(UTR_rec_buff));
|
|
DMA_CHxCR_ChxEN_Setable(DMA_CH5, ENABLE); // ͨµÀʹÄÜ
|
}
|
}
|
|
void DMA_IRQHandler(void)
|
{
|
if ((ENABLE == DMA_CHxCR_CHxFTIE_Getable(DMA_CH3)) && (SET == DMA_ISR_DMACHFT_Chk(DMA_CH3)))
|
{
|
// ÖжÏת·¢½ÓÊÕµ½µÄÊý¾Ý
|
DMA_ISR_DMACHFT_Clr(DMA_CH3);
|
}
|
}
|
|
///*--------------------------------DMA½ÓÊÕÅжϺ¯Êý--------------------------------------------------*/
|
/*Ô¶´«DMA½ÓÊպ˲é*/
|
ErrorStatus_STM32 Gprs_Uart1_Rx_DMA_CH3_Check(void)
|
{
|
uint16_t timeout_cnt = 0;
|
uint16_t dma_recv_cnt;
|
uint32_t dma_mar_reg_read;
|
|
dma_mar_reg_read = DMA_CHxMAR_Read(DMA_CH3);
|
|
if (dma_mar_reg_read != (uint32)LinkDlg.UartBuff)
|
{
|
delay_ms(2);
|
while (dma_mar_reg_read != DMA_CHxMAR_Read(DMA_CH3))
|
{
|
dma_mar_reg_read = DMA_CHxMAR_Read(DMA_CH3);
|
delay_ms(2);
|
if (timeout_cnt++ > 100)
|
break;
|
}
|
}
|
else
|
return ERROR_1;
|
|
dma_recv_cnt = dma_mar_reg_read - (uint32)LinkDlg.UartBuff;
|
if (dma_recv_cnt)
|
{
|
LinkDlg.DataLen = dma_recv_cnt;
|
// ½ÓÊÕRAMµØÖ·ÖØÔØ
|
DMA_ISR_DMACHFT_Clr(DMA_CH3);
|
DMA_CHxCR_ChxEN_Setable(DMA_CH3, DISABLE); // ͨµÀʧÄÜ
|
|
DMA_CHxMAR_Write(DMA_CH3, (uint32)LinkDlg.UartBuff);
|
|
DMA_CHxCR_ChxEN_Setable(DMA_CH3, ENABLE); // ͨµÀʹÄÜ
|
|
LinkDlg.Gprs_Finish_Flag = SET; // ½ÓÊÕÍê³É
|
return SUCCESS_0;
|
// DMA_GCR_DMAEN_Setable(DISABLE);//DMA×ÜʹÄÜ
|
}
|
return ERROR_1;
|
}
|