ARMwizard โปรแกรมช่วยการตั้งค่า Register MCU ค่าย NXP
วันที่โพสต์: Jun 03, 2011 5:0:18 AM
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/