Перейти к содержанию
    

Annuta

Участник
  • Постов

    42
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Annuta

  • Звание
    Участник
    Участник
  • День рождения 29.06.1984

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

743 просмотра профиля
  1. Прерывание AT91SAM7X

    прерывания разрешены... UCOS моя ОС... там всё по умолчанию включено...
  2. Прерывание AT91SAM7X

    Пытаюсь освоить работу с прерываниями... Сконфигурировала на вход ножку, подцепила к ней девайс, - идея в том, что когда я даю установку девайсу он должен в течении 300 мс держать на этой ножке чётко 1... если был за это время хоть один сброс в 0 - то взываю прерывание... изменяю флаг... и.т.д... Вот мой код... Функ-я //обработчик void pio_c_irq_handler ( void ) { int dummy; TFlag = 1;//уст флаг в один - если был сброс в нуль! //* enable the next PIO IRQ dummy =AT91C_BASE_PIOA->PIO_ISR; //* suppress the compilation warning dummy = dummy; AT91C_BASE_AIC->AIC_EOICR=0x00; } .... и далее в главном цикле ... делаю опрос AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA); AT91F_PIO_CfgInput(AT91C_BASE_PIOA, LD); AT91F_AIC_ConfigureIt ( pAic, AT91C_ID_PIOA, 1,AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL, pio_c_irq_handler); AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA, LD); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA); AT91C_BASE_PIOA->PIO_IER = (1 << LD); Sleep(300); If(TFlag) // прерывание сработало { ... } проблема в том, что прерывание не срабатывает... Т.е. сигнал на ножке скачет и пляшет... а прерывание не срабатывает. не могу понять - где ошиблась...???... народ подскажите пожаста...
  3. Получилось!!! Спасибо БОЛЬШОЕ всем за помощь!!! :)
  4. Спасибо, Dron_Gus!... да именно из-за этого плата и перегружалась... Теперь не перегружаеься... но и не работает.... :( __ramfunc int EFCWrite(u32 adr, u8 *pbuf, u32 Len, u32 NeedReset) { u32 l; unsigned int *pflash; unsigned int page; unsigned int region; unsigned int i; l=0; while (l<Len) { pflash = (unsigned int *)adr; page = (adr & 0x3FFFF)/EFC_PAGE_SIZE; region = (page/EFC_PagesInTheLockRegion); if (AT91C_BASE_MC->MC_FSR & (region << 16)) { // lock set, clear it AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 <<16)) | AT91C_MC_FWS_2FWS; AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (region << 8 ) |AT91C_MC_FCMD_UNLOCK; } while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); for (i = 0; i < EFC_PAGE_SIZE_UINT; i++) *(pflash + i ) = *(pbuf + i); AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (page << 8 ) |AT91C_MC_FCMD_START_PROG; while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); l+=EFC_PAGE_SIZE; adr+=EFC_PAGE_SIZE; } if (NeedReset) { __asm("sub r0, r0,r0;"); __asm("bx r0;"); } return (Len * AT91C_IFLASH_PAGE_SIZE); } вот - делаю как... Прошивка доходит до волшебной строчки AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (page << 8 ) |AT91C_MC_FCMD_START_PROG; ... и всё... дальше... тормоз!... Возвращает "0" .. естевтсвенно...
  5. вот написала по вашему совету прогу сначала. Эх... ну не работает!. :crying: .. Не пинайте ногами если - что упускаю... програмимирую первый раз в жизни микроконтроллер!... вот мой код #include <os_cpu.h> #define TestAddr 0x0030000 #define EFC_PAGE_SIZE 256 #define EFC_PAGE_COUNT 256 #define EFC_PagesInTheLockRegion 32 #define EFC_PAGE_SIZE_UINT (EFC_PAGE_SIZE/4) // #define u32 unsigned long #define u8 unsigned char #define DWORD unsigned long __ramfunc void EFC_Init(void) { while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(100 <<16)) | AT91C_MC_FWS_1FWS; while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); } __ramfunc u32 EFC_WritePage(u32 adr, u32 *pbuf) { unsigned int *pflash; unsigned int page; unsigned int region; unsigned int i; pflash = (unsigned int *)adr; page = (adr & 0x3FFFF)/EFC_PAGE_SIZE; region = (page/EFC_PagesInTheLockRegion); EFC_Init(); if (AT91C_BASE_MC->MC_FSR & (region << 16)) { // lock set, clear it AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 <<16)) | AT91C_MC_FWS_2FWS; AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (region << 8 ) |AT91C_MC_FCMD_UNLOCK; } while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); for (i = 0; i < EFC_PAGE_SIZE_UINT; i++) *(pflash + i ) = *(pbuf + i); AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (page << 8 ) |AT91C_MC_FCMD_START_PROG; while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); return 1; } __ramfunc void EFCWrite(u32 adr, u8 *pbuf, u32 Len, u32 NeedReset) { u32 l; if (NeedReset) { l=0; } l=0; while (l<Len) { EFC_WritePage(adr, (u32*)&(pbuf[l])); l+=EFC_PAGE_SIZE; adr+=EFC_PAGE_SIZE; } if (NeedReset) { __asm("sub r0, r0,r0;"); __asm("bx r0;"); } } __ramfunc u32 EFC_ReadPage(u32 adr, u32 *pbuf) { unsigned int *pflash = (unsigned int *)adr; unsigned int i; EFC_Init(); for (i = 0; i < EFC_PAGE_SIZE_UINT; i++) *(pbuf + i) = *(pflash + i ); return 1; } void TestEFC(void) { unsigned int buf1[8192/4]; int i; unsigned int *pbuf3=(unsigned int *)TestAddr; //AT91C_BASE_MC->MC_FCR = (0x5A << 24) | AT91C_MC_FCMD_ERASE_ALL; //while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); for(i=0;i<8192/4;i++) buf1[i]=i+9; OS_CPU_SR cpu_sr = 0; OS_ENTER_CRITICAL(); //Запретили прерывания EFCWrite( TestAddr ,(u8*)buf1,8192,0); OS_EXIT_CRITICAL(); //Разрешили прерывания for( i=0;i<8192/4;i++) if (buf1[i]!=pbuf3[i]) buf1[i]=0; } вот прога делает такой финт ушами... как только я вызываю функцию записи в основном цикле LED_On(2); TestEFC(); LED_On(3); Она зажигает второй лед, потом плата перегружается... !... все огоньки гаснут /как будто жму кнопочку на плате ресет/ ...и она снова работает... только сначала!... Третий лед не зажигается...
  6. Происходят странные вещи!.. моя прога на этой строке сбрасывается... перегружается... AT91C_BASE_MC->MC_FCR = (0x5A << 24) | AT91C_MC_FCMD_ERASE_ALL; Это я пытаюсь сделть очистку.... как правильно - очистку сделать!... стереть стр? и ещё где можно скачать - самы простой - работающий проект для работы с внутренней флэш... демку какую-нить... ?
  7. Спасибо!! Вроде пишет - не могу провериить -- так как не работает чтение .... вот функция __ramfunc u32 EFC_ReadPage(u32 adr, u32 *pbuf) { unsigned int *pflash = (unsigned int *)(adr & 0x00000040); unsigned int i; EFC_Init(); for (i = 0; i < EFC_PAGE_SIZE_UINT; i++) *(pbuf + i) = *(pflash + i ); return 1; } // вот массив пусто! помогите уж до конца разобраться...
  8. Моя переменная #define EFC_PAGE_SIZE 128 Я просто не совсем может правильно чего понимаю, народ ? Но у меня ж никак не должна затираться прошивка данными... При попытке поменять в xcl файле адреса на такие /скопировала в аналогичной проге/ //************************************************************************* // Read-only segments mapped to Flash 256K. //************************************************************************* -DROMSTART=00000000 -DROMEND=0003FFFF //************************************************************************* // Read/write segments mapped to 64K RAM. //************************************************************************* -DRAMSTART=00000000 -DRAMEND=0000FFFF получаю ошибку... Fatal Error[e72]: Segment SVC_STACK must be defined in a segment definition option (-Z, -b or -P) Чего он ругается !????
  9. работа с внутренней флэш

    Привет! У меня плата на AT91SAM7x256 - первый раз в жизни пытаюсь работать с внутреней флэш ... :07: вот пишу что-то в память __ramfunc u32 EFC_WritePage(u32 adr, u32 *pbuf) { unsigned int *pflash; unsigned int page; unsigned int region; unsigned int i; pflash = (unsigned int *)adr; page = (0x00310000)/EFC_PAGE_SIZE; region = (page/EFC_PagesInTheLockRegion); EFC_Init(); if (AT91C_BASE_MC->MC_FSR & (region << 16)) { // lock set, clear it AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 <<16)) | AT91C_MC_FWS_2FWS; AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (region << 8 ) |AT91C_MC_FCMD_UNLOCK; } while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); for (i = 0; i < EFC_PAGE_SIZE_UINT; i++) *(pflash + i ) = *(pbuf + i); AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (page << 8 ) |AT91C_MC_FCMD_START_PROG; while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); return 1; } __ramfunc void EFCWrite(u32 adr, u8 *pbuf, u32 Len, u32 NeedReset) { u32 l; l=0; while (l<Len) { EFC_WritePage(adr, (u32*)&(pbuf[l])); l+=EFC_PAGE_SIZE; adr+=EFC_PAGE_SIZE; } } и кусочек xcl файла //************************************************************************* // Read-only segments mapped to Flash 256K. //************************************************************************* -DROMSTART=00000040 -DROMEND=00030000 //************************************************************************* // Read/write segments mapped to RAM. //************************************************************************* -DRAMSTART=00200000 -DRAMEND=0020FFFF При попытке что-то записать из памяти стирается прошивка... то стириется то ли затирается - не мгу понять!... Хотя адреса не перекрещеваются... Не понимаю... ЧЕМ это вызвано! :smile3046: ... и в xcl написано "Read-Only" ...это значит что я могу только читать -- что надо прописать чтоб можно было и писать ? Спасибо!
  10. У меня устройство на ножке должно устанавливать синал - 0 или 1... Я пытаюсь её сконфигурировать на вход так: AT91F_PIO_CfgInput(AT91C_BASE_PIOA, (Reg)); AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA); AT91C_BASE_PIOA->PIO_CODR = Reg; но моя ножка в нуль не скидывается - она стабильно стоит в единице!...даже если устройство вообще отключено!... Народ подскажите - где я ошиблась.. спасибо.!
  11. Привет! Подскажите пожаста - как сконфигурировать в IAR ARM AT91SAM7X256 ножку на вход..? На выход знаю как .. а на вход не получается... Если не трудно - простенький пример... Спасибо.
  12. SPI & UDP & AT91SAM7X

    Привет, пытаюсь освоить SPI ... Вот код... static BYTE rcvr_spi()//Чтение { BYTE dat; AT91PS_SPI pSPI = AT91C_BASE_SPI0; while( !( pSPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait pSPI->SPI_TDR = 0xFF; while( !( pSPI->SPI_SR & AT91C_SPI_RDRF ) ); // wait for char dat = (BYTE)( pSPI->SPI_RDR ); return dat; } static BYTE xmit_spi(BYTE dat)//Запись { AT91PS_SPI pSPI = AT91C_BASE_SPI0; while( !( pSPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait pSPI->SPI_TDR = dat; while( !( pSPI->SPI_SR & AT91C_SPI_RDRF ) ); // wait for char return (BYTE)( pSPI->SPI_RDR ); // it's important to read RDR here! } static void if_spiSetSpeed(unsigned char speed) { unsigned long reg; AT91PS_SPI pSPI = AT91C_BASE_SPI0; if ( speed < SPI_SCBR_MIN ) speed = SPI_SCBR_MIN; if ( speed > 1 ) speed &= 0xFE; reg = pSPI->SPI_CSR[SPI_CSR_NUM]; reg = ( reg & ~(AT91C_SPI_SCBR) ) | ( (unsigned long)speed << 8 ); pSPI->SPI_CSR[SPI_CSR_NUM] = reg; } void pause(void) { int i; for(i=1; i<1000; i++); } static void init_spi() { BYTE i; AT91PS_SPI pSPI = AT91C_BASE_SPI0; AT91PS_PIO pPIOA = AT91C_BASE_PIOA; AT91PS_PMC pPMC = AT91C_BASE_PMC; // disable PIO from controlling MOSI, MISO, SCK (=hand over to SPI) // keep CS untouched - used as GPIO pin during init pPIOA->PIO_PDR = AT91C_PA16_SPI0_MISO | AT91C_PA17_SPI0_MOSI | AT91C_PA18_SPI0_SPCK; // | NCPS_PDR_BIT; // set pin-functions in PIO Controller pPIOA->PIO_ASR = AT91C_PA16_SPI0_MISO | AT91C_PA17_SPI0_MOSI | AT91C_PA18_SPI0_SPCK; /// not here: | NCPS_ASR_BIT; pPIOA->PIO_BSR = NPCS_BSR_BIT; // set chip-select as output high (unselect card) pPIOA->PIO_PER = NPCS_BSR_BIT; // enable PIO of CS-pin pPIOA->PIO_SODR = NPCS_BSR_BIT; // set pPIOA->PIO_OER = NPCS_BSR_BIT; // output // enable peripheral clock for SPI ( PID Bit 5 ) pPMC->PMC_PCER = ( (unsigned long) 1 << AT91C_ID_SPI0 ); // n.b. IDs are just bit-numbers // SPI enable and reset pSPI->SPI_CR = AT91C_SPI_SPIEN | AT91C_SPI_SWRST; // SPI mode: master, fixed periph. sel., FDIV=0, fault detection disabled pSPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED | AT91C_SPI_MODFDIS; // set PCS for fixed select pSPI->SPI_MR &= 0xFFF0FFFF; // clear old PCS - redundant (AT91lib) pSPI->SPI_MR |= ( (SPI_MR_PCS<<8) & AT91C_SPI_PCS ); // set PCS // set chip-select-register // 8 bits per transfer, CPOL=0, ClockPhase=0, DLYBCT = 0 //pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8; pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_NCPHA | AT91C_SPI_BITS_16; // ok // slow during init if_spiSetSpeed(0xFE); // enable pSPI->SPI_CR = AT91C_SPI_SPIEN; /* Send 20 spi commands with card not selected */ //for(i=0;i<21;i++) //xmit_spi(0xA); /* enable automatic chip-select */ pPIOA->PIO_ODR = NPCS_BSR_BIT; // input pPIOA->PIO_CODR = NPCS_BSR_BIT; // clear // disable PIO from controlling the CS pin (=hand over to SPI) pPIOA->PIO_PDR = NCPS_PDR_BIT; // set pin-functions in PIO Controller pPIOA->PIO_ASR = NCPS_ASR_BIT; pPIOA->PIO_BSR = NPCS_BSR_BIT; } init_spi(); while (1) { xmit_spi(0xAAAA);//Запись SPI посылаем 2 байта } Не могу выставить в SPI 16 битовый режим... В такой конф у меня клок 16 бит - а данных всё равно посылает только 8 бит...! Народ подскажите - как устагновить 16 битный режим ?
  13. FreeRTOS UDP

    Я пытаюсь сделать посылку по подключению, но я даже не уверена, что я правильно юзаю функции... Как делаете UDP подключение к порту, и шлёте датаграмму ?
  14. FreeRTOS UDP

    uIP использую...
  15. FreeRTOS UDP

    Привет, народ как работать с UDP в FreeRTOS - что-то не получается у меня совсем отослать датаграмму ... доки какие-то мутные - ничего не понятно... Подскажите - как мне отослать датаграмму ? ...или кусочек кода - если у кого есть ... спасибо.
×
×
  • Создать...