From cc432b761c884a0bd8e9d83db0a4e26109fc08b1 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 08 十一月 2024 15:35:38 +0800 Subject: [PATCH] 安邦手环GPS删除部分无用数据和修改4G波特率9600出厂测试固件 --- keil/include/drivers/Usart.c | 285 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 285 insertions(+), 0 deletions(-) diff --git a/keil/include/drivers/Usart.c b/keil/include/drivers/Usart.c new file mode 100644 index 0000000..6d4af12 --- /dev/null +++ b/keil/include/drivers/Usart.c @@ -0,0 +1,285 @@ +#include "Usart.h" +#include <string.h> +#include <stdio.h> +#include "mk_uart.h" +//#include "modbus.h" +//#include "Rcc_Nvic_Systick.h" + +//数据发送队列变量 +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; //数据发送帧队列剩余帧数 +//DMA数据接收缓存 +uint8_t m_EUART_DMA_RXBuf[EUART_RX_BUF_SIZE]; //DMA数据接收缓存 +volatile int32_t m_EUART_DMA_RXPtr = 0; //当前数据地址 +//int16_t DMA_rxtemp = 0,DMA_rxtemp2 = 0; //当前数据地址缓存 +//uint16_t datadelaycount = 0; //剩余1位数据延时等待处理 +//标志变量 +volatile uint8_t m_bEUARTPushingFrms = 0; //正在往发送队列存数据 +volatile uint8_t m_bEUARTCheckingSend = 0; //正在确认数据发送 +volatile uint8_t m_bEUARTCheckingRec = 0; //正在确认接收数据 +volatile uint8_t m_bEUARTTxEn = 0; //使能发送 + +void (*Usart1ParseDataCallback)(uint8_t); +void Usart1InitVariables(void) +{ + m_EUART_TxFrm_FreeFrmLen = EUART_TX_FRM_SIZE-1; +} + + + + + +//uint8_t overrun_flag=0; +//uint16_t t1,t2,t3,t4; + +uint16_t t3; +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; + +} + + + +#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; + +// //判断队列是否为空以及DMA是否空闲 +// //if ((EXT_UART->ISR & UART_FLAG_TXE) == (uint16_t)RESET) //上次发送未完成//MK8000修改 +// { +// m_bEUARTCheckingSend = 0; +// return; +// } +// +// if(m_EUART_TxFrm_Head == m_EUART_TxFrm_Tail) //队列为空 +// { +// //if((EXT_UART->ISR & UART_FLAG_TC) != (uint16_t)RESET) //发送完毕//MK8000修改 +// { +// if(m_bEUARTTxEn) +// { +// m_bEUARTTxEn = 0; +// t3++; +//// temp32 = GPIOC->CRH; //C10悬空输入 +//// 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 +//// 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];//MK8000修改 +// 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; + +//判断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; +} + +//开启一次数据发送 +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 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; + } + + //将要发送的数据帧压入队列 + 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++; +} +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); + + /* 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 fputc(int ch, FILE *f) +//{ +// +//HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1); +// return (ch); +//} + + + +///***************** UART发送一个字符 **********************/ +//void Uart2_SendByte( uint8_t ch ) +//{ +// /* 发送一个字节数据到USART1 */ +// HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0x7FFF); +//} +///***************** 发送指定长度的字符串 **********************/ +//void Uart2_SendStr_length( uint8_t *str,uint32_t strlen ) +//{ +// unsigned int k=0; +// do +// { +// Uart2_SendByte( *(str + k) ); +// k++; +// } while(k < strlen); +//} + +///***************** 发送字符串 **********************/ +//void Uart2_SendString( uint8_t *str) +//{ +// unsigned int k=0; + +// do +// { +// Uart2_SendByte( *(str + k) ); +// k++; +// } while(*(str + k)!='\0'); +//} + + + + + -- Gitblit v1.9.3