OpenEdv-开源电子网

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

DMA变量内存到串口传输数据出错

[复制链接]

9

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2017-6-16
在线时间
46 小时
发表于 2018-6-6 09:42:10 | 显示全部楼层 |阅读模式
1金钱
向串口传输320*240个数据SendBuff=0xffff,串口接受到的数据是“(”。
怀疑是传输变量的指针有问题,下面红色那一句,例程里用的是8位数组变量,我这里改成了不变的16位数。c语言指针知识比较空白,感觉是这个地址设置的有问题,想知道不用数组该怎么改。

uint16_t SendBuff=0xffff;

void USARTx_DMA_Config(void)
{
   DMA_InitTypeDef DMA_InitStructure;

   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
   DMA_InitStructure.DMA_PeripheralBaseAddr = (USART1_BASE+0x04);
   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  
   DMA_InitStructure.DMA_BufferSize = 320*240;   
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
   DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte;
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
  // DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
   DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

   DMA_Init(DMA1_Channel4, &DMA_InitStructure);  
   DMA_Cmd (DMA1_Channel4,ENABLE);  
}



下面是主函数:
int main ( void )
{
        uint8_t buf1[1]={0xff};
        uint8_t buf2[1]={0};
        LED_GPIO_Config();
        SysTick_Init(72000);// 72MHZ/72KHZ=1KHZ=1ms
        TIM2_Configuration(9999,719);
        TIM3_Configuration();
        USART_Configuration(460800);
        I2C_EE_Init();
        USARTx_DMA_Config();
        NVIC_Configuration();
        while(1)
        {
                I2C_EE_ByteWrite(buf1, 0x80);
                GPIO_ResetBits(GPIOB, GPIO_Pin_1);
                Delay_ms(500);
                I2C_EE_BufferRead(buf2, 0x80,1);
                GPIO_SetBits(GPIOB, GPIO_Pin_1);
                Delay_ms(500);
                //printf("***%d***\r\n",buf2[0]);         
               
                USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
        }
}



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

使用道具 举报

7

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2017-7-18
在线时间
257 小时
发表于 2018-6-6 10:19:18 | 显示全部楼层
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;  这句如果SendBuff是一个常数变量,这里要改改。加一个取地址符& //改成 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&SendBuff;
还有你要传输320*240个数据需要分开传输,dma一次只能传输65535个字节的数,320*240=76800>65535
回复

使用道具 举报

9

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2017-6-16
在线时间
46 小时
 楼主| 发表于 2018-6-6 13:12:10 | 显示全部楼层
周易八索连山 发表于 2018-6-6 10:19
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;  这句如果SendBuff是一个常数变量,这里要改改。 ...

谢谢。还有一个小问题,while里DMA只能执行一次,按理说不是一直在循环执行吗?

只有第一次执行一次    然后只能按复位也只执行一次
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-6-6 13:21:04 | 显示全部楼层
魔双月壁 发表于 2018-6-6 13:12
谢谢。还有一个小问题,while里DMA只能执行一次,按理说不是一直在循环执行吗?

只有第一次执行一次   ...

清除DMA传输完成标志位就可以了
没有脑袋
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-6-6 13:22:37 | 显示全部楼层
红色那句代码没问题,就是这样把地址转成32位的
没有脑袋
回复

使用道具 举报

9

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2017-6-16
在线时间
46 小时
 楼主| 发表于 2018-6-6 15:52:23 | 显示全部楼层
美丽的时光机器 发表于 2018-6-6 13:21
清除DMA传输完成标志位就可以了

貌似不行,加了下面语句,还是只发送一次。if(DMA_GetFlagStatus(DMA1_FLAG_TC1)==SET)//如果传输完成清除标志位
                        DMA_ClearFlag(DMA1_FLAG_TC1);
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-6-6 17:32:24 | 显示全部楼层
魔双月壁 发表于 2018-6-6 15:52
貌似不行,加了下面语句,还是只发送一次。if(DMA_GetFlagStatus(DMA1_FLAG_TC1)==SET)//如果传输完成清 ...

while(DMA_GetFlagStatus(DMA1_FLAG_TC6) == RESET)                          
{

}
/*完成后清除所有传输完成、半完成、全局中断标志位*/               
DMA_ClearFlag(DMA1_FLAG_TC6);
DMA_ClearFlag(DMA1_FLAG_HT6);
DMA_ClearFlag(DMA1_FLAG_GL6);
按照我这个,把DMA号和通道换成你的试一下
没有脑袋
回复

使用道具 举报

9

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2017-6-16
在线时间
46 小时
 楼主| 发表于 2018-6-7 10:27:46 | 显示全部楼层
用正常模式实现连续发送,好像要先失能数据,在初始化,再使能。有点麻烦。
另外一个是乱码的问题,发送的数据是 uint16_t SendBuff=0xfff0;
串口打印的数据是“痧”  明显是乱码了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 10:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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