ARMwizard โปรแกรมช่วยการตั้งค่า Register MCU ค่าย NXP

ARMwizard โปรแกรมช่วยตั้งค่า register สำหรับ Arm ไมโครคอนโทรลเลอร์ ของค่าย Philips (NXP) ที่ขึ้นต้นด้วย LPC2xxx สำหรับ ARM7 และ  LPC17xx สำหรับ CortexM3 แรกเริ่มเดิมที่โปรแกรมนี้ ถูกออกแบบมาให้ใช้สำหรับโค๊ดที่เขียนด้วยคอมไพล์เลอร์ของ KEIL uVision แต่ได้ถูกปรับแต่งให้สามารถใช้ได้กับทุกคอมไพล์เลอร์ เพราะได้อ้างอิงชื่อ Register ที่มาจาก Data sheet ของ NXP เพราะฉะนั้นจึงเข้าได้กับ Complier ใดๆ ที่อ้างอิงดาต้าชีทของ NXP ด้วยเช่นกัน 




ตัวโปรแกรม ARMwizard จะสร้ัางค่าเริ่มต้นโค๊ดโปรแกรมให้กับไมโครคอนโทรลเลอร์ที่เราเลือก โดยค่าที่ถูกสร้างขึ้นมาจากการเลือกค่า setting มาจากหน้าต่างโปรแกรม ARMwizard ซึ่ภายในโปรแกรมประกอบไปด้วย การตั้งค่า register , การเซ็ทค่า Interrupt ซึ่งจะทำให้การเขียนโปรแกรมของเราทำงานได้สะดวก และรวดเร็วยิ่งขึ้น 

ภายในโปรแกรมประกอบด้วยการตั้งค่าต่อไปนี้ 
  • GPIO หรือ General Peripheral Input/Output สำหรับตั้งค่าเลือกกำหนด ให้ขา หรือ PIN ของไมโครคอนโทรลเลอร์ทำงานเป็น Output หรือ Input หรือจะทำการเลือกใ้้ห้ขานั้น ใช้คุณสมบัติ Pull up หรือ Pull down resistor (ในกรณีที่ ไมโครคอนโทรลเลอร์ เบอร์นั้นๆ รองรับคุณสมบัติืนี้ เช่นเบอร์ 23xxx, 24xxx, 17xxx) หรืออาจจะักำหนดให้ขานั้นอยู่ใน mode open drain เราก็สามารถกำหนดได้เช่นกัน 
  • Interrupt มี register ที่เกี่ยวข้องกับการตั้งค่า Interrupt มากกมาย เราสามารถเลือกตั้งค่า Interrupt ผ่านโปรแกรม ARMwizard ที่เหลือโปรแกรมจะจัดการให้เราเอง อย่างอัตโนมัติ 
  • External Interrupt การตั้งค่า External Interrupt จะใช้การตั้งค่าผ่าน Combo box เราสามารถตั้งค่า External Interrupt ได้มากกว่า 1 แหล่ง
  • A/D converter การตั้งค่า A/D เราสามารถตั้งค่า ADC mode ให้ทำงานตามสัญญาณนาฬิกาที่เรามีอยู่ได้ ซึ่งจะได้ค่าที่่ตั้งถูกต้องตามความเป็นจริง
  • Timer เราสามารถตั้งค่า Timer ได้ ทั้งแบบ 16/32 บิต โดยโปรแกรมจะทำการคำนวณ สัญญาณนาฬิกา ให้อย่างอัตโนมัติ 
  • PWM (เวอร์ชั่นใหม่) รองรับการตั้งค่า PWM โดยโปรแกรมสามารถคำนวณความถี่ และ คาบเวลาที่ต้องการให้เราได้เช่นกัน 
What is new in v2.0.1 & v2.0 

• Added profiles for LPC1751/52/54/56/58/59
• Added support for LPC17xx chips, includes LPC1763/64/65/66/67/68/69 mcu profiles
• Added pin setting for open drain and repeater mode for LPC17xx
Added GPIO interrupt trigger edge selector to enable interrupts for selected GPIO pins
CLKDIV register of A/D can also be set by target sample rate ( in addition to A/D frequency)
When Timer2 & Timer3 is used the PCONP enable bit is set to enable the timer operation



