你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求大神之指导STM32 DMA多通道传输的问题啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

[复制链接]
风华正茂0314 提问时间:2013-6-7 15:27 /
 废话不说了,直接上代码:
我的思路是这样的:AD采集的值通过DMA方式传输到内存,然后再请求使用DMA方式将数据直接打印到串口!
下面是DMA的配置!!!
 
 
u16 ADC_RegularConvertedValueTab[RECEVE_SIZE];
u16 SendBuff[SENDBUFF_SIZE];
 
void DMA_Configuration(void)            //DMA方式发送
{
    DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    //DMA设置:
    //设置DMA源:内存地址&ADC1数据寄存器地址
    //方向:外设-->内存
    //每次传输位:16bit
    //传输大小DMA_BufferSize=RECEVE_SIZE
    //地址自增模式:外设地址不增,内存地址自增1
    //DMA模式:循环
    //优先级:很高
    DMA_DeInit(DMA1_Channel1);//ADC1的DMA传输通道是通道1
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Base;
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_RegularConvertedValueTab;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设作为DMA数据传输的来源
    DMA_InitStructure.DMA_BufferSize = RECEVE_SIZE;//传输大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增加
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增1
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    //DMA_Mode_Normal(只传送一次), DMA_Mode_Circular (不停地传送)
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//(DMA传送优先级很高)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
       
        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);     //中断方式吧
        //开始一次DMA传输!
        DMA_Cmd(DMA1_Channel1, ENABLE);
       
       
        //DMA设置:
    //设置DMA源:内存地址&串口数据寄存器地址
    //方向:内存-->外设
    //每次传输位:8bit
    //传输大小DMA_BufferSize=SENDBUFF_SIZE
    //地址自增模式:外设地址不增,内存地址自增1
    //DMA模式:一次传输,非循环
    //优先级:中
    DMA_DeInit(DMA1_Channel4);//串口1的DMA传输通道是通道4
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RegularConvertedValueTab;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设作为DMA的目的端
    DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;//传输大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增加
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增1
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    //DMA_Mode_Normal(只传送一次), DMA_Mode_Circular (不停地传送)
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//(DMA传送优先级为中等)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);
}
 
 
主函数简单!!!如下
 
int main(void)
{
        delay_init(72);
        USART_Configuration();
        Beep_Init();
        ADC1_Configuration();
        DMA_Configuration();
        while (1)  
        {   
                while(Flag_Uart_Send);
                USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
                DMA_SetCurrDataCounter(DMA1_Channel4,RECEVE_SIZE); 
                //开始一次DMA传输!
                DMA_Cmd(DMA1_Channel4, ENABLE);
                while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
                {
                        beep_on();
                        delay_ms(50);
                        beep_off();
                        delay_ms(50);
}
                Flag_Uart_Send=1;
        }
}
 
其中DMA通道1采用了中断的方式!!!
 
extern u8 Flag_Uart_Send;
//串口1DMA方式发送中断  
void DMA1_Channel1_IRQHandler(void)  
{  
        //清除标志位  
    DMA_ClearFlag(DMA1_FLAG_TC1);  
    //关闭DMA  
    DMA_Cmd(DMA1_Channel4,DISABLE);  
    //允许再次发送  
    Flag_Uart_Send = 0;  

 
 
 
经过调试发现,逻辑上应该是没有问题的,可是串口打印出来的数据是乱码,求大神指导啊!!!!
 
 
还有一个问题就是:DMA传输时外设地址自增这个一直不明白是什么意思!是不是就是多个外设采用DMA方式的时候的通道切换???求大神指导啊111
 
 
 
 
收藏 评论5 发布时间:2013-6-7 15:27

举报

5个回答
风华正茂0314 回答时间:2013-6-7 15:33:04

回复:求大神之指导STM32 DMA多通道传输的问题啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

先顶为快!!!
风华正茂0314 回答时间:2013-6-7 15:56:46

回复:求大神之指导STM32 DMA多通道传输的问题啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

哦,貌似是对的!!!我串口上看的时候以字符形式看的,这样就是乱码了、、、
风华正茂0314 回答时间:2013-6-7 16:03:08

回复:求大神之指导STM32 DMA多通道传输的问题啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

DMA传输时外设地址自增这个一直不明白是什么意思!是不是就是多个外设采用DMA方式的时候的通道切换???求大神指导啊111
流畅的笔记 回答时间:2016-5-16 10:25:10
解决了吗?
modu8888 回答时间:2016-5-16 15:43:32
解决了吗?我马上也要做类似的实践。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版