历史上的今天
今天是:2025年01月04日(星期六)
2019年01月04日 | stm32 DMA初始化选项研究
2019-01-04 来源:eefocus
DMA比较好用,也比较简单,今天在做多通道ADC“连续”“扫描”采样时,对DMA有了更深一点的认识,今天给大家分享下:
#define ADC1_DR_Address ((uint32_t)0x4001244C)unsigned short Buff[3]; ......DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Buff; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 3; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; *** DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;***DMA_InitStructure.DMA_Priority = DMA_Priority_High; **DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;**DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE);
初始化时,要先用DMA_DeInit将DMA的通道初始化成缺省值。
外设地址设置,内存基地址设置,设置外设的传输属性(输入/输出),这些都容易理解;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; #define DMA_DIR_PeripheralDST ((uint32_t)0x00000010)
#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000)
这里是设置谁为数据传输源;
DMA_InitStructure.DMA_BufferSize = 3;
如果是获取一组数值,像ADC,USART,我们可以用一个缓冲区,如果不用,像ADC数据更新快的,马上就被刷新了。我这里的DMA_Buffersize 是 Buff的大小;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; #define DMA_PeripheralInc_Enable ((uint32_t)0x00000040) #define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) #define DMA_MemoryInc_Enable ((uint32_t)0x00000080) #define DMA_MemoryInc_Disable ((uint32_t)0x00000000)
这个根据需要进行设置;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) #define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) #define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200) #define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) #define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400) #define DMA_MemoryDataSize_Word ((uint32_t)0x00000800)
这个设置获取数据的大小;
*DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;* #define DMA_Mode_Circular ((uint32_t)0x00000020) #define DMA_Mode_Normal ((uint32_t)0x00000000)
这个要强调下,像我这里,要不断更新Buff[0],Buff[1],Buff[2],我上面设置的缓冲区正好也是3,我们可以用Circular属性来设置!他就不停的刷新这段地址!
他还有一种属性是Normal,这种属性一般用在Point 2 Point时使用;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;#define DMA_Priority_VeryHigh ((uint32_t)0x00003000) #define DMA_Priority_High ((uint32_t)0x00002000) #define DMA_Priority_Medium ((uint32_t)0x00001000) #define DMA_Priority_Low ((uint32_t)0x00000000)
因为DMA有多路,所以我们要规定先传哪路数据,所以我们就要规定一个优先级;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; #define DMA_M2M_Enable ((uint32_t)0x00004000) #define DMA_M2M_Disable ((uint32_t)0x00000000)
这个是设置是不是Memary to Memary的!
史海拾趣
|
很久没来这里转转,今天发点牢骚吧,本人专职电源,其他系统也做,主要是硬件,软件丢光了. 五年前的10月份开始,我也是一个即将毕业的大学生(二流的),同样在为工作而到处奔波,经过一个月的奔波应聘进入联想深圳研发中心,现在在一家外企做电源FAE.结合大 ...… 查看全部问答> |
|
我新建了个项目,程序编好了,运行也对,按这种方法做了,KEIL uvision2 ,进去后点击Project,然后点击Options for Target 然后进去后,找到Output,然后对应的Create HEX FILE 选中,就可以输出HEX文件啦。 不知道还怎么做才能生成HEX文件,或者 ...… 查看全部问答> |
|
函数里面的% !等都什么意思?这个函数Diab编译器可以通过,Green Hills的Multi编译器通不过。应该是PowerPC指令或者汇编指令。asm void MOVE_TO_SPR(unsigned long reg, unsigned long value){% con reg; reg value;! mtspr reg,v ...… 查看全部问答> |




