OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1946|回复: 2

串口DMA问题@原子哥

[复制链接]

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-8-23
在线时间
32 小时
发表于 2018-5-7 16:17:45 | 显示全部楼层 |阅读模式
10金钱
是这样的  我用战舰大容量的STM32F103ZE芯片,用的串口DMA正常,但是当我新建一个STM32F103CBT6工程时,再用串口DMA,没有改变任何有关配置和相关用到的DMA,但是程序是跑死的,最后一步步的检查发现是当配置好DMA后将DMA初始化写入这里就死了,只有屏蔽了 // DMA_Init(DMA_CHx, &DMA_InitStructure);这个才会正常跑。 一个大容量芯片配置改成一个中等容量配置就会死了呢?原子哥到底是啥回事?STM32F103CBT6板子确定能用,已经跑过程序验证了。以下是配置代码:
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
DMA_InitTypeDef DMA_InitStructure;
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //ʹÄÜDMA´«Êä

  DMA_DeInit(DMA_CHx);   //½«DMAµÄͨµÀ1¼Ä´æÆ÷ÖØÉèΪȱʡֵ
DMA1_MEM_LEN=cndtr;
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMAÍâÉè»ùµØÖ·
DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMAÄÚ´æ»ùµØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //Êý¾Ý´«Êä·½Ïò£¬´ÓÍâÉè¶ÁÈ¡·¢Ë͵½ÄÚ´æ
DMA_InitStructure.DMA_BufferSize = cndtr;  //DMAͨµÀµÄDMA»º´æµÄ´óС
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //ÍâÉèµØÖ·¼Ä´æÆ÷²»±ä
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //ÄÚ´æµØÖ·¼Ä´æÆ÷µÝÔö
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //Êý¾Ý¿í¶ÈΪ8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //Êý¾Ý¿í¶ÈΪ8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //¹¤×÷ÔÚÕý³£Ä£Ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMAͨµÀ xÓµÓÐÖÐÓÅÏȼ¶
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMAͨµÀxûÓÐÉèÖÃΪÄÚ´æµ½ÄÚ´æ´«Êä
// DMA_Init(DMA_CHx, &DMA_InitStructure);  //¸ù¾ÝDMA_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯DMAµÄͨµÀUSART1_Tx_DMA_ChannelËù±êʶµÄ¼Ä´æÆ÷
DMA_ITConfig(DMA_CHx,DMA_CCR5_TCIE,ENABLE);//DMAÍê³ÉÖжÏʹÄÜ
  DMA_ITConfig(DMA_CHx,DMA1_IT_TC5,ENABLE);//DMA ch5ÖжÏʹÄÜ  
DMA_Cmd(DMA_CHx, ENABLE);  //ʹÄÜUSART1 TX DMA1 ËùָʾµÄͨµÀ
}

int main(void)
{  
delay_init();       //   
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//

uart_init(9600);   //
NVIC_DMA_Config();
MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)RXBuff,RX_BUF_SIZE);//
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //  
MYDMA_Enable(DMA1_Channel5);//
.
.
.
.
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-8-23
在线时间
32 小时
 楼主| 发表于 2018-5-7 16:19:14 | 显示全部楼层
补充一下,用的串口接收中断所以用的通道五,用到DMA通道五中断
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-8-23
在线时间
32 小时
 楼主| 发表于 2018-5-7 16:35:45 | 显示全部楼层
一步步排查  查到是因为写入外设地址    DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;    的原因导致程序跑飞,外设地址写得不对么?要怎么配置CBT6的串口外设地址?用战舰时   配置是  MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)RXBuff,RX_BUF_SIZE);   那么用CBT6 那个&USART1->DR  地址不是应该这么配么?还是说这个容量的地址要变?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-5 12:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表