| | |
| | | //#include "Rcc_Nvic_Systick.h" |
| | | |
| | | //数据发送队列变量 |
| | | EUART1_Frame m_EUART1_TxFrames[EUART1_TX_FRM_SIZE]; //数据发送帧队列 |
| | | EUART1_Frame m_EUART1_TxFrames[EUART1_TX_FRM_SIZE]; //数据发送帧队列 |
| | | volatile int8_t m_EUART1_TxFrm_Tail = 0; //数据发送帧队列尾指针 |
| | | volatile int8_t m_EUART1_TxFrm_Head = 0; //数据发送帧队列头指针 |
| | | volatile int8_t m_EUART1_TxFrm_FreeFrmLen = 0; //数据发送帧队列剩余帧数 |
| | |
| | | |
| | | void (*Usart2ParseDataCallback)(uint8_t); |
| | | void Usart2InitVariables(void) |
| | | { |
| | | m_EUART1_TxFrm_FreeFrmLen = EUART1_TX_FRM_SIZE-1; |
| | | { |
| | | m_EUART1_TxFrm_FreeFrmLen = EUART1_TX_FRM_SIZE-1; |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | void UART1_CheckReceive(void) |
| | | { |
| | | int32_t DMACnt2 = 0; |
| | | int32_t MaxDataLen2 = EUART1_RX_BUF_SIZE; |
| | | int32_t DMACnt2 = 0; |
| | | int32_t MaxDataLen2 = EUART1_RX_BUF_SIZE; |
| | | |
| | | //如果正在往发送队列中添加数据,退出 |
| | | if(m_bEUART1PushingFrms) |
| | | return; |
| | | //判断是否正在Check |
| | | if(m_bEUART1CheckingRec) |
| | | return; |
| | | m_bEUART1CheckingRec = 1; |
| | | //if(EUART1_RX_DMA_CH->CNDTR == 0)MK8000修改 |
| | | { |
| | | m_bEUART1CheckingRec = 0; |
| | | return; |
| | | } |
| | | //DMACnt2 = EUART1_RX_BUF_SIZE - (EUART1_RX_DMA_CH->CNDTR); |
| | | |
| | | //如果正在往发送队列中添加数据,退出 |
| | | if(m_bEUART1PushingFrms) |
| | | return; |
| | | //判断是否正在Check |
| | | if(m_bEUART1CheckingRec) |
| | | return; |
| | | m_bEUART1CheckingRec = 1; |
| | | //if(EUART1_RX_DMA_CH->CNDTR == 0)MK8000修改 |
| | | { |
| | | m_bEUART1CheckingRec = 0; |
| | | return; |
| | | } |
| | | //DMACnt2 = EUART1_RX_BUF_SIZE - (EUART1_RX_DMA_CH->CNDTR); |
| | | |
| | | while( m_EUART1_DMA_RXPtr != DMACnt2 && MaxDataLen2 > 0) |
| | | { |
| | | Usart2ParseDataCallback(m_EUART1_DMA_RXBuf[m_EUART1_DMA_RXPtr]);//USART2搬运的数据缓存 |
| | | m_EUART1_DMA_RXPtr++; |
| | | if( m_EUART1_DMA_RXPtr >= EUART1_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART1_DMA_RXPtr = 0; |
| | | } |
| | | //DMACnt2 = EUART1_RX_BUF_SIZE - (EUART1_RX_DMA_CH->CNDTR);MK8000修改 |
| | | MaxDataLen2--; |
| | | } |
| | | m_bEUART1CheckingRec = 0; |
| | | while( m_EUART1_DMA_RXPtr != DMACnt2 && MaxDataLen2 > 0) |
| | | { |
| | | Usart2ParseDataCallback(m_EUART1_DMA_RXBuf[m_EUART1_DMA_RXPtr]);//USART2搬运的数据缓存 |
| | | m_EUART1_DMA_RXPtr++; |
| | | if( m_EUART1_DMA_RXPtr >= EUART1_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART1_DMA_RXPtr = 0; |
| | | } |
| | | //DMACnt2 = EUART1_RX_BUF_SIZE - (EUART1_RX_DMA_CH->CNDTR);MK8000修改 |
| | | MaxDataLen2--; |
| | | } |
| | | m_bEUART1CheckingRec = 0; |
| | | } |
| | | |
| | | |
| | | |
| | | #ifndef EXUART_USE_TXDMA |
| | | #ifndef EXUART_USE_TXDMA |
| | | //查询方式发送数据 |
| | | void UART2_CheckSend(void) |
| | | { |
| | | static int32_t s_count2 = 0; |
| | | static int32_t s_count2 = 0; |
| | | // uint32_t temp32 = 0; |
| | | |
| | | if(m_bEUART1PushingFrms || m_bEUART1CheckingSend)//往发送队列中发数据和确认数据发送都为0时 |
| | | return; |
| | | m_bEUART1CheckingSend = 1; |
| | | if(m_bEUART1PushingFrms || m_bEUART1CheckingSend)//往发送队列中发数据和确认数据发送都为0时 |
| | | return; |
| | | m_bEUART1CheckingSend = 1; |
| | | |
| | | //判断队列是否为空以及DMA是否空闲 |
| | | //if ((EXT_UART2->ISR & UART_FLAG_TXE) == (uint16_t)RESET) //上次发送未完成MK8000修改 |
| | | { |
| | | m_bEUART1CheckingSend = 0; |
| | | return; |
| | | } |
| | | |
| | | if(m_EUART1_TxFrm_Head == m_EUART1_TxFrm_Tail) //队列为空 |
| | | { |
| | | //if((EXT_UART2->ISR & UART_FLAG_TC) != (uint16_t)RESET) //发送完毕MK8000修改 |
| | | { |
| | | if(m_bEUART1TxEn) |
| | | { |
| | | m_bEUART1TxEn = 0; |
| | | t1++; |
| | | //判断队列是否为空以及DMA是否空闲 |
| | | //if ((EXT_UART2->ISR & UART_FLAG_TXE) == (uint16_t)RESET) //上次发送未完成MK8000修改 |
| | | { |
| | | m_bEUART1CheckingSend = 0; |
| | | return; |
| | | } |
| | | |
| | | if(m_EUART1_TxFrm_Head == m_EUART1_TxFrm_Tail) //队列为空 |
| | | { |
| | | //if((EXT_UART2->ISR & UART_FLAG_TC) != (uint16_t)RESET) //发送完毕MK8000修改 |
| | | { |
| | | if(m_bEUART1TxEn) |
| | | { |
| | | m_bEUART1TxEn = 0; |
| | | t1++; |
| | | // temp32 = GPIOC->CRH; //C10悬空输入 |
| | | // temp32 &= ~(0x00000000F<<8); |
| | | // temp32 &= ~(0x00000000F<<8); |
| | | // temp32 |= (0x000000004<<8); |
| | | // GPIOC->CRH = temp32;// */ |
| | | } |
| | | } |
| | | m_bEUART1CheckingSend = 0; |
| | | return; |
| | | } |
| | | |
| | | if(!m_bEUART1TxEn) |
| | | { |
| | | m_bEUART1TxEn = 1; |
| | | #ifdef BAUDRATE_19200 |
| | | delay_us(500); |
| | | #else |
| | | delay_us(10); |
| | | #endif |
| | | } |
| | | } |
| | | m_bEUART1CheckingSend = 0; |
| | | return; |
| | | } |
| | | |
| | | if(!m_bEUART1TxEn) |
| | | { |
| | | m_bEUART1TxEn = 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_UART2->TDR = m_EUART1_TxFrames[m_EUART1_TxFrm_Tail].buf[s_count2];MK8000修改 |
| | | s_count2++; |
| | | if(s_count2 >= m_EUART1_TxFrames[m_EUART1_TxFrm_Tail].len) //一帧数据发送完毕 |
| | | { |
| | | s_count2 = 0; |
| | | m_EUART1_TxFrm_Tail++; |
| | | if(m_EUART1_TxFrm_Tail == EUART1_TX_FRM_SIZE) |
| | | m_EUART1_TxFrm_Tail = 0; |
| | | m_EUART1_TxFrm_FreeFrmLen++; |
| | | } |
| | | m_bEUART1CheckingSend = 0; |
| | | } // */ |
| | | } |
| | | |
| | | //发送一个字节数据 |
| | | //EXT_UART2->TDR = m_EUART1_TxFrames[m_EUART1_TxFrm_Tail].buf[s_count2];MK8000修改 |
| | | s_count2++; |
| | | if(s_count2 >= m_EUART1_TxFrames[m_EUART1_TxFrm_Tail].len) //一帧数据发送完毕 |
| | | { |
| | | s_count2 = 0; |
| | | m_EUART1_TxFrm_Tail++; |
| | | if(m_EUART1_TxFrm_Tail == EUART1_TX_FRM_SIZE) |
| | | m_EUART1_TxFrm_Tail = 0; |
| | | m_EUART1_TxFrm_FreeFrmLen++; |
| | | } |
| | | m_bEUART1CheckingSend = 0; |
| | | } // */ |
| | | |
| | | #else |
| | | /* |
| | | /* |
| | | //检查是否数据帧需要发送 |
| | | void UART_CheckSend(void) |
| | | { |
| | | //判断是否正在Check |
| | | if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) |
| | | return; |
| | | m_bEUARTCheckingSend = 1; |
| | | //判断是否正在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) //传输未完成 |
| | | //判断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; |
| | | } |
| | | 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; |
| | | } // */ |
| | | |
| | | //开启一次数据发送 |
| | | 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 UART2_PushFrame(uint8_t* pdata, int32_t data_len) |
| | | { |
| | | // uint8_t temp8 = 0; |
| | | if(m_bEUART1PushingFrms || m_bEUART1CheckingSend) |
| | | return; |
| | | m_bEUART1PushingFrms = 1; |
| | | if(m_bEUART1PushingFrms || m_bEUART1CheckingSend) |
| | | return; |
| | | m_bEUART1PushingFrms = 1; |
| | | |
| | | if(data_len > EUART1_TX_FRMBUF_SIZE || m_EUART1_TxFrm_FreeFrmLen <= 0) //帧长度超范围或缓存已满 |
| | | { |
| | | m_bEUART1PushingFrms = 0; |
| | | return; |
| | | } |
| | | |
| | | if(data_len > EUART1_TX_FRMBUF_SIZE || m_EUART1_TxFrm_FreeFrmLen <= 0) //帧长度超范围或缓存已满 |
| | | { |
| | | m_bEUART1PushingFrms = 0; |
| | | return; |
| | | } |
| | | |
| | | //将要发送的数据帧压入队列 |
| | | m_EUART1_TxFrames[m_EUART1_TxFrm_Head].len = data_len; |
| | | memcpy((uint8_t*)m_EUART1_TxFrames[m_EUART1_TxFrm_Head].buf, (uint8_t*)pdata, data_len); |
| | | m_EUART1_TxFrm_Head++; |
| | | if(m_EUART1_TxFrm_Head == EUART1_TX_FRM_SIZE) |
| | | m_EUART1_TxFrm_Head = 0; |
| | | m_EUART1_TxFrm_FreeFrmLen--; |
| | | m_bEUART1PushingFrms = 0; |
| | | //将要发送的数据帧压入队列 |
| | | m_EUART1_TxFrames[m_EUART1_TxFrm_Head].len = data_len; |
| | | memcpy((uint8_t*)m_EUART1_TxFrames[m_EUART1_TxFrm_Head].buf, (uint8_t*)pdata, data_len); |
| | | m_EUART1_TxFrm_Head++; |
| | | if(m_EUART1_TxFrm_Head == EUART1_TX_FRM_SIZE) |
| | | m_EUART1_TxFrm_Head = 0; |
| | | m_EUART1_TxFrm_FreeFrmLen--; |
| | | m_bEUART1PushingFrms = 0; |
| | | } |
| | | |
| | | //将最新一帧数据Pop出队列 |
| | | void UART2_PopFrame(void) |
| | | { |
| | | if(m_bEUART1PushingFrms || m_bEUART1CheckingSend) |
| | | return; |
| | | if(m_EUART1_TxFrm_FreeFrmLen >= EUART1_TX_FRM_SIZE-1) |
| | | return; |
| | | m_EUART1_TxFrm_Head--; |
| | | if(m_EUART1_TxFrm_Head < 0) |
| | | m_EUART1_TxFrm_Head = EUART1_TX_FRM_SIZE-1; |
| | | m_EUART1_TxFrm_FreeFrmLen++; |
| | | if(m_bEUART1PushingFrms || m_bEUART1CheckingSend) |
| | | return; |
| | | if(m_EUART1_TxFrm_FreeFrmLen >= EUART1_TX_FRM_SIZE-1) |
| | | return; |
| | | m_EUART1_TxFrm_Head--; |
| | | if(m_EUART1_TxFrm_Head < 0) |
| | | m_EUART1_TxFrm_Head = EUART1_TX_FRM_SIZE-1; |
| | | m_EUART1_TxFrm_FreeFrmLen++; |
| | | } |
| | | //void USART_putc(char c) |
| | | //{ |
| | |
| | | //} |
| | | //int fputc(int ch, FILE *f) |
| | | //{ |
| | | // |
| | | // |
| | | //HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1); |
| | | // return (ch); |
| | | //} |
| | |
| | | /***************** UART发送一个字符 **********************/ |
| | | void Uart1_SendByte( uint8_t ch ) |
| | | { |
| | | /* 发送一个字节数据到USART2 */ |
| | | /* 发送一个字节数据到USART2 */ |
| | | uart_send(UART_ID1, &ch, 1, NULL); |
| | | } |
| | | /***************** 发送指定长度的字符串 **********************/ |
| | | void Uart2_SendStr_length( uint8_t *str,uint32_t strlen ) |
| | | { |
| | | unsigned int k=0; |
| | | do |
| | | unsigned int k=0; |
| | | do |
| | | { |
| | | Uart1_SendByte( *(str + k) ); |
| | | k++; |
| | |
| | | /***************** 发送字符串 **********************/ |
| | | void Uart2_SendString( uint8_t *str) |
| | | { |
| | | unsigned int k=0; |
| | | unsigned int k=0; |
| | | |
| | | do |
| | | do |
| | | { |
| | | Uart1_SendByte( *(str + k) ); |
| | | k++; |