реклама на сайте
подробности

 
 
> Ошибка доступа к памяти LPC2378
SmileGobo
сообщение Dec 7 2010, 07:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451



Написал программку под lpc2378 NXP для передачи данных по SSP интерфейсу с использованием DMA. Пользовался IDE mVision keil 3. Все прекрасно работает. В дальнейшем переполз на keil4 и тогда программа начала зависать. Стал гонять в симуляторе, выяснил что ругается на доступ к адресам USB памяти (*** error 65: access violation at 0x7FD00000 : no 'write' permission), сравнил hex прошивки от 3 и 4 версии они абсолютно разные.
Код программы:
Код
#include <LPC23xx.H>
#include <math.h>

#define DMA_SRC  0x7FD00000
#define    DMA_DST     0xE0068008
#define DATA_BUFFER 0x7FE00000

#define swap(a,b){a+=b;b=a-b;a-=b;}

#include "pll.h"
#include "ssp.h"
#include "uart.h"
#include "irq.h"
#include "model.h"


extern TICK  _TICKS;
extern STATE _STATE;
extern ushort CRC;
extern volatile ulong UART0Count;
extern volatile byte UART0Buffer[UART0_BUFSIZE];
extern volatile uint IFLAG;
int main (void){
    short i;
    ushort data[GROUP_SIZE];//(ushort*)0x7FE00000;
    ulong buf,subbuf;
//    uint  *src_addr;
    uint* buf1=(uint*)DMA_SRC;               //[DMA_SIZE];
    uint* buf2=(uint*)(DMA_SRC)+GROUP_SIZE;   //[DMA_SIZE];

    
    CCLKCFG = 4;
    SCS=1<<5;
    //источник тактирования RTC
    CLKSRCSEL = 2;
    
    init_pll(15869,3);

    PINSEL0 |= 0xC0000000;
    PINSEL1 |= 0x00000028;
    IODIR0|=1<<10;
    IOCLR0|=1<<10;
    
    //-----MAM---------
    init_ssp();


    //Подготвка данных очистка памяти для групп

    for ( i = 0; i < GROUP_SIZE; i++ ) {
        buf1[i]=0; //тут происходит обращение к памяти USB и возникает ошибка
        buf2[i]=0;
        data[i]=i;//101*(cos(i/57.3)+1);
    }
    clear_state();
    clear_tick();
    //clear_group(buf1);
    //clear_group(buf2);
    make_group((uint*)buf1);

    PCONP |= (1 << 29);    // Enable GPDMA clock
    
    buf=(ulong)buf1;
    subbuf=(ulong)buf2;
    
    GPDMA_CONFIG=3;
    while ( !(GPDMA_CONFIG & 0x1) );
    GPDMA_CH0_DEST= DMA_DST;
    
    GPDMA_INT_TCCLR = 0x01;
    GPDMA_INT_ERR_CLR = 0x01;
    IOCLR0|=1<<10;


    while(1){
        //получим данные по uart запишем их в data
    
        ulong addr_stop=buf+4096;
        GPDMA_CH0_SRC = buf;
        GPDMA_CH0_CTRL = (1024) | (0x04 << 12) | (0x03 << 15)|(2<<18)|(1<<21)| (1 << 26)|(1<<31);    
        GPDMA_CH0_CFG |= (0x05 << 11)|(0x01)|(0x0 << 6)|(15<<1)|(14<<1);    
        
        IOSET0=1<<10;
        clear_group((uint*)subbuf);
        //Crc16(data,1024);
        
        make_data((uint*)subbuf,data);
        make_group((uint*)subbuf);
        
        swap(subbuf,buf);
        IOCLR0|=1<<10;
        //while(GPDMA_RAW_INT_TCSTAT==0);
        
        while(GPDMA_CH0_SRC<addr_stop);
        
        GPDMA_INT_TCCLR = 0x01;
        GPDMA_INT_ERR_CLR = 0x01;
        
    }
    return 0;
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 17:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01297 секунд с 7
ELECTRONIX ©2004-2016