From 1ad0399f0cdc7959b8259c6b159980d3702d3794 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 29 十一月 2024 15:12:19 +0800 Subject: [PATCH] 增加STS_MODE宏定义切换 --- keil/include/drivers/Usart.c | 239 +++++++++++++++++++++++++++++------------------------------ 1 files changed, 119 insertions(+), 120 deletions(-) diff --git a/keil/include/drivers/Usart.c b/keil/include/drivers/Usart.c index df35beb..3256a82 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,51 @@ 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; } -#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 +90,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 +100,7 @@ // m_bEUARTTxEn = 0; // t3++; //// temp32 = GPIOC->CRH; //C10悬空输入 -//// temp32 &= ~(0x00000000F<<8); +//// temp32 &= ~(0x00000000F<<8); //// temp32 |= (0x000000004<<8); //// GPIOC->CRH = temp32;// */ // } @@ -109,7 +108,7 @@ // m_bEUARTCheckingSend = 0; // return; // } -// +// // if(!m_bEUARTTxEn) // { // m_bEUARTTxEn = 1; @@ -123,9 +122,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 +135,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) //传输未完成 - { - 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 @@ -191,59 +190,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(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(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 +253,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 +271,7 @@ //{ // unsigned int k=0; -// do +// do // { // Uart2_SendByte( *(str + k) ); // k++; -- Gitblit v1.9.3