سلام
من الان که داشتم بخش ریست میکروهای SAM7 را مطالعه می کردم به یک موضوع جالب بر خوردم گفتم شاید برای دیگران هم جالب باشد. همانطور که می دانید در این سری میکروها می شود پایه ریست خارجی را غیرفعال و دیگر میکرو بوسیله این پایه ریست نمی شود. حالا اگر پایه ریست را غیرفعال کنید (URSTEN=0) با یک کردن بیت URSTIEN وقفه فعال می شود در ضمن این وقفه در PID یک (SYS) اتفاق می افتد.
اینم یک برنامه ساده برای راه اندازی این وقفه.
من الان که داشتم بخش ریست میکروهای SAM7 را مطالعه می کردم به یک موضوع جالب بر خوردم گفتم شاید برای دیگران هم جالب باشد. همانطور که می دانید در این سری میکروها می شود پایه ریست خارجی را غیرفعال و دیگر میکرو بوسیله این پایه ریست نمی شود. حالا اگر پایه ریست را غیرفعال کنید (URSTEN=0) با یک کردن بیت URSTIEN وقفه فعال می شود در ضمن این وقفه در PID یک (SYS) اتفاق می افتد.
اینم یک برنامه ساده برای راه اندازی این وقفه.
کد:
#include <Atmel/ioat91sam7s64.h> #include <intrinsics.h> #define LED1ON AT91C_BASE_PIOA->PIO_CODR=(1<<0); #define LED1OFF AT91C_BASE_PIOA->PIO_SODR=(1<<0); #define LED2ON AT91C_BASE_PIOA->PIO_CODR=(1<<1); #define LED2OFF AT91C_BASE_PIOA->PIO_SODR=(1<<1); void delay (void); //----------------------------------------------------- void sys_irq_handler(void) { unsigned int dummy; dummy=AT91C_BASE_RSTC->RSTC_RSR; dummy=dummy; LED2ON; delay(); LED2OFF; delay(); } //------------------------------------------------------ void main() { //--------------------start up-------------------------- AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15) AT91C_BASE_RSTC->RSTC_RMR=0xA5000010; //--------------------speed up-------------------------- AT91C_BASE_CKGR->CKGR_MOR = 0xF01; AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC; AT91C_BASE_PMC->PMC_MCKR = 0x3; AT91C_BASE_PMC->PMC_SCER = 0x1; //----------------------------------------------------- AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_PIOA ); // AT91C_ID_PIOA=2 //----------------------------------------------------- AT91C_BASE_PIOA->PIO_PER=(1<<0|1<<1); AT91C_BASE_PIOA->PIO_OER=(1<<0|1<<1); LED1OFF; LED2OFF; AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int) sys_irq_handler; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = 0x3; AT91C_BASE_AIC->AIC_ICCR = (1<<AT91C_ID_SYS); AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_SYS); __enable_interrupt(); while (1) { LED1ON; delay(); LED1OFF; delay(); } } //-------------------------------------------------------- void delay (void) { unsigned int i,j; for (i=0;i<0xfffff;i++) { j=AT91C_BASE_PMC->PMC_SCSR; j=j; } }
دیدگاه