盘STM32方案时,常用DMA传输数据,好给MCU省下资源去干干其它的事。
模模糊糊的概念中,DMA 就是又省又快!到底有多快有多少省呢?闲着手痒搞搞测试,结果还真有些惊喜!
将分别测试USART通过printf、DMA两种方式,测试输出数据(TX)时,在耗时、速度上的差别。
举报
// 重定向fputc函数 // printf的输出,指向fputc,由fputc输出到串口 // 这里使用串口1(USART1)输出printf信息 int fputc(int ch, FILE *f) { // 重要判断 if(xFlag.PrintfOK == 0) return 0; // 判断USART是否已配置,防止在配置前调用printf被卡死 while((USARTx ->SR&0X40)==0); // 等待上一次串口数据发送完成 USARTx ->DR = (u8) ch; // 写DR,串口1将发送数据 return ch; }
/****************************************************************************** * 函 数: print * 功 能: UART使用DMA发送数据 * 参 数: u8* charTemp 要发送的字符串首地址 * 返回值: * 备 注: 魔女开发板团队 资料存放Q群:262901124 最后修改_2020年05月10日 ******************************************************************************/ void print(char* charTemp) { u32 num = 0; char* t=charTemp ; while(*t++ !=0) num++; RCC->AHBENR|=1<<0; // 开启DMA1时钟 DMA1_Channel4->CPAR = (u32)&USARTx->DR; // 外设地址 DMA1_Channel4->CMAR = (u32)charTemp; // 存储器地址 DMA1_Channel4->CNDTR = num; // 传输数据量 DMA1_Channel4->CCR = 1<<4; // 数据传输方向 0:从外设读 1:从存储器读 DMA1_Channel4->CCR |= 0<<5; // 循环模式 0:不循环 1:循环 DMA1_Channel4->CCR |= 0<<6; // 外设地址非增量模式 DMA1_Channel4->CCR |= 1<<7; // 存储器增量模式 DMA1_Channel4->CCR |= 0<<8; // 外设数据宽度为8位 DMA1_Channel4->CCR |= 0<<10; // 存储器数据宽度8位 DMA1_Channel4->CCR |= 0<<12; // 中等优先级 DMA1_Channel4->CCR |= 0<<14; // 非存储器到存储器模式 DMA1_Channel4->CCR |= 1<<0; // 开启DMA传输 }
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
48
605
1
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号