|
发表于 2022-3-9 22:47:06
|
显示全部楼层
可以不是用中断,如果实时性要求不高,完全不知道什么时候传输完成,只需要在cpu空闲的时候去dma的buf取出数据来处理就好了,下面是在项目中实际使用的无中断dma版本串口驱动uart.h
- /** ****************************************************************************
- * @file uart.h
- * @author mojinpan
- * @copyright (c) 2018-20xx JL Tech. Co., Ltd.
- * @brief 串口驱动,DMA环形buf方式
- * @version V1.4
- * @date 2020-11-22
- *
- * @par 功能说明
- * @details
- * 1.提供STM32H7系列CPU的UART驱动支持
- * 2.提供将printf重定向到指定UART的支持
- *
- * @par 移植说明
- * @details
- * 1.定义硬件管脚宏定义
- * 2.定义UART对象
- * 4.调用UART_Init()进行初始化
- * 5.调用Uart_Link2Console()重定向printf和scanf到指定串口(非必须)
- *
- * @par 调用说明
- * @details
- * 1.调用UART_Send()发数据
- * 2.必须通过UART_GetDataLen()查询是否有接收数据并调用UART_Recv()从buf中取出数据
- * 3.接收数据的轮询间隔由UART_BUF_LEN的大小及波特率决定,未能及时取走数据会存在被覆盖的风险
- *******************************************************************************/
- #ifndef __UART_H__
- #define __UART_H__
- #if defined(__cplusplus)
- extern "C" {
- #endif
- /*******************************************************************************
- Header Files 头文件
- *******************************************************************************/
- /*******************************************************************************
- Macro Definition 宏定义
- *******************************************************************************/
- // #define STDIO_IS_UART //开启uart重定向到stdout和stdin
- #define UART_BUF_LEN 256 //环形buf长度
- #define UART_TIMEOUT_MAX 10000 //超时等待,n个时钟周期
- //debug信息输出方式
- #define UART_DEBUG(...) printf(__VA_ARGS__);printf("\r\n")
- //uart通道定义
- #define COM0 LPUART1
- #define COM1 USART1
- #define COM2 USART2
- #define COM3 USART3
- #define COM4 UART4
- #define COM5 UART5
- #define COM6 USART6
- #define COM7 UART7
- #define COM8 UART8
- //uart状态
- #define UART_OK 0
- #define UART_SET_ERR 1
- #define UART_DATA_ERR 2
- #define UART_WIRTE_ERR 3
- /*******************************************************************************
- Data Type 数据类型
- *******************************************************************************/
- ///* @brief uart对象
- typedef struct
- {
- USART_TypeDef* idx; //uart基地址
- uint32_t bps; //波特率
- uint32_t state; //uart当前状态,具体定义见宏定义
- UART_HandleTypeDef huart; //uart配置信息
- DMA_HandleTypeDef hdma_rx; //rx的dma信息
- struct //rx的环形buf
- {
- uint32_t iIdx;
- uint32_t oIdx;
- uint8_t* data;
- size_t len;
- }rbuf;
- } UART_Device;
- /*******************************************************************************
- Function declaration 函数声明
- *******************************************************************************/
- uint8_t Uart_Init(UART_Device* dev,USART_TypeDef* uart,uint32_t bps,uint8_t* buf,size_t len);
- uint8_t UART_Send(UART_Device* dev,uint8_t *buf, size_t len);
- uint32_t UART_Recv(UART_Device* dev,uint8_t *buf, size_t len);
- uint32_t UART_GetDataLen(UART_Device* dev);
- void Uart_ClearBuf(UART_Device *dev);
- void Uart_Link2Console(UART_Device *uart);
- signed char Uart_ConsoleRecvByte(char* recvData);
- void Uart_ConsoleSendByte(const char data);
- void Uart_ConsoleSend(uint8_t *buf, size_t len);
- uint8_t Uart_DeInit(UART_Device* dev);
- #if defined(__cplusplus)
- }
- #endif
- #endif
- /*********************************END OF FILE**********************************/
复制代码
uart.c
- /** ****************************************************************************
- * @file uart.c
- * @author mojinpan
- * @copyright (c) 2018-20xx JL Tech. Co., Ltd.
- * @brief 串口驱动,DMA环形buf方式
- * @version V1.4
- * @date 2020-11-22
- *
- * @version V1.0
- * @date 2020-04-22
- * @details
- * 1.将STM32F7的串口驱动移植到STM32H7上
- * 2.增加UART_NEW()的宏定义用于将对象结构件UART_Device强制指定到SRAM中,否则DMA无法访问buf
- * 3.UART_Recv()函数增加对Dcache的清除操作,以便正确读取到SRAM中buf的数据
- *
- * @version V1.1
- * @date 2020-07-07
- * @details
- * 1.完善驱动,将所有串口都引出
- *
- * @version V1.2
- * @date 2020-07-28
- * @details
- * 1.扩大UART_Recv()中删除Dcache的范围,解决buf最后4个字节,在连续数据输入时可能无法更新的bug
- * 2.DmaInit()中按照勘误要求在UART使用DMA时需对SxCR的bit20进行置位,以解决数据可能被冻结的bug
- *
- * @version V1.3
- * @date 2020-08-31
- * @details
- * 1.RX和TX改为初始化成上拉模式,解决TTL模式下外部没有上拉电阻的时候出现乱码的问题
- *
- * @version V1.4
- * @date 2020-11-22
- * @details
- * 1.增加STDIO_IS_UART的宏定义来控制是否做stdout和stdin的重定向
- *
- * @version V1.4
- * @date 2021-04-12
- * @details
- * 1.增加AC6编译器的支持
- * 2.支持独立配置buf大小
- *******************************************************************************/
- #include <stdio.h>
- #include "bsp.h"
- #include "uart.h"
- /*******************************************************************************
- Macro Definition 宏定义
- *******************************************************************************/
- /*******************************************************************************
- Global Variables 全局变量
- *******************************************************************************/
- UART_Device* Puart;
- /** ****************************************************************************
- * @brief 初始化prtinf的底层函数
- *******************************************************************************/
- void Uart_Link2Console(UART_Device *uart)
- {
- Puart = uart;
- }
- #ifdef STDIO_IS_UART
- #if !defined(__MICROLIB)
- //#pragma import(__use_no_semihosting)
- __asm (".global __use_no_semihosting\n\t");
- void _sys_exit(int x) //避免使用半主机模式
- {
- x = x;
- }
- //__use_no_semihosting was requested, but _ttywrch was
- void _ttywrch(int ch)
- {
- ch = ch;
- }
- struct __FILE
- {
- int handle;
- };
- FILE __stdout;
- #endif
- #if defined ( __GNUC__ ) && !defined (__clang__)
- #define PutChar() __io_putchar(int ch)
- #else
- #define PutChar() fputc(int ch, FILE *f)
- #endif // !defined(__MICROLIB)
- /** ****************************************************************************
- * @brief 发送一个字符
- *******************************************************************************/
- static int SendChar(int ch)
- {
- UART_Send(Puart,(uint8_t*)&ch,1);
- return ch;
- }
- /** ****************************************************************************
- * @brief 接收一个字符
- *******************************************************************************/
- static int GetKey(void)
- {
- uint8_t recvData;
- uint8_t i = 0;
- while(i == 0)
- {
- i = UART_GetDataLen(Puart);
- }
- UART_Recv(Puart,&recvData,1);
- return recvData;
- }
- /** ****************************************************************************
- * @brief 重定向_ttywrch函数,避免报错
- *******************************************************************************/
- void _ttywrch(int ch)
- {
- SendChar(ch);
- }
- /** ****************************************************************************
- * @brief 重定向_ferror函数,避免报错
- *******************************************************************************/
- int _ferror(FILE *f) {
- return EOF;
- }
- /** ****************************************************************************
- * @brief 定义_sys_exit()以避免使用半主机模式
- *******************************************************************************/
- void _sys_exit(int x)
- {
- x = x;
- }
- /** ****************************************************************************
- * @brief 重定向fputc函数,以实现支持printf函数,而不需要选择use MicroLIB
- *******************************************************************************/
- int PutChar()
- {
- /* 实现串口发送一个字节数据的函数 */
- UART_Send(Puart,(uint8_t*)&ch,1);
- return ch;
- }
- /** ****************************************************************************
- * @brief 重定向fgetc函数,以支持scanf、getchar等函数,而不需要选择use MicroLIB
- *******************************************************************************/
- int fgetc(FILE *f)
- {
- return (GetKey());
- }
- #endif
- /** ****************************************************************************
- * @brief Console接收一个字符,非阻塞式
- * @return 0:接收成功,-1:接收失败
- *******************************************************************************/
- signed char Uart_ConsoleRecvByte(char* recvData)
- {
- if( UART_GetDataLen(Puart))
- {
- UART_Recv(Puart,(uint8_t*)recvData,1);
- return 0;
- }
- return -1;
- }
- /** ****************************************************************************
- * @brief Console显示一个字符
- * @param data:需发送的字符
- *******************************************************************************/
- void Uart_ConsoleSendByte(const char data)
- {
- putchar(data);
- }
- /** ****************************************************************************
- * @brief 串口发送函数
- * @param uart: uart对象
- * @param Buf:数据存放指针
- * @param len:发送长度
- *******************************************************************************/
- uint8_t UART_Send(UART_Device* dev,uint8_t *buf, size_t len)
- {
- //合法性检查
- if(buf == NULL)return UART_DATA_ERR;
- if(len == NULL)return UART_DATA_ERR;
- if(HAL_UART_Transmit(&(dev->huart),buf,len,UART_TIMEOUT_MAX) != HAL_OK){return UART_WIRTE_ERR;}
- return UART_OK;
- }
- /** ****************************************************************************
- * @brief Console发送
- * @param Buf:数据存放指针
- * @param len:发送长度
- *******************************************************************************/
- void Uart_ConsoleSend(uint8_t *buf, size_t len)
- {
- UART_Send(Puart,buf,len);
- }
- /** ****************************************************************************
- * @brief 串口接收函数,从缓冲区中取接收数据
- * @param uart: uart对象
- * @param Buf:数据存放指针
- * @param len:接收长度
- *******************************************************************************/
- uint32_t UART_Recv(UART_Device *dev,uint8_t *buf,size_t len)
- {
- uint32_t i = 0;
- dev->rbuf.iIdx = dev->rbuf.len - __HAL_DMA_GET_COUNTER(&dev->hdma_rx);
- //删除对应区域的Dcache,以便直接读取sram中内容
- //cache按照32字节为块处理,+32保证整个块全部都能处理到
- SCB_InvalidateDCache_by_Addr((uint32_t *)(dev->rbuf.data),dev->rbuf.len+32);
-
- for(i = 0;i < len;i++)
- {
- if(dev->rbuf.oIdx == dev->rbuf.iIdx)
- { // No Len data
- break;
- }
- buf[i] = dev->rbuf.data[dev->rbuf.oIdx];
- dev->rbuf.oIdx++;
- dev->rbuf.oIdx = dev->rbuf.oIdx % dev->rbuf.len;
- }
- return i;
- }
- /** ****************************************************************************
- * @brief 清空缓存
- * @param uart: uart对象
- *******************************************************************************/
- void Uart_ClearBuf(UART_Device *dev)
- {
- dev->rbuf.iIdx = dev->rbuf.len - __HAL_DMA_GET_COUNTER(&dev->hdma_rx);
- dev->rbuf.oIdx = dev->rbuf.iIdx;
- }
- /** ****************************************************************************
- * @brief 获取缓冲区数据长度
- * @param dev: uart对象
- *******************************************************************************/
- uint32_t UART_GetDataLen(UART_Device* dev)
- {
- dev->rbuf.iIdx = dev->rbuf.len - __HAL_DMA_GET_COUNTER(&dev->hdma_rx);
- return (dev->rbuf.iIdx - dev->rbuf.oIdx + dev->rbuf.len) % dev->rbuf.len;
- }
- /** ****************************************************************************
- * @brief 初始化uart的gpio
- * @param dev 设备对象
- *******************************************************************************/
- static uint32_t IoInit(UART_Device* dev)
- {
- if(dev->idx == COM0){
- #if (defined COM0_RX) && (defined COM0_TX)
- GPIO_Init(COM0_RX,GPIO_AF_PP_PULLUP);
- GPIO_Init(COM0_TX,GPIO_AF_PP_PULLUP);
- #else
- UART_DEBUG("COM0 prot not define!");
- #endif
- }
- else if(dev->idx == COM1){
- #if (defined COM1_RX) && (defined COM1_TX)
- GPIO_Init(COM1_RX,GPIO_AF_PP_PULLUP);
- GPIO_Init(COM1_TX,GPIO_AF_PP_PULLUP);
- #else
- UART_DEBUG("COM1 prot not define!");
- #endif
- }
- else if(dev->idx == COM2){
- #if (defined COM2_RX) && (defined COM2_TX)
- GPIO_Init(COM2_RX,GPIO_AF_PP_PULLUP);
- GPIO_Init(COM2_TX,GPIO_AF_PP_PULLUP);
- #else
- UART_DEBUG("COM2 prot not define!");
- #endif
- }
- else if(dev->idx == COM3){
- #if (defined COM3_RX) && (defined COM3_TX)
- GPIO_Init(COM3_RX,GPIO_AF_PP_PULLUP);
- GPIO_Init(COM3_TX,GPIO_AF_PP_PULLUP);
- #else
- UART_DEBUG("COM3 prot not define!");
- #endif
- }
- else if(dev->idx == COM4){
- #if (defined COM4_RX) && (defined COM4_TX)
- GPIO_Init(COM4_RX,GPIO_AF_PP_PULLUP);
- GPIO_Init(COM4_TX,GPIO_AF_PP_PULLUP);
- #else
- UART_DEBUG("COM4 prot not define!");
- #endif
- }
- else if(dev->idx == COM5){
- #if (defined COM5_RX) && (defined COM5_TX)
- GPIO_Init(COM5_RX,GPIO_AF_PP_PULLUP);
- GPIO_Init(COM5_TX,GPIO_AF_PP_PULLUP);
- #else
- UART_DEBUG("COM5 prot not define!");
- #endif
- }
- else if(dev->idx == COM6){
- #if (defined COM6_RX) && (defined COM6_TX)
- GPIO_Init(COM6_RX,GPIO_AF_PP_PULLUP);
- GPIO_Init(COM6_TX,GPIO_AF_PP_PULLUP);
- #else
- UART_DEBUG("COM6 prot not define!");
- #endif
- }
- else if(dev->idx == COM7){
- #if (defined COM7_RX) && (defined COM7_TX)
- GPIO_Init(COM7_RX,GPIO_AF_PP_PULLUP);
- GPIO_Init(COM7_TX,GPIO_AF_PP_PULLUP);
- #else
- UART_DEBUG("COM7 prot not define!");
- #endif
- }
- else if(dev->idx == COM8){
- #if (defined COM8_RX) && (defined COM8_TX)
- GPIO_Init(COM8_RX,GPIO_AF_PP_PULLUP);
- GPIO_Init(COM8_TX,GPIO_AF_PP_PULLUP);
- #else
- UART_DEBUG("COM8 prot not define!");
- #endif
- }
- else
- {
- }
- return UART_OK;
- }
- /** ****************************************************************************
- * @brief 串口DMA初始化
- * @param dev 设备对象
- *******************************************************************************/
- static uint32_t DmaInit(UART_Device* dev)
- {
- if(dev->idx == LPUART1){
- __HAL_RCC_BDMA_CLK_ENABLE();
- dev->hdma_rx.Instance = BDMA_Channel0;
- dev->hdma_rx.Init.Request = BDMA_REQUEST_LPUART1_RX ;
- }
- else if(dev->idx == USART1){
- __HAL_RCC_DMA1_CLK_ENABLE();
- dev->hdma_rx.Instance = DMA1_Stream0;
- dev->hdma_rx.Init.Request = DMA_REQUEST_USART1_RX;
- }
- else if(dev->idx == USART2){
- __HAL_RCC_DMA1_CLK_ENABLE();
- dev->hdma_rx.Instance = DMA1_Stream1;
- dev->hdma_rx.Init.Request = DMA_REQUEST_USART2_RX;
- }
- else if(dev->idx == USART3){
- __HAL_RCC_DMA1_CLK_ENABLE();
- dev->hdma_rx.Instance = DMA1_Stream2;
- dev->hdma_rx.Init.Request = DMA_REQUEST_USART3_RX;
- }
- else if(dev->idx == UART4){
- __HAL_RCC_DMA1_CLK_ENABLE();
- dev->hdma_rx.Instance = DMA1_Stream3;
- dev->hdma_rx.Init.Request = DMA_REQUEST_UART4_RX;
- }
- else if(dev->idx == UART5){
- __HAL_RCC_DMA1_CLK_ENABLE();
- dev->hdma_rx.Instance = DMA1_Stream4;
- dev->hdma_rx.Init.Request = DMA_REQUEST_UART5_RX;
- }
- else if(dev->idx == USART6){
- __HAL_RCC_DMA1_CLK_ENABLE();
- dev->hdma_rx.Instance = DMA1_Stream5;
- dev->hdma_rx.Init.Request = DMA_REQUEST_USART6_RX;
- }
- else if(dev->idx == UART7){
- __HAL_RCC_DMA1_CLK_ENABLE();
- dev->hdma_rx.Instance = DMA1_Stream6;
- dev->hdma_rx.Init.Request = DMA_REQUEST_UART7_RX;
- }
- else if(dev->idx == UART8){
- __HAL_RCC_DMA1_CLK_ENABLE();
- dev->hdma_rx.Instance = DMA1_Stream7;
- dev->hdma_rx.Init.Request = DMA_REQUEST_UART8_RX;
- }
- else
- {
- UART_DEBUG("Uart port error!");
- return UART_SET_ERR;
- }
-
- dev->hdma_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
- dev->hdma_rx.Init.PeriphInc = DMA_PINC_DISABLE;
- dev->hdma_rx.Init.MemInc = DMA_MINC_ENABLE;
- dev->hdma_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
- dev->hdma_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
- dev->hdma_rx.Init.Mode = DMA_CIRCULAR;
- dev->hdma_rx.Init.Priority = DMA_PRIORITY_LOW;
- dev->hdma_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
- dev->hdma_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
- dev->hdma_rx.Init.MemBurst = DMA_MBURST_INC16;
- dev->hdma_rx.Init.PeriphBurst = DMA_PBURST_INC16;
- //按照STM32H750的勘误要求uart如果使用dma,对应的SxCR bit20必须置位
- ((DMA_Stream_TypeDef *)(dev->hdma_rx.Instance))->CR |= 0x100000;
- if (HAL_DMA_Init(&(dev->hdma_rx)) != HAL_OK){return UART_SET_ERR;}
- __HAL_LINKDMA(&(dev->huart),hdmarx,dev->hdma_rx);
- return UART_OK;
- }
- /** ****************************************************************************
- * @brief 串口初始化
- * @param dev 设备对象
- * @param uart 串口
- * @param bps 波特率
- *******************************************************************************/
- uint8_t Uart_Init(UART_Device* dev,USART_TypeDef* uart,uint32_t bps,uint8_t* buf,size_t len)
- {
- RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
-
- dev->idx = uart;
- dev->bps = bps;
- dev->rbuf.len = len;
- dev->rbuf.data = buf;
- IoInit(dev); //初始化gpio
-
- if(dev->idx == LPUART1){
- RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
- RCC_PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_D3PCLK1;
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
- __HAL_RCC_LPUART1_CLK_ENABLE();
- }
- else if(dev->idx == USART1){
- RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART16;
- RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
- __HAL_RCC_USART1_CLK_ENABLE();
- }
- else if(dev->idx == USART2){
- RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART234578;
- RCC_PeriphClkInit.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
- __HAL_RCC_USART2_CLK_ENABLE();
- }
- else if(dev->idx == USART3){
- RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART234578;
- RCC_PeriphClkInit.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
- __HAL_RCC_USART3_CLK_ENABLE();
- }
- else if(dev->idx == UART4){
- RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART234578;
- RCC_PeriphClkInit.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
- __HAL_RCC_UART4_CLK_ENABLE();
- }
- else if(dev->idx == UART5){
- RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART234578;
- RCC_PeriphClkInit.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
- __HAL_RCC_UART5_CLK_ENABLE();
- }
- else if(dev->idx == USART6){
- RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART16;
- RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
- __HAL_RCC_USART6_CLK_ENABLE();
- }
- else if(dev->idx == UART7){
- RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART234578;
- RCC_PeriphClkInit.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
- __HAL_RCC_UART7_CLK_ENABLE();
- }
- else if(dev->idx == UART8){
- RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART234578;
- RCC_PeriphClkInit.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
- HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
- __HAL_RCC_UART8_CLK_ENABLE();
- }
- dev->huart.Instance = dev->idx; //串口信息
- dev->huart.Init.BaudRate = dev->bps; //波特率
- dev->huart.Init.WordLength = UART_WORDLENGTH_8B; //字长为8位数据格式
- dev->huart.Init.StopBits = UART_STOPBITS_1; //1bit停止位
- dev->huart.Init.Parity = UART_PARITY_NONE; //无奇偶校验位
- dev->huart.Init.Mode = UART_MODE_TX_RX; //收发模式
- dev->huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流控
- dev->huart.Init.OverSampling = UART_OVERSAMPLING_16;
- dev->huart.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
- dev->huart.Init.ClockPrescaler = UART_PRESCALER_DIV1;
- dev->huart.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
-
- if (HAL_UART_Init(&(dev->huart)) != HAL_OK){return UART_SET_ERR;}
- if (HAL_UARTEx_SetRxFifoThreshold(&(dev->huart),UART_RXFIFO_THRESHOLD_8_8) != HAL_OK){return UART_SET_ERR;}
- if (HAL_UARTEx_DisableFifoMode(&(dev->huart)) != HAL_OK){return UART_SET_ERR;}
- if (DmaInit(dev)!= HAL_OK){return UART_SET_ERR;} //初始化dma
- if (HAL_UART_Receive_DMA(&(dev->huart),dev->rbuf.data,dev->rbuf.len)!= HAL_OK){return UART_SET_ERR;}
- Uart_ClearBuf(dev);
-
- return UART_OK;
- }
- /** ****************************************************************************
- * @brief 串口GPIO解绑
- * @param gpiox 端口号
- * @param gpio_pin 管脚号
- * @param alternate 复用模式
- * @note 此函数是用于适应GPIO宏定义格式
- *******************************************************************************/
- void Uart_GpioDeInit(GPIO_TypeDef* gpiox,uint16_t gpio_pin,uint8_t alternate)
- {
- HAL_GPIO_DeInit(gpiox, gpio_pin);
- }
- /** ****************************************************************************
- * @brief 串口解绑
- * @param dev 设备对象
- * @note 主要是用于配合boot模式使用
- *******************************************************************************/
- uint8_t Uart_DeInit(UART_Device* dev)
- {
- if(dev->idx == LPUART1){
- __HAL_RCC_LPUART1_CLK_DISABLE();
- #if (defined COM0_RX) && (defined COM0_TX)
- Uart_GpioDeInit(COM0_RX);
- Uart_GpioDeInit(COM0_RX);
- #else
- UART_DEBUG("COM0 prot not define!");
- #endif
- }
- else if(dev->idx == USART1){
- __HAL_RCC_USART1_CLK_DISABLE();
- #if (defined COM1_RX) && (defined COM1_TX)
- Uart_GpioDeInit(COM1_RX);
- Uart_GpioDeInit(COM1_TX);
- #else
- UART_DEBUG("COM1 prot not define!");
- #endif
- }
- else if(dev->idx == USART2){
- __HAL_RCC_USART2_CLK_ENABLE();
- #if (defined COM2_RX) && (defined COM2_TX)
- Uart_GpioDeInit(COM2_RX);
- Uart_GpioDeInit(COM2_TX);
- #else
- UART_DEBUG("COM2 prot not define!");
- #endif
- }
- else if(dev->idx == USART3){
- __HAL_RCC_USART3_CLK_DISABLE();
- #if (defined COM3_RX) && (defined COM3_TX)
- Uart_GpioDeInit(COM3_RX);
- Uart_GpioDeInit(COM3_TX);
- #else
- UART_DEBUG("COM3 prot not define!");
- #endif
- }
- else if(dev->idx == UART4){
- __HAL_RCC_UART4_CLK_DISABLE();
- #if (defined COM4_RX) && (defined COM4_TX)
- Uart_GpioDeInit(COM4_RX);
- Uart_GpioDeInit(COM4_TX);
- #else
- UART_DEBUG("COM4 prot not define!");
- #endif
- }
- else if(dev->idx == UART5){
- __HAL_RCC_UART5_CLK_DISABLE();
- #if (defined COM5_RX) && (defined COM5_TX)
- Uart_GpioDeInit(COM5_RX);
- Uart_GpioDeInit(COM5_TX);
- #else
- UART_DEBUG("COM5 prot not define!");
- #endif
- }
- else if(dev->idx == USART6){
- __HAL_RCC_USART6_CLK_DISABLE();
- #if (defined COM6_RX) && (defined COM6_TX)
- Uart_GpioDeInit(COM6_RX);
- Uart_GpioDeInit(COM6_TX);
- #else
- UART_DEBUG("COM6 prot not define!");
- #endif
- }
- else if(dev->idx == UART7){
- __HAL_RCC_UART7_CLK_DISABLE();
- #if (defined COM7_RX) && (defined COM7_TX)
- Uart_GpioDeInit(COM7_RX);
- Uart_GpioDeInit(COM7_TX);
- #else
- UART_DEBUG("COM7 prot not define!");
- #endif
- }
- else if(dev->idx == UART8){
- __HAL_RCC_UART8_CLK_DISABLE();
- #if (defined COM8_RX) && (defined COM8_TX)
- Uart_GpioDeInit(COM8_RX);
- Uart_GpioDeInit(COM8_TX);
- #else
- UART_DEBUG("COM8 prot not define!");
- #endif
- }
- HAL_DMA_DeInit(&(dev->hdma_rx));
-
- return 0;
- }
- /*********************************END OF FILE**********************************/
复制代码
|
|