From 681567d6d1bd2894eccde5b22a948eac7d3a22a5 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 20 九月 2024 18:38:25 +0800 Subject: [PATCH] 对应发货标签V1.6,更改版本号为V1.1,与一期标签分开,更改了tag的uwb测距配置与DW1000通讯,并将测距接包逻辑单次接包改为打开循环接收 --- keil/include/drivers/Usart.c | 275 ++++++++++++++++++++++++++++++------------------------ 1 files changed, 154 insertions(+), 121 deletions(-) diff --git a/keil/include/drivers/Usart.c b/keil/include/drivers/Usart.c index 6d4af12..4469110 100644 --- a/keil/include/drivers/Usart.c +++ b/keil/include/drivers/Usart.c @@ -6,7 +6,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; //数据发送帧队列剩余帧数 @@ -23,8 +23,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; } @@ -38,52 +38,85 @@ 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; - + 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; + } +void UART0_CheckReceive(void) +{ + int32_t DMACnt = 0; + int32_t MaxDataLen = EUART_RX_BUF_SIZE; + cndtr=get_uart0_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 +#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; + if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) + return; + m_bEUARTCheckingSend = 1; // //判断队列是否为空以及DMA是否空闲 // //if ((EXT_UART->ISR & UART_FLAG_TXE) == (uint16_t)RESET) //上次发送未完成//MK8000修改 @@ -91,7 +124,7 @@ // m_bEUARTCheckingSend = 0; // return; // } -// +// // if(m_EUART_TxFrm_Head == m_EUART_TxFrm_Tail) //队列为空 // { // //if((EXT_UART->ISR & UART_FLAG_TC) != (uint16_t)RESET) //发送完毕//MK8000修改 @@ -101,7 +134,7 @@ // m_bEUARTTxEn = 0; // t3++; //// temp32 = GPIOC->CRH; //C10悬空输入 -//// temp32 &= ~(0x00000000F<<8); +//// temp32 &= ~(0x00000000F<<8); //// temp32 |= (0x000000004<<8); //// GPIOC->CRH = temp32;// */ // } @@ -109,7 +142,7 @@ // m_bEUARTCheckingSend = 0; // return; // } -// +// // if(!m_bEUARTTxEn) // { // m_bEUARTTxEn = 1; @@ -123,9 +156,9 @@ //// temp32 |= (0x000000009<<8); //// GPIOC->CRH = temp32;// */ // } -// +// // //发送一个字节数据 -// //EXT_UART->TDR = m_EUART_TxFrames[m_EUART_TxFrm_Tail].buf[s_count];//MK8000修改 +// //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) //一帧数据发送完毕 // { @@ -136,54 +169,54 @@ // 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) //传输未完成 + //判断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 @@ -191,59 +224,59 @@ void UART_PushFrame(uint8_t* pdata, int32_t data_len) { // uint8_t temp8 = 0; - if(m_bEUARTPushingFrms || m_bEUARTCheckingSend) - return; - m_bEUARTPushingFrms = 1; + 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(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; + //将要发送的数据帧压入队列 + 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(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); + //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修改 + /* 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 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); //} @@ -254,13 +287,13 @@ //void Uart2_SendByte( uint8_t ch ) //{ // /* 发送一个字节数据到USART1 */ -// HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0x7FFF); +// HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0x7FFF); //} ///***************** 发送指定长度的字符串 **********************/ //void Uart2_SendStr_length( uint8_t *str,uint32_t strlen ) //{ // unsigned int k=0; -// do +// do // { // Uart2_SendByte( *(str + k) ); // k++; @@ -272,7 +305,7 @@ //{ // unsigned int k=0; -// do +// do // { // Uart2_SendByte( *(str + k) ); // k++; -- Gitblit v1.9.3