From d7f957eb56272e006de3dd404454cdf56de86655 Mon Sep 17 00:00:00 2001 From: yincheng.zhong <634916154@qq.com> Date: 星期日, 25 二月 2024 18:42:52 +0800 Subject: [PATCH] 调通数据上报,测距,同步 --- Src/OnChipDevices/Usart.c | 310 +++++++++++++++++++++++++------------------------- 1 files changed, 155 insertions(+), 155 deletions(-) diff --git a/Src/OnChipDevices/Usart.c b/Src/OnChipDevices/Usart.c index d42fcac..04cf33b 100644 --- a/Src/OnChipDevices/Usart.c +++ b/Src/OnChipDevices/Usart.c @@ -5,7 +5,7 @@ #include "Rcc_Nvic_Systick.h" //数据发送队列变量 -EUART_Frame m_EUART_TxFrames[EUART_TX_FRM_SIZE]; //数据发送帧队列 +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; //数据发送帧队列剩余帧数 @@ -22,8 +22,8 @@ void (*Usart1ParseDataCallback)(uint8_t); void Usart1InitVariables(void) -{ - m_EUART_TxFrm_FreeFrmLen = EUART_TX_FRM_SIZE-1; +{ + m_EUART_TxFrm_FreeFrmLen = EUART_TX_FRM_SIZE-1; } //UART DMA的配置 @@ -34,144 +34,144 @@ uint16_t t1,t2,t3,t4; void UART_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(EUART_RX_DMA_CH->CNDTR == 0) - { - m_bEUARTCheckingRec = 0; - return; - } - DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->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; - //delay_us(10); - 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--; - } - m_bEUARTCheckingRec = 0; + int32_t DMACnt = 0; + int32_t MaxDataLen = EUART_RX_BUF_SIZE; + + //如果正在往发送队列中添加数据,退出 + if(m_bEUARTPushingFrms) + return; + //判断是否正在Check + if(m_bEUARTCheckingRec) + return; + m_bEUARTCheckingRec = 1; + if(EUART_RX_DMA_CH->CNDTR == 0) + { + m_bEUARTCheckingRec = 0; + return; + } + DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->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; + //delay_us(10); + 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--; + } + m_bEUARTCheckingRec = 0; } -#ifndef EXUART_USE_TXDMA +#ifndef EXUART_USE_TXDMA //查询方式发送数据 void UART_CheckSend(void) { - static int32_t s_count = 0; + static int32_t s_count = 0; // uint32_t temp32 = 0; - if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) - return; - m_bEUARTCheckingSend = 1; + if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) + return; + m_bEUARTCheckingSend = 1; - //判断队列是否为空以及DMA是否空闲 - if ((EXT_UART->ISR & UART_FLAG_TXE) == (uint16_t)RESET) //上次发送未完成 - { - m_bEUARTCheckingSend = 0; - return; - } - - if(m_EUART_TxFrm_Head == m_EUART_TxFrm_Tail) //队列为空 - { - if((EXT_UART->ISR & UART_FLAG_TC) != (uint16_t)RESET) //发送完毕 - { - if(m_bEUARTTxEn) - { - m_bEUARTTxEn = 0; - t3++; + //判断队列是否为空以及DMA是否空闲 + if ((EXT_UART->ISR & UART_FLAG_TXE) == (uint16_t)RESET) //上次发送未完成 + { + m_bEUARTCheckingSend = 0; + return; + } + + if(m_EUART_TxFrm_Head == m_EUART_TxFrm_Tail) //队列为空 + { + if((EXT_UART->ISR & UART_FLAG_TC) != (uint16_t)RESET) //发送完毕 + { + if(m_bEUARTTxEn) + { + m_bEUARTTxEn = 0; + t3++; // temp32 = GPIOC->CRH; //C10悬空输入 -// temp32 &= ~(0x00000000F<<8); +// 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 + } + } + 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]; - 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; - } // */ + } + + //发送一个字节数据 + EXT_UART->TDR = 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; + 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; +//判断是否正在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 @@ -179,60 +179,60 @@ 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; - } + if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) + return; + m_bEUARTPushingFrms = 1; - //将要发送的数据帧压入队列 - 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; + 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++; + 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(char c) { - //while(!(USART2->SR & 0x00000040)); - //USART_SendData(USART2,c); - /* e.g. write a character to the USART */ - HAL_UART_Transmit(&huart1,(uint8_t*)&c,1,1); + //while(!(USART2->SR & 0x00000040)); + //USART_SendData(USART2,c); + /* e.g. write a character to the USART */ + HAL_UART_Transmit(&huart1,(uint8_t*)&c,1,1); - /* Loop until the end of transmission */ - while ((USART1->ISR, UART_FLAG_TC) == RESET) ; + /* Loop until the end of transmission */ + while ((USART1->ISR, UART_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 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); + + HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1); + return (ch); } -- Gitblit v1.9.3