UartDma工作方式

一、初始化

1.初始化串口,时钟

MX_USART1_UART_Init();

串口时钟初始化为内部时钟

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_HSI;

PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_HSI;

2.初始化dma,端口复用

HAL_UART_MspInit()

打开空闲帧中断

__HAL_UART_ENABLE_IT(uartHandle, UART_IT_IDLE);

二、启动接收传送

1.启动数据接收

/*启动DMA接收传送*/
void    Mx_Uart_DebugRxStart(UART_E uart)
{
    if(uart>= UART_MAX){return ;}
    if(!g_stMyUart[uart].bDebugRxStop){return ;}

    for(uint8 i=0;i<UART_DEBUG_BUFF_LEVER;i++)
    {
        if(!g_stMyUart[uart].bDebugRxAvail[i])
        {
            g_stMyUart[uart].bDebugRxStop=false;
            HAL_UART_Receive_DMA(g_stMyUart[uart].huart
              ,g_stMyUart[uart].cDebugBuffRx[i]
              ,UART_RX_BUFF_SIZE-1);
            g_stMyUart[uart].cCurDebugRxBuff=i;
            g_stMyUart[uart].uDebugRxCount[i]=0;
            break;
        }
    }
}

2.如果接收完数据则触发DMA中断,触 发DMa中断后,调用传送完成中断,如果收到空闲帧,也会调用传送完成中断

uint32_t temp;
    temp = huart->Instance->ISR;
    temp = huart->Instance->RDR;
    if(HAL_OK !=HAL_UART_DMAStopRx(huart))
    {
        Error_Handler();
    }
    g_stMyUart[uart].bDebugRxStop=true;
    if(NULL != huart->hdmarx)
    {
        temp  = huart->hdmarx->Instance->CNDTR;
        MX_UART_DebugGetData(uart,temp);
        Mx_Uart_DebugRxStart(uart);
    }
    else{Error_Handler();}

停止DMA传送,置接收停止标志,读取数据,重新开始数据接收

三、发送DMA

1.启动传送

if(HAL_UART_Transmit_DMA(g_stMyUart[UART_DEBUG].huart
                      , g_stMyUart[UART_DEBUG].cDebugBuffTx[i]
                      , g_stMyUart[UART_DEBUG].uDebugTxCount[i]) == HAL_OK)
                    {
                        g_stMyUart[UART_DEBUG].cCurDebugTxBuff=i;
                        g_stMyUart[UART_DEBUG].uDebugTxCount[i]=0;
                    }

2.DMA传送完成时,打开串口发送完成中断,

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    UART_E uart;
    for(uart=UART_DEBUG;uart<UART_MAX;uart++)
    {
        if(g_stMyUart[uart].huart == huart){break;}
    }
    if(UART_MAX == uart){return ;}

    HAL_UART_DMAStopTx(huart);
    if(g_stMyUart[uart].cCurDebugTxBuff <UART_DEBUG_BUFF_LEVER)
    {
        g_stMyUart[uart].bDebugTxEn[g_stMyUart[uart].cCurDebugTxBuff]=false;
    }
}
时间: 2024-10-07 02:53:28

UartDma工作方式的相关文章

Rsync的工作方式及Sersync

Rsync的工作方式 单个主机本地之间的数据传输(此时类似于cp命令的功能). 借助rcp,ssh等同到来传输数据(此时类似于scp命令的功能). 以守护进程(socket)的方式传输数据(这个是rsync自身的重要的功能). cp -a /etc/hosts /tmp/ rsync -avz /etc/hosts /tmp/ rsync --delete /null/ tmp/ 推送scp /etc/hosts ***@********:/tmp/ 推送rsync -avz -e 'ssh '

从一个简单例子来理解js引用类型指针的工作方式

? 1 2 3 4 5 6 7 <script> var a = {n:1};  var b = a;   a.x = a = {n:2};  console.log(a.x);// --> undefined  console.log(b.x);// --> [object Object]  </script> 上面的例子看似简单,但结果并不好了解,很容易把人们给想绕了--"a.x不是指向对象a了么?为啥log(a.x)是undefined?".&

LVS三种工作方式八种算法

一.集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式.集群计算机通常用来改进单个计算机的计算速度和/或可靠性.一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多. 集群就是一组独立的计算机,通过网络连接组合成一个组合来共同完一个任务 LVS在企业架构中的位置: 以上的

Buffer的工作方式

1.Buffer的工作方式 前面<java NIO的工作方式>介绍了Selector检测到通信信道I/O有数据传输时,通过select()方法取得SocketChannel,将数据读取或写入Buffer缓冲区,下面讨论Buffer如何接受和写出数据.通过查看JDK源码可知道,Buffer的构造函数 Buffer(int mark, int pos, int lim, int cap) { // package-private if (cap < 0) throw new IllegalA

MVC4 WebAPI(二)——Web API工作方式

在上篇文章中和大家一起学习了建立基本的WebAPI应用,立刻就有人想到了一些问题:1.客户端和WebService之间文件传输2.客户端或者服务端的安全控制要解决这些问题,要了解一下WebAPI的基本工作方式. (一)WebAPI中工作的Class 在MVC中大家都知道,获取Request和Response使用HttpRequest和HttpResponse两个类,在WebAPI中使用两外两个类:HttpRequestMessage 和HttpResponseMessage,分别用于封装Requ

Java NIO的工作方式

1.BIO带来的挑战 BIO即阻塞IO,不管是磁盘IO,还是网络IO,数据在写入OutputStream或者从InputStream读取时都有可能发生阻塞,一旦有阻塞,当前线程将会被挂起,即线程进入非可执行状态,在这个状态下,CPU不会给线程分配时间片,线程将会失去CPU的使用权,即线程暂停运行,这在当前的大规模访问量和有性能要求的情况下是不能被接受的.虽然当前的网络I/O有一些解决办法,如一个客户端一个处理线程,出现阻塞时只是一个线程阻塞而不会影响其他线程工作,还有为了减少系统线程的开销  ,

单片机定时/计数工作方式

单片机中的定时/计数器都能有多种用途,要通过定时/计数器的方式控制字来设置,需要的用途. 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON.,TMOD和TCON是名称,我们在写程序时就能直接用这个名称来指定它们,当然也能直接用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译一下而已).     TMOD被分成两部份,每部份4位.分别用于控制T1和T0.TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(TF1.0在这).TR0

STC15 串口(工作方式1)使用小结

这里暂且不说其他工作方式,以后有时间补上.仅总结下STC15串口工作方式1的一些注意点. 串口1: setp1 波特率发生器: T2定时器(默认).T1定时器: 设置位:S1ST2(AUXR.0),1--T2,0--T1,此位复位值为1. 12T模式(默认):通过T2x12(AUXR.2),T1x12(AUXR.6)位确定,0--12T模式,1--1T模式:这两位复位值位0. (这里可能有点模糊, 解释一下:所谓1T模式就是T1X12位置1,相当于T1速度提高12倍,原来计数加1需要12T,现在

了解IPtables的工作方式

Firewall:工作域.于主机或网络边缘,对于进出的报文根据规则定义的规则作检查,进而对被规则匹配的报文作为相应的处理.主要分为网络防火墙和主机防火墙 IDS(入侵检测系统):Instrusion Detect System 分别为以下两种:   HIDS:Host IDS: NIDS: Network IDS IPS:(入侵防御系统Intrusion Protect System) HoneyPot: 蜜罐,诱引不法信息进入,使用反向追踪 bt(backtrack):安全工具发行版 安全评估