打印

转:学习STM32最重要的内容

[复制链接]
2400|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangfeng33|  楼主 | 2013-11-8 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   前言:接触MCU的编程已经有几年的历史,刚开始是从PLC(C语言的)学习与应用,后来有学习了8bits的AVR单片机,对MCU有一定的了解;最近接触了STM32的Chip,发现其优点不只是单单宣传的32bits的MCU的速度,而且在编程的风格上也有了较大的变化(与我原有的编程习惯);特别是有一个与CPU并行运行的模块:DMA,对它印象深刻。现在就和大家一起讨论学习这个Module,谈谈我在学习中一些感悟和大家一起分享;如有对DMA理解和应用上的错误和偏差,欢迎“拍砖”和提出更正,虾米在此感谢大家了。哈哈!




  什么是STM32的DMA?其全称是:Direct Memory Access;根据ST公司提供的相关信息,DMA是STM32中一个独立与Cortex-M3内核的模块,有点类似与ADC、PWM、TIMER等模块;主要功能是通信“桥梁”的作用,可以将所有外设映射的寄存器“连接”起来,这样就可以高速问各寄存器,其传输不受CPU的支配,传输还是双向的;例如,从“表面”上看,它可以将flash中的数据与储存器中变量建立通讯,还可以将一外设的积存器或缓冲器与另外设的寄存器或缓冲器建立双向通讯,有点像把外设硬件之间用“导线”连接在一起了。其间的通讯不占CPU资源,访问速度高,对于实时性强的应用将是一个很好的选择;当然,对于实时性非常强的,建议还是采用专用的DSP芯片。




  过程:怎样启用DMA?首先,众所周知的是初始化,任何设备启用前都要对其进行初始化,要对模块初始化,还要先了解该模块相应的结构及其函数,以便正确的设置;由于DMA较为复杂,我就只谈谈DMA的基本结构和和常用函数,这些都是ST公司提供在库函数中的。




  1、  下面代码是一个标准DMA设置,当然实际应用中可根据实际情况进行裁减:

  DMA_DeInit(DMA_Channel1);

  上面这句是给DMA配置通道,根据ST提供的资料,STM3210Fx中DMA包含7个通道(CH1~CH7),也就是说可以为外设或memory提供7座“桥梁”(请允许我使用桥梁一词,我觉得更容易理解,哈哈,别“拍砖”呀!);

  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;

  上面语句中的DMA_InitStructure是一个DMA结构体,在库中有声明了,当然使用时就要先定义了;DMA_PeripheralBaseAddr是该结构体中一个数据成员,给DMA一个起始地址,好比是一个buffer起始地址,数据流程是:外设寄存器à DMA_PeripheralBaseAddàmemory中变量空间(或flash中数据空间等),ADC1_DR_Address是我定义的一个地址变量;

  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;

  上面这句很显然是DMA要连接在Memory中变量的地址,ADC_ConvertedValue是我自己在memory中定义的一个变量;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  上面的这句是设置DMA的传输方向,就如前面我所说的,DMA可以双向传输,也可以单向传输,这里设置的是单向传输,如果需要双向传输:把DMA_DIR_PeripheralSRC改成DMA_DIR_PeripheralDST即可。

  DMA_InitStructure.DMA_BufferSize = 2;

  上面的这句是设置DMA在传输时缓冲区的长度,前面有定义过了buffer的起始地址:ADC1_DR_Address ,为了安全性和可靠性,一般需要给buffer定义一个储存片区,这个参数的单位有三种类型:Byte、HalfWord、word,我设置的2个half-word(见下面的设置);32位的MCU中1个half-word占16 bits。

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  上面的这句是设置DMA的外设递增模式,如果DMA选用的通道(CHx)有多个外设连接,需要使用外设递增模式:DMA_PeripheralInc_Enable;我的例子里DMA只与ADC1建立了联系,所以选用DMA_PeripheralInc_Disable

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  上面的这句是设置DMA的内存递增模式,DMA访问多个内存参数时,需要使用DMA_MemoryInc_Enable,当DMA只访问一个内存参数时,可设置成:DMA_MemoryInc_Disable。

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  上面的这句是设置DMA在访问时每次操作的数据长度。有三种数据长度类型,前面已经讲过了,这里不在叙述。

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  与上面雷同。在此不再说明。

下面10项是控制类必须准备的,当这些都准备好了,比赛的时候就能得心应手了。
1、 电源模块:
①常用的电源稳压模块12V,9V,5V,3.3V和双电源±5V,±12V;
②可调升压电源模块;
2、 最小系统:
确定一类竞赛用的单片机,C51,AVR,FPGA,STM32等,做一个最小系统,引出所以端口。
3、 驱动模块:
这个应该是属于必备的模块(如果选择控制类题目),常用的L298,L297,UNL2003,UNL2803等。
4、 信号处理模块:
信号处理模块主要把一模拟信号转为开关量。把一些信号转为其他信号(把正弦波转为方波),电压比较器(LM393,LM339),信号放大(常用运放TL082,TL084).
5、 AD,DA模块,现在高级一点的单片机基本都带有AD,但是还是要准备一些DA模块。AD,DA模块能在一些传感器场合中用到。
6、 传感器模块:
这一块应该说是准备阶段重点要准备的。
① 循迹光耦(一般是黑线)也可以借鉴飞思卡尔只能车大赛,循导线(带有一定频率的导线)。
② 趋光模块(光敏电阻或者光敏二极管);
③ 霍尔传感器
④ 接近开关(探测金属)
⑤ 超声波传感器(测距,避障)
⑥ 红外(无线遥控,避障)
⑦ 角度传感器
⑧ 加速度传感器
⑨ 湿度传感器
⑩ 烟雾传感器,温度传感器
⑪ 颜色传感器
7、声控模块,语音播放模块,录音模块(这个有些难度,所以单独列出,需要重点准备,尤其是选控制类题目的,今年极有可能用到)
8、 单片机外接人机模块:
数码管显示,液晶显示,LED灯,蜂鸣器,矩阵键盘,独立键盘。
9、 无线模块(无线串口模块,NRF905,CC1100等选择一种)。
10、电机类(减速电机,步进电机,测速电机)

沙发
黄小俊| | 2013-11-8 22:13 | 只看该作者
晕了。。

使用特权

评论回复
板凳
箫月郎| | 2013-11-9 18:05 | 只看该作者
好东西,顶起!!!

使用特权

评论回复
地板
戈卫东| | 2013-11-9 21:27 | 只看该作者
最重要的到底是哪个? DMA?

使用特权

评论回复
5
tianli1980| | 2013-11-9 22:26 | 只看该作者
楼主辛苦了,尤其是后面的总结,正在学习控制中,有帮助。感谢分享

使用特权

评论回复
6
tianli1980| | 2013-11-9 22:30 | 只看该作者
非常感谢对DMA的讲解,作为一个初学者对于DMA已经困扰很久了,只是会去套用了,楼主讲得很形象,谢谢了

使用特权

评论回复
7
jasongu| | 2013-11-11 14:13 | 只看该作者
好贴,顶一个

使用特权

评论回复
8
chhyxf| | 2014-8-11 17:05 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

506

主题

2446

帖子

8

粉丝