เบอร์ไมโครคอนโทรลเลอร์ที่รองรับ 
LPC1751 (NEW)
LPC1752 (NEW)
LPC1754 (NEW)
LPC1756 (NEW)
LPC1758 (NEW)
LPC1759 (NEW)
LPC1763 (NEW)
LPC1764 (NEW)
LPC1765 (NEW)
LPC1766 (NEW)
LPC1767 (NEW)
LPC1768 (NEW)
LPC1769 (NEW)
LPC2101
LPC2102
LPC2103
LPC2104
LPC2105
LPC2106 
LPC2131
LPC2132
LPC2134
LPC2136
LPC2138 
LPC2141 
LPC2142 
LPC2144 
LPC2146 
LPC2148 
LPC2361 
LPC2362 
LPC2364 
LPC2365 
LPC2366 
LPC2367 
LPC2368 
LPC2377 
LPC2378 
LPC2387 
LPC2388 
LPC2420 
LPC2458 
LPC2460 
LPC2468 
LPC2470 
LPC2478

ตัวอย่างโค๊ดที่ได้จากโปรแกรม ARMwizard สำหรับไมโครคอนโทรลเลอร์เบอร์ LPC21xxx 23xxx, 24xxx

/************************************************************************************
   Code created using the ARMwizard, visit http://alexan.edaboard.eu 
************************************************************************************/

#include <LPC2103.h>

#define PWM0CON T0PWMCON
#define PWM1CON T1PWMCON
#define PWM2CON T2PWMCON
#define PWM3CON T3PWMCON
#define AD0CR ADCR
#define AD0INTEN ADINTEN
#define IO0PIN IOPIN
#define IO0SET IOSET
#define IO0DIR IODIR
#define IO0CLR IOCLR    

/******************************************************************************
                  TIMER0 interrupt service function
******************************************************************************/
__irq void TIMER0_int (void) {
/* write code here */


/* list of all available flags, select which to use */
T0IR = 1;   /* Clear MAT0.0 interrupt flag */
T0IR = 2;   /* Clear MAT0.1 interrupt flag */
T0IR = 4;   /* Clear MAT0.2 interrupt flag */
T0IR = 8;   /* Clear MAT0.3 interrupt flag */
T0IR = 16;  /* Clear CAP0.0 interrupt flag */
T0IR = 32;  /* Clear CAP0.1 interrupt flag */
T0IR = 64;  /* Clear CAP0.2 interrupt flag */
/*T0IR = 128;  Clear CAP0.3 interrupt flag, not usable on timer0 */
VICVectAddr = 0;                             /* Acknowledge Interrupt */
}

/******************************************************************************
                  TIMER1 interrupt service function
******************************************************************************/
__irq void TIMER1_int (void) {
/* write code here */


/* list of all available flags, select which to use */
T1IR = 1;   /* Clear MAT1.0 interrupt flag */
T1IR = 2;   /* Clear MAT1.1 interrupt flag */
T1IR = 4;   /* Clear MAT1.2 interrupt flag */
T1IR = 8;   /* Clear MAT1.3 interrupt flag */
T1IR = 16;  /* Clear CAP1.0 interrupt flag */
T1IR = 32;  /* Clear CAP1.1 interrupt flag */
T1IR = 64;  /* Clear CAP1.2 interrupt flag */
T1IR = 128; /* Clear CAP1.3 interrupt flag */
VICVectAddr = 0;                             /* Acknowledge Interrupt */
}

/******************************************************************************
                  EINT0 interrupt service function
******************************************************************************/
__irq void EINT0_int (void) {
/* write code here */


EXTINT = 1;   /* Clear EINT0 interrupt flag */
VICVectAddr = 0;                             /* Acknowledge Interrupt */
}

/******************************************************************************
                  EINT2 interrupt service function
******************************************************************************/
__irq void EINT2_int (void) {
/* write code here */


EXTINT = 4;   /* Clear EINT2 interrupt flag */
VICVectAddr = 0;                             /* Acknowledge Interrupt */
}

/******************************************************************************
                  AD0 interrupt service function
******************************************************************************/
__irq void AD0_int (void) {
/* write code here */


   /* read ADC result to clear interrupt flag (done) */
VICVectAddr = 0;                             /* Acknowledge Interrupt */
}

/* Default Interrupt Function: may be called when ISR is disabled */
__irq void DefISR (void) {
}

