From fc89f1e7e828ce2045d9744ab4816b30d72e4c22 Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期三, 07 五月 2025 10:25:44 +0800 Subject: [PATCH] 1.12添加无测距休眠30秒开一次测距 --- keil/include/drivers/Usart1.c | 290 +++++++++++++++++++++++++++++----------------------------- 1 files changed, 145 insertions(+), 145 deletions(-) diff --git a/keil/include/drivers/Usart1.c b/keil/include/drivers/Usart1.c index 9c2333c..4d24aec 100644 --- a/keil/include/drivers/Usart1.c +++ b/keil/include/drivers/Usart1.c @@ -8,7 +8,7 @@ //#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; //数据发送帧队列剩余帧数 @@ -25,8 +25,8 @@ 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; } @@ -42,145 +42,145 @@ void UART1_CheckReceive(void) { - 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); + int32_t DMACnt2 = 0; + int32_t MaxDataLen2 = EUART1_RX_BUF_SIZE; - 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; + //如果正在往发送队列中添加数据,退出 + 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; } -#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) //传输未完成 - { - 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) +//判断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; } - - //开启一次数据发送 - 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; -} // */ + 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 @@ -188,37 +188,37 @@ void UART2_PushFrame(uint8_t* pdata, int32_t data_len) { // uint8_t temp8 = 0; - 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(m_bEUART1PushingFrms || m_bEUART1CheckingSend) + return; + m_bEUART1PushingFrms = 1; - //将要发送的数据帧压入队列 - 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; + 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; } //将最新一帧数据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) //{ @@ -240,7 +240,7 @@ //} //int fputc(int ch, FILE *f) //{ -// +// //HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1); // return (ch); //} @@ -250,14 +250,14 @@ /***************** 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++; @@ -267,9 +267,9 @@ /***************** 发送字符串 **********************/ void Uart2_SendString( uint8_t *str) { - unsigned int k=0; + unsigned int k=0; - do + do { Uart1_SendByte( *(str + k) ); k++; -- Gitblit v1.9.3