1.dma简介 直接存储器存取(dma)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须cpu干预,数据可以通过dma快速地移动,这就节省了cpu的资源来做其他操作。
stm32f10x中有两个dma控制器(dma1有7个通道,dma2有5个通道)每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个dma请求的优先权。
dma1请求映像
usart1_tx – dma1_chnanel4
usart1_rc – dma1_channel5
利用dma功能完成串口数据处理,无需cpu干预,减少cpu占用。
2.程序设计 1.dma1_ch4配置
/******dma配合串口1发送数据**************形参:u32 cpar -- 外设地址****例:dma_ch4_init(&usart1->dr,buff)**外设地址:usart1->dr的地址** buff的地址**************************************/void dma_ch4_init(u32 cpar){ rcc->ahbenr|=1
ccr&=~(1ccr|=1dr的地址** buff的地址**************************************/void dma_ch5_init(u32 cpar,u32 cmar){ rcc->ahbenr|=1ccr&=~(1ccr|=1cr3|=1cr1|=1cr1|=1cr1|=1u8 usart1_rx_buff[1024];//串口1接收数据缓冲区u16 usart1_cnt=0;//保存数组下班u8 usart1_flag;//接收完成标志符void usart1_irqhandler(void){ u8 c; //清除标志:先读usart_sr,再读usart_dr if(usart1->sr&1dr=c; usart1_receive_data();//接收数据处理函数 } usart1->sr=0;//清除标志位}/*************************串口接收数据函数********************/void usart1_receive_data(void){ dma1_channel5->ccr&=~(1=1024)usart1_cnt=0; dma1->ifcr|=1ccr|=1sr&1<<7)); } #endif} 6.硬件初始化,dma配合串口调试
int main(){ u8 key; beep_init();//蜂鸣器初始化 led_init();//led初始化 key_init();//按键初始化 usartx_init(usart1,115200,72); while(1) { key=key_scan(); if(key) { usart1_sendstr((u8 *)dma1配合串口收发数据不定长测试234556789rn); } if(usart1_flag) { usart1_rx_buff[usart1_cnt]='�'; printf(%srn,usart1_rx_buff); usart1_flag=0; } }} 7.运行效果
工程师电子制作故事:单片机远程控制小车DIY设计
车规MCU选型的9大注意事项
浅谈2019年全球TV面板产业的机遇和挑战
iPhone11系列暗夜绿受欢迎程度最高
蓝牙耳机哪个品牌比较好,哪款蓝牙耳机2023年值得买,排行榜推荐
直接存储器存取(DMA)简介及程序设计
默克看好中国半导体发展,考虑进行更深度布局
SMIT率先推出CI Plus 2.0 CAM
MathWorks网络研讨会:使用MATLAB及Simulink启动软件定义无线电的开发
HSDPA基站部署及容量分析
浙江电力正在打造以特高压为骨干各级电网协调发展的新型电网模式
嵌入式TCP/IP协议单片机技术在网络通信中的应用
运放参数解析:输入输出电压范围
3D打印固态电池在2021年即将在德国量产 充电速度提高6倍
何在树莓派上更新Kodi
组态王与单片机多机串口通信的设计
过车辆计算网关平台推动软件定义的汽车
如何增强Wi-Fi信号
为什么心脏起搏器容易受到攻击
英特尔开发48核智能手机平板电脑芯片