| | |
| | | volatile int8_t m_EUART_TxFrm_FreeFrmLen = 0; //æ°æ®åé帧éåå©ä½å¸§æ° |
| | | //DMAæ°æ®æ¥æ¶ç¼å |
| | | uint8_t m_EUART_DMA_RXBuf[EUART_RX_BUF_SIZE]; //DMAæ°æ®æ¥æ¶ç¼å |
| | | volatile int32_t m_EUART_DMA_RXPtr = 0; //å½åæ°æ®å°å |
| | | volatile int32_t m_EUART_DMA_RXPtr = 0,m_EUART2_DMA_RXPtr = 0; //å½åæ°æ®å°å |
| | | //æ å¿åé |
| | | 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_IN_FLOATING; //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åå§åä¹åï¼ |
| | |
| | | while( m_EUART_DMA_RXPtr != DMACnt && MaxDataLen > 0) |
| | | { |
| | | Usart1ParseDataCallback(m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]); |
| | | delay_us(10); |
| | | m_EUART_DMA_RXPtr++; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | |
| | | { |
| | | if(m_bEUARTTxEn) |
| | | { |
| | | OUT485_DISABLE; |
| | | m_bEUARTTxEn = 0; |
| | | // temp32 = GPIOC->CRH; //C10æ¬ç©ºè¾å
¥ |
| | | // temp32 &= ~(0x00000000F<<8); |
| | |
| | | m_bEUARTCheckingSend = 0; |
| | | return; |
| | | } |
| | | |
| | | if(!m_bEUARTTxEn) |
| | | { |
| | | m_bEUARTTxEn = 1; |
| | | OUT485_ENABLE; |
| | | delay_us(10); |
| | | // 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++; |
| | | EXT_UART->DR = m_EUART_TxFrames[m_EUART_TxFrm_Tail].buf[s_count]; |
| | | s_count++; |
| | | if(s_count >= m_EUART_TxFrames[m_EUART_TxFrm_Tail].len) //ä¸å¸§æ°æ®åé宿¯ |
| | | { |
| | | s_count = 0; |
| | |
| | | } // */ |
| | | |
| | | #else |
| | | /* |
| | | |
| | | //æ£æ¥æ¯å¦æ°æ®å¸§éè¦åé |
| | | void UART_CheckSend(void) |
| | | { |
| | |
| | | } // */ |
| | | #endif |
| | | |
| | | |
| | | u16 t1,t2,t3; |
| | | //å°ä¸å¸§æ°æ®åå
¥åééå |
| | | void UART_PushFrame(uint8_t* pdata, int32_t data_len) |
| | | { |
| | | // uint8_t temp8 = 0; |
| | | if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) |
| | | { |
| | | return; |
| | | } |
| | | m_bEUARTPushingFrms = 1; |
| | | |
| | | if(data_len > EUART_TX_FRMBUF_SIZE || m_EUART_TxFrm_FreeFrmLen <= 0) //帧é¿åº¦è¶
èå´æç¼å已满 |
| | | { |
| | | m_bEUARTPushingFrms = 0; |
| | |
| | | m_EUART_TxFrm_Head = 0; |
| | | m_EUART_TxFrm_FreeFrmLen--; |
| | | m_bEUARTPushingFrms = 0; |
| | | UART_CheckSend(); |
| | | } |
| | | |
| | | //å°ææ°ä¸å¸§æ°æ®Popåºéå |
| | |
| | | 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) |
| | | { |
| | | |
| | |
| | | while (!(USART1->SR & USART_FLAG_TXE)); |
| | | return (ch); |
| | | } |
| | | //////////////////////////////////////////////////////////////USART2 |
| | | |
| | | void UART2_DMAConfiguration(void) |
| | | { |
| | | DMA_InitTypeDef DMA_InitStructure; |
| | | |
| | | RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); |
| | | |
| | | //UARTçDMAæ°æ®æ¥æ¶åå§å |
| | | DMA_DeInit(UART2_RX_DMA_CH); |
| | | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)( &(EXT_UART2->DR)); //å¤è®¾æ°æ®å¯åå¨ |
| | | DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)m_EUART_DMA_RXBuf; //æ°æ®Buf |
| | | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //å¤è®¾ä½æºå¤´ |
| | | DMA_InitStructure.DMA_BufferSize = EUART_RX_BUF_SIZE; //Bufå¤§å° |
| | | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //å¤è®¾å°åä¸å¢å |
| | | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //å
åå°åå¢å |
| | | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //åè |
| | | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //åèï¼æ³¨æä¸ä¸ä¸ä¸ªåéåç§°ä¸åï¼ï¼ï¼ |
| | | DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //å¾ªç¯æ¨¡å¼ |
| | | DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //ä¼å
级 |
| | | DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //éå
åå°å
å |
| | | DMA_Init(UART2_RX_DMA_CH, &DMA_InitStructure); |
| | | USART_DMACmd(EXT_UART2, USART_DMAReq_Rx, ENABLE); |
| | | DMA_Cmd(UART2_RX_DMA_CH, ENABLE); |
| | | |
| | | #ifdef EXUART_USE_TXDMA |
| | | //UARTçDMAæ°æ®åéåå§å |
| | | DMA_DeInit(EUART_TX_DMA_CH); |
| | | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(EXT_UART->DR)); //å¤è®¾æ°æ®å¯åå¨ |
| | | DMA_InitStructure.DMA_MemoryBaseAddr = 0; //æ°æ®Buf |
| | | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //å¤è®¾ä½ç®æ |
| | | DMA_InitStructure.DMA_BufferSize = 0; //Bufå¤§å° |
| | | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //å¤è®¾å°åå¯åå¨ä¸éå¢ |
| | | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //å
åå°åéå¢ |
| | | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //å¤è®¾åè为åä½ |
| | | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //å
ååè为åä½ï¼æ³¨æä¸ä¸ä¸ä¸ªåéåç§°ä¸åï¼ï¼ï¼ |
| | | DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //æ®éæ¨¡å¼ |
| | | DMA_InitStructure.DMA_Priority = DMA_Priority_High; //ä¼å
级 |
| | | DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //éå
åå°å
å |
| | | DMA_Init(EUART_TX_DMA_CH, &DMA_InitStructure); |
| | | |
| | | // DMA_ITConfig(EUART_TX_DMA_CH, DMA_IT_TC, ENABLE); //DMAä¼ è¾å®æä¸æ |
| | | USART_DMACmd(EXT_UART,USART_DMAReq_Tx,ENABLE); //å¤è®¾ä½¿è½DMA // */ |
| | | #endif |
| | | } |
| | | |
| | | void Uart2_Init(void) |
| | | { |
| | | GPIO_InitTypeDef GPIO_InitStructure; |
| | | USART_InitTypeDef USART_InitStructure; |
| | | USART_ClockInitTypeDef USART_ClockInitStructure; |
| | | |
| | | /* Enable GPIO clock */ |
| | | // RCC_APB2PeriphClockCmd(EU_RCC_GPIO | RCC_APB2Periph_AFIO, ENABLE); |
| | | /* Enable USART clock */ |
| | | RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); |
| | | |
| | | Usart1InitVariables(); |
| | | |
| | | //åå§å管è |
| | | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; |
| | | GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; //Rx䏿è¾å
¥ |
| | | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
| | | GPIO_Init(EU_RX_GPIO, &GPIO_InitStructure); |
| | | |
| | | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; |
| | | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //Txæ¨æ½å¤ç¨è¾åº GPIO_Mode_AF_PP |
| | | GPIO_Init(EU_TX_GPIO, &GPIO_InitStructure); |
| | | |
| | | |
| | | #ifdef UART_GPIO_REMAP_ENABLE |
| | | GPIO_PinRemapConfig(UART_GPIO_REMAP, ENABLE); |
| | | #endif |
| | | |
| | | USART_DeInit(EXT_UART2); |
| | | USART_InitStructure.USART_BaudRate = EXUART_BAUD_RADE; |
| | | 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_ClockInitStructure.USART_Clock = USART_Clock_Disable; |
| | | USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; |
| | | USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; |
| | | USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; |
| | | |
| | | USART_ClockInit(EXT_UART2, &USART_ClockInitStructure); |
| | | USART_Init(EXT_UART2, &USART_InitStructure); |
| | | // USART_ITConfig(EXT_UART, USART_IT_RXNE, ENABLE);//??????,????? ?????????? |
| | | // Enable the USARTx |
| | | USART_Cmd(EXT_UART2, ENABLE); |
| | | //DMAé
ç½®ï¼é¡»æ¾å°UARTåå§åä¹åï¼ |
| | | UART2_DMAConfiguration(); |
| | | |
| | | } |
| | | |
| | | void UART2_CheckReceive(void) |
| | | { |
| | | int32_t DMACnt = 0; |
| | | int32_t MaxDataLen = EUART_RX_BUF_SIZE; |
| | | |
| | | //妿æ£å¨å¾åééå䏿·»å æ°æ®ï¼éåº |
| | | if(m_bEUARTPushingFrms) |
| | | return; |
| | | //夿æ¯å¦æ£å¨Check |
| | | if(m_bEUARTCheckingRec) |
| | | return; |
| | | m_bEUARTCheckingRec = 1; |
| | | if(UART2_RX_DMA_CH->CNDTR == 0) |
| | | { |
| | | m_bEUARTCheckingRec = 0; |
| | | return; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (UART2_RX_DMA_CH->CNDTR); |
| | | while( m_EUART2_DMA_RXPtr != DMACnt && MaxDataLen > 0) |
| | | { |
| | | Usart1ParseDataCallback(m_EUART_DMA_RXBuf[m_EUART2_DMA_RXPtr]); |
| | | delay_us(10); |
| | | m_EUART2_DMA_RXPtr++; |
| | | if( m_EUART2_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART2_DMA_RXPtr = 0; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (UART2_RX_DMA_CH->CNDTR); |
| | | MaxDataLen--; |
| | | } |
| | | m_bEUARTCheckingRec = 0; |
| | | } |
| | | |
| | | |
| | | |
| | | |