您好,欢迎光临本网站![请登录][注册会员]  
文件名称: STM32 DAM+串口
  所属分类: C
  开发工具:
  文件大小: 869kb
  下载次数: 0
  上传时间: 2019-03-03
  提 供 者: qq_37******
 详细说明:DMA + 串口空闲中断 在stm32上的一种应用,可供大家参考GPIO InitStructure. GPIO Pin= GPIO USART RX: GPIO Initstructure GPIO Mode= GPIO Mode IN floating GPIO Init(GPIO USART TYPE, &GPIO InitStructure //配置串口模式 USART Init Structure. usart BaudRate=115200 USART InitStructure USART WordLength= USART WordLength 8b USART InitStructure USART StopBits= USART StopBits 1 USART InitStructure USART Parity= USART Parity No USART InitStructure USART HardwareFlowControl= USART HardwareFlowControl None USART InitStructure USART Mode = USART Mode Rx USART Mode Tx: USART Init(USART1, &USART InitStructure //中断配置 NVIC InitStructure NVIC IRQChanne1= USART1 IROn NvIC InitStructurc NVIC IRQChanncIPrccmptionPriority-I NVIC Ini STruc Lure NVIC IRQChanne lSubPriorily-O NVIC InitStructure NVIC IRQChanne l Cmd= ENABLE NVIC Init(&NVIC InitStructure) /若总线空闲,产生中断*/ USART ITConfig (USART1, USART IT IDLE, ENABLE /开启串口DMA接收* USART DMACmd(USART1, USART DMAReg Rx, ENABlE) USART Cmd (USART1, ENABLE 代码比较简单,一看就明白了,这就是使用库函数开发的好处,代码易 懂。这里,关键的是要开启总线空闲中断,并且开启串凵DMA接收。注意,不要开启串凵接 收中断,不然接收数据就会一直产生中断了。 DMA配置 DMA配置,要先查看串口接收是使用的哪个DMA的哪个通道,对于 USART1RX使用的是 DMAI的5通道 USART3 TX 适1的E位 Tral CHt 硬件请求2 TH UP 通道2 TilA CH3 SPI: RX 软件触发体MMM位》 USART3 I 适2的EM位 TM1_CH2 硬件请求3 TMa cHi 通道3 SPI TX 状件触发MM材位 内 USARTI TX 通道3的EN位 TA1 CHE DMA1请求 TMI TRIG 硬件诸求4 nMI cO 通道4 TEN r4 CH2 饮件触发 MMEM2MEM位 SPLLS2 FX 通道4的EN位 USARTI AX SP112S2 TX 件话求5 通5 TM2 CHt 状件整发 MEMZMEM位 12C2 RX 通道5的EN位 USAFTN RX ToMi CH3 硬件请求6 Tu: cH1 通道6 然后就是代码配置DMA了。 void DmA init (void) DMA InitTypeDef DMA Initstructure: NVIC InitTypeDef NVIC Initstructure /开启DMA时钟* RCC AHBPeriphClockCmd(RCC AHBPeriph DMAl, ENABLE) ///* Enable the DMAl Interrupt * // NVIC Initstructure NVIC IRQChannel=DMAl Channe14 IRQn //通道设置为 串口1中断 // NVIC Initstructure. NVIC IRQChanneISubPriority=1;//中断响应优先级0 // NVIC Initstructure NVIC IRQChannelPreemptionPriority=l / NVIC Initstructure NVIC IRQChannelCmd-ENABLE //打开中断 NVIC Init(&NVIC Initstructure /*DM配置* DMA Initstructure DMA PeripheralBaseAddr=(u32)( &USART1->DR) DMA Initstructure DMA MemoryBaseAddr =(u32)receive data DMA Initstructure DMA DIR- DMA DIR PeripheraISrC DMA Initstructure DMA BufferSize=128 DMA Initstructure DMA Peripherallnc= DMA Peripherallnc Disable DMA Initstructure DMA Memorylnc =DMA Memory Inc Enable DMA Initstructure DMA PeripheralDataSize= DMA PeripheralDataSize Byte DMA Initstructure. DMA Memory- DMA MemoryDataSize Byte DMA Initstructure. DMA Mode= DMa Mode normal DMA Initstructure DMA Priority- DMA Priority high DMA Initstructure DMA M2M DMA M2M Disable DMA Init(DMA1 Channe 15, &DMA Initstructure) //启动DMA DMA Cmd (DMA1 Channel5, ENABLE //开启DMA发送发成中断 //DMA ITConfig(DMAl Channel4, DMA IT TC, ENABLE); 因为这里,不需要用到DMA中断,所以DMA中断就不要使能了。因此 DMA中断配置也就不需要了。这里,关键的是要设置 PMA PIR为 DMA DIR_ PeripheralSRC,表示数据是从外设到内存。这里设定的 DMA Mode是普通模式, 即数据传输就只能一次。 3、串口中断程序编写 这个就是关键的地方了。在这里,需要做什么了。需要对DMA设置下。当进入这个中断 的时候,串口接收的数据,已经在内存的数组中了。通过读取DMA的计数值,就可以知道接 收到了多少个数据。然后再把DMA给 diablo掉,重新设置接收数据长度,在开启DMA,接 收下一次串口数据。为什么要这么做了,因为在STM32手册中有如下说明: 当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作,要开始新的 DMA传输,需要在关闭DMA通道的情况下,在 DMA CNDTRX寄存器中重新写入传输数目。 另外还有一点,串口空闲中断触发后,硬件会自动将串∏空闲中断标志位给置1,我们 是需要将给标志位给置0的,不然又要进中断了,这个在手册中也有说明。 位4 DLE:监测到总线空闲( DLE line detected 当检测到总线空 位被硬件置位,如果 USART 的DLEE为1,则产生中断。由 软件序列清除该先读U5 ART SR,然后读 USART 0:没有检测到空闲总线 1:检测到空闲总线 注意:|DLE位不会再次被置高直到RXNE位被置起(即又检测到一次空闲总线) 代码就如下了: void LSART1 IRQHandler (void unsigned char num=0 if(USART GetITStatus(USART1, USART IT IDLE)=- SET) num= USART1->SR num= USART1->DR:/清 USART IT IDLE标志 DMA Cmd( DMAI Channel5, DISABLE);//关闭DMA num=128- DMA GetCurrDataCcunter (DMAI Channe 15) //得到真正接收数 据个数 receive data num='\0 DMAI Channe 15->CNDTR=128 //重新设置接收数据个数 DMA Cmd( DMAI Channel5, ENABLE);/开启DMA receive flag=1; //接收数据标志位置1 关键的一点,就是要读取SR,DR,将 USART IT IDLE标志给清掉,然后 DMA设置要注意下 在主函数中,使用下面代码测试: int maino periph inito: printf( hello world\n") while(1 while(receive flag=0) receive flag=0: printf(%s", receive data 当串口接收数据后,中断程序会使 receive flag为1,然后就跳出 while 循环。打印接收到的数据。 测试结果 野火多功能调试助手vD20 率囗调过功最[ GSMMe GPS定位时得善 hello world 60900 weiqi7777 波特车 welcone to weiqi blog 校整位 数据位 停止位 关率口 空换收区得址想示 动a 六进示 动发对1006- elcome to weigt blc 动发送十六进剩发送 青空重填 手动发送 加载交件 交件图径还Q选择要发送的交件 串口已开忍 收事节数:1748发事节数:1742计数清零 发送什么,就接收什么。 还测试了下,在波特率460800下,都还是能正常的工作的。
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索: STM32DAM+串口
 输入关键字,在本站1000多万海量源码库中尽情搜索: