46
603
2159
初级工程师
盘STM32方案时,常用DMA传输数据,好给MCU省下资源去干干其它的事。
模模糊糊的概念中,DMA 就是又省又快!到底有多快有多少省呢?闲着手痒搞搞测试,结果还真有些惊喜!
将分别测试USART通过printf、DMA两种方式,测试输出数据(TX)时,在耗时、速度上的差别。
使用特权
346365183da3a17b6.png (433.32 KB )
下载附件
2023-9-30 23:24 上传
7594765183dbb628a3.png (263.98 KB )
// 重定向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传输 }
5673365183df574ed2.png (114.54 KB )
2023-9-30 23:25 上传
1731365183e1d3698e.png (320.5 KB )
2023-9-30 23:26 上传
6937465183e2541d33.png (301.98 KB )
184
8184
2万
技术总监
发表回复 本版积分规则 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
1
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注21ic项目外包
扫码关注21ic视频号
扫码关注21ic抖音号
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才 | 论坛帮助
京公网安备 11010802024343号