- 打卡等级:偶尔看看III
- 打卡总天数:32
- 最近打卡:2026-03-05 16:54:22
荣誉版主
- 积分
- 2859
|
型号: AI8051U-34K64 LQFP48,
问题描述,发现一个代码段xdata区的静态全局变量被未知指针改写或自身访问不正常,数据错乱。可排除代码自己的写错,因为代码是成熟代码移值的.
经过几天的排查,销定在DMA身上,DMA局部代码如下:
void ledp_run()
{
ledp_yhdata_dt(Hub_Bufferdc); //现在改成端口模拟时序一切正常
// Buffer = (u16)Hub_Bufferdc; //使用DMA发数据就有问题
// DMA_LCM_TXAH = (u8)(Buffer>>8);
// DMA_LCM_TXAL = (u8)(Buffer);
// DMA_LCM_TRIG_WD();
HUB_STB=1;
NOP(16);
HUB_STB=0;
}
/*---------------------------------------------------------
DMA 配置
----------------------------------------------------------*/
void DMA_LCM_config()
{
DMA_LCM_InitTypeDef DMA_LCM_InitStructure; //结构定义
DMA_LCM_InitStructure.DMA_Enable = ENABLE; //DMA使能 ENABLE,DISABLE
DMA_LCM_InitStructure.DMA_Length = 128-1; //DMA传输总字节数 (0~65535) + 1, 不要超过芯片 xdata 空间上限
// DMA_LCM_InitStructure.DMA_Length = xfnu*128-1; //DMA传输总字节数 (0~65535) + 1, 不要超过芯片 xdata 空间上限
// DMA_LCM_InitStructure.DMA_Tx_Buffer = (u16)Hub_Bufferdc; //发送数据存储地址
// DMA_LCM_InitStructure.DMA_Rx_Buffer = (u16)Hub_Bufferdc; //接收数据存储地址
DMA_LCM_Inilize(&DMA_LCM_InitStructure); //初始化
DMA_LCM_CFG = 0x02; // DAM访问优先级
}
问题奇怪就奇怪到,不是DMA自身发送数据有问题。DMA可以正确发送数据。
但是另一个模块中的数据总是不正常,DMA是在中断里触发的。
怀疑是DMA占住了XDATA的总线访问权,使另外的代码访问XDATA时出现读写错误,但手册上说是可以并行访问的。
2. 改用端口模拟时序一切正常。
3. DMA应该注意的都注意了,比如4字节对齐,不进入空IDL模式。
暂时改用端口模拟已解决问题,只是反馈一下给官方是否需要留意,不需要大家帮忙解决问题。
|
|