¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "Usart.h" |
| | | #include <string.h> |
| | | #include <stdio.h> |
| | | #include "mk_uart.h" |
| | | //#include "modbus.h" |
| | | //#include "Rcc_Nvic_Systick.h" |
| | | |
| | | //æ°æ®åééååé |
| | | EUART_Frame m_EUART_TxFrames[EUART_TX_FRM_SIZE]; //æ°æ®åé帧éå |
| | | volatile int8_t m_EUART_TxFrm_Tail = 0; //æ°æ®åé帧éåå°¾æé |
| | | volatile int8_t m_EUART_TxFrm_Head = 0; //æ°æ®åé帧éå头æé |
| | | 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; //å½åæ°æ®å°å |
| | | //int16_t DMA_rxtemp = 0,DMA_rxtemp2 = 0; //å½åæ°æ®å°åç¼å |
| | | //uint16_t datadelaycount = 0; //å©ä½1使°æ®å»¶æ¶çå¾
å¤ç |
| | | //æ å¿åé |
| | | volatile uint8_t m_bEUARTPushingFrms = 0; //æ£å¨å¾åééååæ°æ® |
| | | volatile uint8_t m_bEUARTCheckingSend = 0; //æ£å¨ç¡®è®¤æ°æ®åé |
| | | volatile uint8_t m_bEUARTCheckingRec = 0; //æ£å¨ç¡®è®¤æ¥æ¶æ°æ® |
| | | volatile uint8_t m_bEUARTTxEn = 0; //使è½åé |
| | | |
| | | void (*Usart1ParseDataCallback)(uint8_t); |
| | | void Usart1InitVariables(void) |
| | | { |
| | | m_EUART_TxFrm_FreeFrmLen = EUART_TX_FRM_SIZE-1; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | //uint8_t overrun_flag=0; |
| | | //uint16_t t1,t2,t3,t4; |
| | | |
| | | uint16_t t3; |
| | | uint32_t cndtr=0; |
| | | void UART_CheckReceive(void) |
| | | { |
| | | int32_t DMACnt = 0; |
| | | int32_t MaxDataLen = EUART_RX_BUF_SIZE; |
| | | cndtr=get_uart1_dma_cndtr(); |
| | | //缺å°checkä¿æ¤ |
| | | //妿æ£å¨å¾åééå䏿·»å æ°æ®ï¼éåº |
| | | if(m_bEUARTPushingFrms) |
| | | return; |
| | | //夿æ¯å¦æ£å¨Check |
| | | if(m_bEUARTCheckingRec) |
| | | return; |
| | | m_bEUARTCheckingRec = 1; |
| | | if(cndtr== 0) |
| | | { |
| | | m_bEUARTCheckingRec = 0; |
| | | return; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - cndtr; |
| | | while( m_EUART_DMA_RXPtr != DMACnt && MaxDataLen > 0) |
| | | { |
| | | Usart1ParseDataCallback(m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]); |
| | | //waitusart_timer = tag_frequency*USART_KEEPWAKE_TIME; |
| | | m_EUART_DMA_RXPtr++; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - cndtr; |
| | | MaxDataLen--; |
| | | } |
| | | m_bEUARTCheckingRec = 0; |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | #ifndef EXUART_USE_TXDMA |
| | | //æ¥è¯¢æ¹å¼åéæ°æ® |
| | | void UART_CheckSend(void) |
| | | { |
| | | |
| | | // static int32_t s_count = 0; |
| | | //// uint32_t temp32 = 0; |
| | | |
| | | if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) |
| | | return; |
| | | m_bEUARTCheckingSend = 1; |
| | | |
| | | // //夿é忝å¦ä¸ºç©ºä»¥åDMAæ¯å¦ç©ºé² |
| | | // //if ((EXT_UART->ISR & UART_FLAG_TXE) == (uint16_t)RESET) //䏿¬¡åéæªå®æ//MK8000ä¿®æ¹ |
| | | // { |
| | | // m_bEUARTCheckingSend = 0; |
| | | // return; |
| | | // } |
| | | // |
| | | // if(m_EUART_TxFrm_Head == m_EUART_TxFrm_Tail) //éå为空 |
| | | // { |
| | | // //if((EXT_UART->ISR & UART_FLAG_TC) != (uint16_t)RESET) //åé宿¯//MK8000ä¿®æ¹ |
| | | // { |
| | | // if(m_bEUARTTxEn) |
| | | // { |
| | | // m_bEUARTTxEn = 0; |
| | | // t3++; |
| | | //// temp32 = GPIOC->CRH; //C10æ¬ç©ºè¾å
¥ |
| | | //// temp32 &= ~(0x00000000F<<8); |
| | | //// temp32 |= (0x000000004<<8); |
| | | //// GPIOC->CRH = temp32;// */ |
| | | // } |
| | | // } |
| | | // m_bEUARTCheckingSend = 0; |
| | | // return; |
| | | // } |
| | | // |
| | | // if(!m_bEUARTTxEn) |
| | | // { |
| | | // m_bEUARTTxEn = 1; |
| | | // #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->TDR = m_EUART_TxFrames[m_EUART_TxFrm_Tail].buf[s_count];//MK8000ä¿®æ¹ |
| | | // s_count++; |
| | | // if(s_count >= m_EUART_TxFrames[m_EUART_TxFrm_Tail].len) //ä¸å¸§æ°æ®åé宿¯ |
| | | // { |
| | | // s_count = 0; |
| | | // m_EUART_TxFrm_Tail++; |
| | | // if(m_EUART_TxFrm_Tail == EUART_TX_FRM_SIZE) |
| | | // m_EUART_TxFrm_Tail = 0; |
| | | // m_EUART_TxFrm_FreeFrmLen++; |
| | | // } |
| | | // m_bEUARTCheckingSend = 0; |
| | | // |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | #else |
| | | /* |
| | | //æ£æ¥æ¯å¦æ°æ®å¸§éè¦åé |
| | | void UART_CheckSend(void) |
| | | { |
| | | //夿æ¯å¦æ£å¨Check |
| | | if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) |
| | | return; |
| | | m_bEUARTCheckingSend = 1; |
| | | |
| | | //夿DMAé鿝妿£å¨å·¥ä½ |
| | | if((EUART_TX_DMA_CH->CCR & 0x01) != 0) //é鿣å¨å·¥ä½ |
| | | { |
| | | if((EUART_DMA->ISR & EUART_TX_DMA_IT_TC) == (uint32_t)RESET) //ä¼ è¾æªå®æ |
| | | { |
| | | m_bEUARTCheckingSend = 0; |
| | | return; |
| | | } |
| | | else |
| | | { |
| | | EUART_DMA->IFCR = EUART_TX_DMA_IT_TC; //æ¸
餿 å¿ï¼æ³¨æå¯åå¨åæ å¿åç§°ï¼ |
| | | EUART_TX_DMA_CH->CCR &= ~((uint32_t)0x01); //ç¦ç¨DMA |
| | | } |
| | | } |
| | | |
| | | //夿é忝å¦ä¸ºç©º |
| | | if(m_EUART_TxFrm_Head == m_EUART_TxFrm_Tail) |
| | | { |
| | | m_bEUARTCheckingSend = 0; |
| | | return; |
| | | } |
| | | |
| | | //å¼å¯ä¸æ¬¡æ°æ®åé |
| | | EUART_TX_DMA_CH->CMAR = (uint32_t)m_EUART_TxFrames[m_EUART_TxFrm_Tail].buf; //è¦åéçå
åå°å |
| | | EUART_TX_DMA_CH->CNDTR = m_EUART_TxFrames[m_EUART_TxFrm_Tail].len; //è¦åéçåèæ° |
| | | EUART_TX_DMA_CH->CCR |= 0x01; //å¼å¯ä¸æ¬¡DMA |
| | | m_EUART_TxFrm_Tail++; |
| | | if(m_EUART_TxFrm_Tail == EUART_TX_FRM_SIZE) |
| | | m_EUART_TxFrm_Tail = 0; |
| | | m_EUART_TxFrm_FreeFrmLen++; |
| | | m_bEUARTCheckingSend = 0; |
| | | } // */ |
| | | #endif |
| | | |
| | | |
| | | //å°ä¸å¸§æ°æ®åå
¥åééå |
| | | 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; |
| | | return; |
| | | } |
| | | |
| | | //å°è¦åéçæ°æ®å¸§åå
¥éå |
| | | m_EUART_TxFrames[m_EUART_TxFrm_Head].len = data_len; |
| | | memcpy((uint8_t*)m_EUART_TxFrames[m_EUART_TxFrm_Head].buf, (uint8_t*)pdata, data_len); |
| | | m_EUART_TxFrm_Head++; |
| | | if(m_EUART_TxFrm_Head == EUART_TX_FRM_SIZE) |
| | | m_EUART_TxFrm_Head = 0; |
| | | m_EUART_TxFrm_FreeFrmLen--; |
| | | m_bEUARTPushingFrms = 0; |
| | | } |
| | | |
| | | //å°ææ°ä¸å¸§æ°æ®Popåºéå |
| | | void UART_PopFrame(void) |
| | | { |
| | | if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) |
| | | return; |
| | | if(m_EUART_TxFrm_FreeFrmLen >= EUART_TX_FRM_SIZE-1) |
| | | return; |
| | | m_EUART_TxFrm_Head--; |
| | | if(m_EUART_TxFrm_Head < 0) |
| | | m_EUART_TxFrm_Head = EUART_TX_FRM_SIZE-1; |
| | | m_EUART_TxFrm_FreeFrmLen++; |
| | | } |
| | | void USART_putc(uint8_t c) |
| | | { |
| | | //while(!(USART2->SR & 0x00000040)); |
| | | //USART_SendData(USART2,c); |
| | | /* e.g. write a character to the USART */ |
| | | uart_send(UART_ID1, &c, 1, NULL); |
| | | |
| | | /* Loop until the end of transmission */ |
| | | //while ((USART1->ISR, UART_FLAG_TC) == RESET) ;MK8000ä¿®æ¹ |
| | | } |
| | | 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) |
| | | //{ |
| | | // |
| | | //HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1); |
| | | // return (ch); |
| | | //} |
| | | |
| | | |
| | | |
| | | ///***************** UARTåéä¸ä¸ªå符 **********************/ |
| | | //void Uart2_SendByte( uint8_t ch ) |
| | | //{ |
| | | // /* åéä¸ä¸ªåèæ°æ®å°USART1 */ |
| | | // HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0x7FFF); |
| | | //} |
| | | ///***************** åéæå®é¿åº¦çå符串 **********************/ |
| | | //void Uart2_SendStr_length( uint8_t *str,uint32_t strlen ) |
| | | //{ |
| | | // unsigned int k=0; |
| | | // do |
| | | // { |
| | | // Uart2_SendByte( *(str + k) ); |
| | | // k++; |
| | | // } while(k < strlen); |
| | | //} |
| | | |
| | | ///***************** åéå符串 **********************/ |
| | | //void Uart2_SendString( uint8_t *str) |
| | | //{ |
| | | // unsigned int k=0; |
| | | |
| | | // do |
| | | // { |
| | | // Uart2_SendByte( *(str + k) ); |
| | | // k++; |
| | | // } while(*(str + k)!='\0'); |
| | | //} |
| | | |
| | | |
| | | |
| | | |
| | | |