开发工具:
文件大小: 869kb
下载次数: 0
上传时间: 2019-03-03
详细说明: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最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.