| | |
| | | #include "Usart.h" |
| | | |
| | | //void Usart_Init(void) |
| | | //{ |
| | | // USART_InitTypeDef USART_InitStructure; |
| | | // GPIO_InitTypeDef GPIO_InitStructure; |
| | | // |
| | | // /* Enable GPIO clock */ |
| | | // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); |
| | | // /* Enable USART clock */ |
| | | // RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); |
| | | // |
| | | // /* Configure USART Tx as alternate function push-pull */ |
| | | // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; |
| | | // GPIO_InitStructure.GPIO_Pin = USART_TX_pin; |
| | | // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
| | | // GPIO_Init(USART_GPIO, &GPIO_InitStructure); |
| | | |
| | | // /* Configure USART Rx as input floating */ |
| | | // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; |
| | | // GPIO_InitStructure.GPIO_Pin = USART_RX_pin; |
| | | // GPIO_Init(USART_GPIO, &GPIO_InitStructure); |
| | | |
| | | // /* USARTx configured as follow: |
| | | // - BaudRate = 115200 baud |
| | | // - Word Length = 8 Bits |
| | | // - One Stop Bit |
| | | // - No parity |
| | | // - Hardware flow control disabled (RTS and CTS signals) |
| | | // - Receive and transmit enabled |
| | | // */ |
| | | // USART_InitStructure.USART_BaudRate = BAUD_RATE ; |
| | | // USART_InitStructure.USART_WordLength = USART_WordLength_8b; |
| | | // USART_InitStructure.USART_StopBits = USART_StopBits_1; |
| | | // USART_InitStructure.USART_Parity = USART_Parity_No; |
| | | // USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; |
| | | // USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; |
| | | |
| | | // /* USART configuration */ |
| | | // USART_Init(EXT_USART, &USART_InitStructure); |
| | | |
| | | // /* Enable USART */ |
| | | // USART_Cmd(EXT_USART, ENABLE); |
| | | |
| | | //} |
| | | |
| | | //uint16_t Checksum_u16(uint8_t *pdata, uint32_t len) |
| | | //{ |
| | | // uint16_t sum = 0; |
| | | // uint32_t i; |
| | | // for(i = 0; i < len; i++) |
| | | // sum += pdata[i]; |
| | | // sum = ~sum; |
| | | // return sum; |
| | | //} |
| | | |
| | | |
| | | |
| | | /////////////////////////////////// |
| | | #include <string.h> |
| | | #include <stdio.h> |
| | | #include "modbus.h" |
| | | #include "Rcc_Nvic_Systick.h" |
| | | |
| | | //æ°æ®åééååé |
| | | EUART_Frame m_EUART_TxFrames[EUART_TX_FRM_SIZE]; //æ°æ®åé帧éå |
| | |
| | | //DMAæ°æ®æ¥æ¶ç¼å |
| | | uint8_t m_EUART_DMA_RXBuf[EUART_RX_BUF_SIZE]; //DMAæ°æ®æ¥æ¶ç¼å |
| | | volatile int32_t m_EUART_DMA_RXPtr = 0; //å½åæ°æ®å°å |
| | | int16_t DMA_rxtemp = 0,DMA_rxtemp2 = 0; //å½åæ°æ®å°åç¼å |
| | | u16 datadelaycount = 0; //å©ä½1使°æ®å»¶æ¶çå¾
å¤ç |
| | | //æ å¿åé |
| | | volatile uint8_t m_bEUARTPushingFrms = 0; //æ£å¨å¾åééååæ°æ® |
| | | volatile uint8_t m_bEUARTCheckingSend = 0; //æ£å¨ç¡®è®¤æ°æ®åé |
| | |
| | | volatile uint8_t m_bEUARTTxEn = 0; //使è½åé |
| | | |
| | | void (*Usart1ParseDataCallback)(uint8_t); |
| | | |
| | | void Usart1InitVariables(void) |
| | | { |
| | | m_EUART_TxFrm_FreeFrmLen = EUART_TX_FRM_SIZE-1; |
| | |
| | | |
| | | //åå§å管è |
| | | GPIO_InitStructure.GPIO_Pin = EU_RX_PIN; |
| | | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //Rx䏿è¾å
¥ |
| | | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //Rx䏿è¾å
¥ |
| | | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
| | | GPIO_Init(EU_RX_GPIO, &GPIO_InitStructure); |
| | | |
| | | GPIO_InitStructure.GPIO_Pin = EU_TX_PIN; |
| | | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //Txæ¨æ½å¤ç¨è¾åº |
| | | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //Txæ¨æ½å¤ç¨è¾åº GPIO_Mode_AF_PP |
| | | GPIO_Init(EU_TX_GPIO, &GPIO_InitStructure); |
| | | |
| | | GPIO_InitStructure.GPIO_Pin = EU_485_PIN; |
| | | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //Txæ¨æ½å¤ç¨è¾åº GPIO_Mode_AF_PP |
| | | GPIO_Init(EU_485_GPIO, &GPIO_InitStructure); |
| | | OUT485_DISABLE; |
| | | #ifdef UART_GPIO_REMAP_ENABLE |
| | | GPIO_PinRemapConfig(UART_GPIO_REMAP, ENABLE); |
| | | #endif |
| | |
| | | |
| | | USART_ClockInit(EXT_UART, &USART_ClockInitStructure); |
| | | USART_Init(EXT_UART, &USART_InitStructure); |
| | | |
| | | // USART_ITConfig(EXT_UART, USART_IT_RXNE, ENABLE);//??????,????? ?????????? |
| | | // Enable the USARTx |
| | | USART_Cmd(EXT_UART, ENABLE); |
| | | //DMAé
ç½®ï¼é¡»æ¾å°UARTåå§åä¹åï¼ |
| | | UART_DMAConfiguration(); |
| | | |
| | | } |
| | | |
| | | u8 overrun_flag=0; |
| | | u16 t1,t2,t3,t4; |
| | | void UART_CheckReceive(void) |
| | | { |
| | | int32_t DMACnt = 0; |
| | | int32_t MaxDataLen = EUART_RX_BUF_SIZE; |
| | | |
| | | u8 rxbuf_len = 0; |
| | | u8 buftemp1 = 0; |
| | | u8 buftemp2 = 0; |
| | | u8 i = 0; |
| | | //妿æ£å¨å¾åééå䏿·»å æ°æ®ï¼éåº |
| | | if(m_bEUARTPushingFrms) |
| | | return; |
| | |
| | | m_bEUARTCheckingRec = 0; |
| | | return; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | while( m_EUART_DMA_RXPtr != DMACnt && MaxDataLen > 0) |
| | | |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR);//DMACntæ¯DMAé鿥æ¶å°æ°æ®æ»é¿åº¦,CNDTRæ¯dmaå©ä½æªä½¿ç¨æ°é |
| | | |
| | | if(DMACnt!=m_EUART_DMA_RXPtr) |
| | | { |
| | | Usart1ParseDataCallback(m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]); |
| | | m_EUART_DMA_RXPtr++; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | //DMAææªå¤çæ°æ® |
| | | DMA_rxtemp=m_EUART_DMA_RXPtr+1; |
| | | delay_us(10); |
| | | overrun_flag=0; |
| | | if( DMA_rxtemp >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | DMA_rxtemp = 0; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | MaxDataLen--; |
| | | } |
| | | m_bEUARTCheckingRec = 0; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR);//DMACntæ¯DMAé鿥æ¶å°æ°æ®æ»é¿åº¦,CNDTRæ¯dmaå©ä½æªä½¿ç¨æ°é |
| | | if(DMACnt!=DMA_rxtemp&&(cmd_mode==0)) |
| | | { |
| | | //DMAæè¶
è¿2使°æ®æªå¤ç |
| | | DMA_rxtemp = 0;//æ¸
空æ°ç»æé |
| | | datadelaycount = 0;//çå¾
æ¬¡æ°æ¸
é¶ |
| | | buftemp1 = m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]; |
| | | buftemp2 = m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr+1]; |
| | | if((buftemp1==0x55)&&(buftemp2==0xAA)) |
| | | { |
| | | //ç§æåè®® |
| | | cmd_mode = 1; |
| | | } |
| | | else if(buftemp1==RS485_Addr) |
| | | { |
| | | if((buftemp2==03)||(buftemp2==06)||(buftemp2==16))//åè½ç æ£ç¡® |
| | | { |
| | | //modubsåè®® |
| | | t1++; |
| | | cmd_mode=2; |
| | | DMA_rxtemp2=m_EUART_DMA_RXPtr+7; |
| | | if( DMA_rxtemp2 >= EUART_RX_BUF_SIZE-1 ) |
| | | { |
| | | DMA_rxtemp2 -= EUART_RX_BUF_SIZE; |
| | | overrun_flag=1; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | m_EUART_DMA_RXPtr+=2; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //æ æç ï¼å¹²æ°ç |
| | | if(cmd_mode==0) |
| | | { |
| | | m_EUART_DMA_RXPtr+=2; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //åªæ1使°æ®æªå¤ç |
| | | if(++datadelaycount > WAITDELAYCOUNT) |
| | | { //è¶
åºçå¾
æ¬¡æ° |
| | | datadelaycount = 0; |
| | | cmd_mode=0; |
| | | m_EUART_DMA_RXPtr++; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | } |
| | | } |
| | | if(cmd_mode==1) |
| | | { |
| | | //ç§æåè®® |
| | | while( m_EUART_DMA_RXPtr != DMACnt && MaxDataLen > 0) |
| | | { |
| | | Usart1ParseDataCallback(m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]); |
| | | m_EUART_DMA_RXPtr++; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | MaxDataLen--; |
| | | } |
| | | } |
| | | else if(cmd_mode==2) |
| | | { |
| | | //modbusåè®® |
| | | delay_ms(10);//çå¾
æ°æ®æ¥æ¶å®æ |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | if((overrun_flag==0&&DMACnt>DMA_rxtemp2)||(overrun_flag==1&&DMACnt<DMA_rxtemp&&DMACnt>DMA_rxtemp2)) |
| | | { while(m_EUART_DMA_RXPtr != DMACnt && MaxDataLen > 0) |
| | | { |
| | | RS485_RX_BUFF[i] = m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]; |
| | | m_EUART_DMA_RXPtr++; |
| | | if(++i >= EUART_RX_BUF_SIZE)i = 0; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | MaxDataLen--; |
| | | } |
| | | // m_EUART_DMA_RXPtr++;//æ°æ®æåä¸ä¸ä½ |
| | | // if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | // { |
| | | // m_EUART_DMA_RXPtr = 0; |
| | | // } |
| | | t2++; |
| | | RS485_Service(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | m_bEUARTCheckingRec = 0; |
| | | } |
| | | |
| | | #ifndef EXUART_USE_TXDMA |
| | | //æ¥è¯¢æ¹å¼åéæ°æ® |
| | |
| | | { |
| | | if(m_bEUARTTxEn) |
| | | { |
| | | OUT485_DISABLE; |
| | | m_bEUARTTxEn = 0; |
| | | t3++; |
| | | // temp32 = GPIOC->CRH; //C10æ¬ç©ºè¾å
¥ |
| | | // temp32 &= ~(0x00000000F<<8); |
| | | // temp32 |= (0x000000004<<8); |
| | |
| | | m_bEUARTCheckingSend = 0; |
| | | return; |
| | | } |
| | | |
| | | if(!m_bEUARTTxEn) |
| | | { |
| | | m_bEUARTTxEn = 1; |
| | | OUT485_ENABLE; |
| | | t4++; |
| | | #ifdef BAUDRATE_19200 |
| | | delay_us(500); |
| | | #else |
| | | delay_us(10); |
| | | #endif |
| | | // temp32 = GPIOC->CRH; //C10å¤ç¨æ¨æ½è¾åº |
| | | // temp32 &= ~(0x00000000F<<8); |
| | | // temp32 |= (0x000000009<<8); |
| | | // GPIOC->CRH = temp32;// */ |
| | | } |
| | | |
| | | //åéä¸ä¸ªåèæ°æ® |
| | | EXT_UART->DR = m_EUART_TxFrames[m_EUART_TxFrm_Tail].buf[s_count]; |
| | | s_count++; |
| | |
| | | m_EUART_TxFrm_Head = EUART_TX_FRM_SIZE-1; |
| | | m_EUART_TxFrm_FreeFrmLen++; |
| | | } |
| | | void USART_putc(char c) |
| | | { |
| | | //while(!(USART2->SR & 0x00000040)); |
| | | //USART_SendData(USART2,c); |
| | | /* e.g. write a character to the USART */ |
| | | USART_SendData(USART1, c); |
| | | |
| | | /* Loop until the end of transmission */ |
| | | while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ; |
| | | } |
| | | void USART_puts(uint8_t *s,uint8_t len) |
| | | { |
| | | int i; |
| | | for(i=0; i<len; i++) |
| | | { |
| | | USART_putc(s[i]); |
| | | } |
| | | } |
| | | int fputc(int ch, FILE *f) |
| | | { |
| | | |
| | | USART_SendData(USART1, (unsigned char) ch);// USART1 ???? USART2 ? |
| | | while (!(USART1->SR & USART_FLAG_TXE)); |
| | | return (ch); |
| | | } |
| | | |