int main(void)
{
/*
    P0.0:  PORT0.0 (General purpose I/O)  Input
    P0.1:  PORT0.1 (General purpose I/O)  Input
    P0.2:  PORT0.2 (General purpose I/open-drain O)  Input
    P0.3:  PORT0.3 (General purpose I/open-drain O)  Input
    P0.4:  PORT0.4 (General purpose I/O)  Input
    P0.5:  PORT0.5 (General purpose I/O)  Input
    P0.6:  PORT0.6 (General purpose I/O)  Input
    P0.7:  PORT0.7 (General purpose I/O)  Input
    P0.8:  PORT0.8 (General purpose I/O)  Input
    P0.9:  PORT0.9 (General purpose I/O)  Input
    P0.10:  PORT0.10 (General purpose I/O)  Input
    P0.11:  PORT0.11 (General purpose I/O)  Input
    P0.12:  PORT0.12 (General purpose I/O)  Input
    P0.13:  PORT0.13 (General purpose I/O)  Input
    P0.14:  PORT0.14 (General purpose I/O)  Input
    P0.15:  PORT0.15 (General purpose I/O)  Input
    P0.16:  PORT0.16 (General purpose I/O)  Input
    P0.17:  PORT0.17 (General purpose I/O)  Input
    P0.18:  PORT0.18 (General purpose I/O)  Input
    P0.19:  PORT0.19 (General purpose I/O)  Input
    P0.20:  PORT0.20 (General purpose I/O)  Input
    P0.21:  PORT0.21 (General purpose I/O)  Input
    P0.22:  PORT0.22 (General purpose I/O)  Input
    P0.23:  PORT0.23 (General purpose I/O)  Input
    P0.24:  PORT0.24 (General purpose I/O)  Input
    P0.25:  PORT0.25 (General purpose I/O)  Input
    P0.26:  PORT0.26 (General purpose I/O)  Input
    P0.27:  PORT0.27 (General purpose I/O)  Input
    P0.28:  PORT0.28 (General purpose I/O)  Input
    P0.29:  PORT0.29 (General purpose I/O)  Input
    P0.30:  PORT0.30 (General purpose I/O)  Input
    P0.31:  PORT0.31 (General purpose O)  Output
*/

    PINSEL0=0x00000000;     /* binary: 00000000_00000000_00000000_00000000 */
    IO0DIR=0x80000000;     /* binary: 10000000_00000000_00000000_00000000 */
    PINSEL1=0x00000000;     /* binary: 00000000_00000000_00000000_00000000 */

/******************************************************************************
                           External interrupts
*******************************************************************************
    Ext. interrupt 0 mode: Level sensitivity / Active low  / wake on interrupt 0 is Off
    Ext. interrupt 2 mode: Edge sensitivity / Rising edge  / wake on interrupt 2 is Off
*/
    EXTMODE=0x04;     /* binary: 00000100 */
    EXTPOLAR=0x04;     /* binary: 00000100 */
    INTWAKE=0x0000;     /* binary: 00000000_00000000 */
    EXTINT=0x05;     /* clear all the external interrupt flags */

   VICVectAddr2 = (unsigned long) TIMER0_int;           /* set interrupt vector 2 */
   VICVectCntl2 = ( 0x20 | 4 );           /* enable slot & use it for TIMER0 Interrupt */
   VICIntEnable |= (1<<4);           /* Enable TIMER0 Interrupt */

   VICVectAddr3 = (unsigned long) TIMER1_int;           /* set interrupt vector 3 */
   VICVectCntl3 = ( 0x20 | 5 );           /* enable slot & use it for TIMER1 Interrupt */
   VICIntEnable |= (1<<5);           /* Enable TIMER1 Interrupt */

   VICVectAddr5 = (unsigned long) EINT0_int;           /* set interrupt vector 5 */
   VICVectCntl5 = ( 0x20 | 14 );           /* enable slot & use it for EINT0 Interrupt */
   VICIntEnable |= (1<<14);           /* Enable EINT0 Interrupt */

   VICVectAddr7 = (unsigned long) EINT2_int;           /* set interrupt vector 7 */
   VICVectCntl7 = ( 0x20 | 16 );           /* enable slot & use it for EINT2 Interrupt */
   VICIntEnable |= (1<<16);           /* Enable EINT2 Interrupt */

   VICVectAddr10 = (unsigned long) AD0_int;           /* set interrupt vector 10 */
   VICVectCntl10 = ( 0x20 | 18 );           /* enable slot & use it for AD0 Interrupt */
   VICIntEnable |= (1<<18);           /* Enable AD0 Interrupt */

   VICDefVectAddr = (unsigned long) DefISR;           /* un-assigned VIC interrupts */

/******************************************************************************
                                ADC0
*******************************************************************************
   ADC operational
   ADC clk: 3,75 MHz  (calculated with peripheral clock:15MHz)
   ADC rate: 375 Ksamples/sec
   burst mode, 10 clocks /   9 bit accuracy
   No start (only in manual mode, for burst always on)
   Channel 0 enabled, will generate an interrupt when conversion ends
   Channel 1 disabled, no interrupt
   Channel 2 disabled, no interrupt
   Channel 3 enabled, will generate an interrupt when conversion ends
   Channel 4 enabled, no interrupt
   Channel 5 disabled, no interrupt
   Channel 6 disabled, no interrupt
   Channel 7 disabled, no interrupt
*/

AD0CR=0x00230319;     /* binary: 00000000_00100011_00000011_00011001 */
AD0INTEN=0x00000009;     /* binary: 00000000_00000000_00000000_00001001 */

/******************************************************************************
                           Timer0 (32bit)
*******************************************************************************
   Counter Enabled,    Counter Reset=0
   Timer mode: count on rising edge of PCLK
   Counter clk: 15 MHz, Counts every: 66,67 ns  (calculated with peripheral clock:15MHz)
   MCR0.1 : reset, stop, generate interrupt on compare match
   MCR0.3 : reset, on compare match
   CCR0.0 : capture on rising edge, capture on falling edge, 
   CCR0.2 : capture on rising edge, capture on falling edge, generate interrupt on capture event, 
   MAT0.0 : On compare match Set bit/output
*/
T0TCR=0x01;     /* binary: 00000001 */
T0CTCR=0x00;     /* binary: 00000000 */
T0TC=0x00000000;     /* decimal 0 */
T0PR=0x00000000;     /* decimal 0 */
T0PC=0x00000000;     /* decimal 0 */
T0MCR=0x0438;     /* binary: 00000100_00111000 */
T0MR0=0x00000000;     /* decimal 0 */
T0MR1=0x00000208;     /* decimal 520 */
T0MR2=0x00000000;     /* decimal 0 */
T0MR3=0x000000C8;     /* decimal 200 */
T0CCR=0x01C3;     /* binary: 00000001_11000011 */
T0EMR=0x0021;     /* binary: 00000000_00100001 */
PWM0CON=0x00000000;     /* binary: 00000000_00000000_00000000_00000000 */

/******************************************************************************
                           Timer1 (32bit)
*******************************************************************************
   Counter Enabled,    Counter Reset=0
   Timer mode: count on rising edge of PCLK
   Counter clk: 576,9231 KHz, Counts every: 1,73 us  (calculated with peripheral clock:15MHz)
   MCR1.1 : reset, generate interrupt on compare match
   CCR1.2 : capture on falling edge, generate interrupt on capture event, 
   CCR1.3 : capture on rising edge, capture on falling edge, 
*/
T1TCR=0x01;     /* binary: 00000001 */
T1CTCR=0x00;     /* binary: 00000000 */
T1TC=0x00000000;     /* decimal 0 */
T1PR=0x00000019;     /* decimal 25 */
T1PC=0x00000000;     /* decimal 0 */
T1MCR=0x0018;     /* binary: 00000000_00011000 */
T1MR0=0x00000064;     /* decimal 100 */
T1MR1=0x000000C8;     /* decimal 200 */
T1MR2=0x00000000;     /* decimal 0 */
T1MR3=0x00000000;     /* decimal 0 */
T1CCR=0x0780;     /* binary: 00000111_10000000 */
T1EMR=0x0000;     /* binary: 00000000_00000000 */
PWM1CON=0x00000000;     /* binary: 00000000_00000000_00000000_00000000 */

   while(1)
  {
  
  
   }

}

ดาวน์โหลดโปรแกรม ARMwizard

 
 
เครดิต http://alexan.edaboard.eu/

รายการหน้าเว็บย่อย

Comments