#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; }