Thông báo

Collapse
No announcement yet.

Thảo luận về ARM LPC 2138/2148

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • em có câu hỏi làm phiền thêm các bác chút nữa
    1.theo em được biết là thanh ghi VPBDIV là thanh để xác định tần số cho các thiết bị ngoại vi nhưng không hiểu đó là các thiết bị nào có phải là UART,ISP,USB,...không ?và còn có gì cần chú ý ở đây ko?
    2. IOSET,IOCLEAR,IOPIN đều có thể tác động vào các cổng vào ra vậy các bác cho em hỏi là các thanh ghi này có tác động lên nhau ko.nếu tác động vào cả IOSET và IOPIN thì sao?

    Comment


    • Cho em hỏi cách xuất giá trị ra từng chân cua dòng ARM NXP không phải từng PORT không?Em mới tập tọe làm về Arm xin các bác chỉ bảo.

      :

      Comment


      • Mình đang tìm hiểu con LPC2138, mình muốn nhờ mọi người trong diễn đàn có thể giúp mình gỡ rối cái giao tiếp với LCD theo kiểu 4 bits. Đây là code của mình, nó chỉ nhấp nháy con chuột thôi còn chuỗi ký tự thì nó ko chịu xuất ra. Mong mọi người giúp đỡ. Mình cảm ơn nhiều!
        Code:
        /**/
        #include "LPC213x.H"	
        
        #define RS	25
        #define RW	26
        #define E	27
        #define lcd_port	28
        
        void delay (unsigned int us);								//delay micro s
        void initial_lcd(void);										// Initial LCD
        void write_command(unsigned char command);	   				//send a command
        void write_character(unsigned char character);	  			//write a character
        void write_string(unsigned char *string);   				//write a string
        void write_data(unsigned char value);						//write data to port0
        void write_port1(unsigned int port, unsigned int value);	//write value to each pin in port0
        char busy_lcd(void);										//check busy flag
        
        int main(void)
        {
        	unsigned char *string = "Hello World!";
        	IODIR1 = 0xFE000000;
        	IODIR1 |= 1<<RS;
        	IODIR1 |= 1<<RW;
        	IODIR1 |= 1<<E;
        	IODIR1 |= 0xFE000000;
        	initial_lcd();
        	//write_command(0xc0);		//return first column in first line
        	delay(500);
        	write_string(string); 
        	delay(20000); 
        	while(1)
        	{
        		delay(5000);
        		write_command(0x1C);	//shift whole string into right
        	}
        }
        
        //==============================
        void initial_lcd(void)
        {	
        	write_command(0x28);	//function set: 4 bits, 2 rows
        	write_command(0x0F);	//display on, display cursor, blink
        }
        //==============================
        /*int check_bf(unsigned int pin_bf)
        {
        	unsigned int flag;
        	IODIR1 &= ~(1<<pin_bf);		//set input
        	flag = IOPIN1;				//assign
        	flag = (flag & (1<<pin_bf))>>pin_bf;
        	if(flag == 1)
        		return 1;
        	else 
        		return 0;
        }*/
        
        //==============================
        char busy_lcd(void)
        {
        	unsigned long bf;							// Busy Status Read
        	
        	IODIR1 &= 0x0FFFFFFF;						// LCD Data Bus = Read	  :set input
        	IOCLR1 |= 1<<RS;							//read BF from LCD
        	IOSET1 |= 1<<RW;
        	IOSET1 |= 1<<E;
        	
        	bf = (IOPIN1 & 0x80000000);				// Read LCD Data(DDDD:EN,RW,RS,0:0000:0000:0000:0000:0000:0000) 	
        	
        	if(bf == 0x80000000)  					// Read & Check Busy Flag
        	{
        		IOSET1 |= 1<<E;
        		IOCLR1 = 1<<RW;							//don't know to do what?
        		IODIR1 |= 0xFE000000;					//set output
        		return 1;								// LCD Busy Status
        	}
        	else
        	{
        		IOSET1 |= 1<<E;
        		IOCLR1 = 1<<RW;							//don't know to do what?
        		IODIR1 |= 0xFE000000;					//set output
        	 	return 0;								// LCD Ready Status
        	}
        }
        
        //==============================
        void write_command(unsigned char command)
        {	
        	IOCLR1 |= 1<<RS;
        	IOCLR1 |= 1<<RW;	
        	
        	//4 high bits
        	write_data((command>>4)&0x0f);
        	IOSET1 |= 1<<E;
        	delay(5);
        	IOCLR1 |= 1<<E;
        			  	
        	//4 low bits
        	write_data(command&0x0f);
        	IOSET1 |= 1<<E;	
        	delay(5);
        	IOCLR1 |= 1<<E;
        	while(busy_lcd());
        }
        
        	
        //==============================
        void write_character(unsigned char character)
        {	
        	IOSET1 |= 1<<RS;
        	IOCLR1 |= 1<<RW;
        
        	//4 high bits
        	write_data((character>>4)&0x0f);
        	IOSET1 |= 1<<E;
        	delay(5);
        	IOCLR1 |= 1<<E;
        
        	//4 low bits
        	write_data(character&0x0f);
        	IOSET1 |= 1<<E;
        	delay(5);
        	IOCLR1 |= 1<<E;
        	while(busy_lcd());
        }
        
        //==============================
        void write_data(unsigned char value)		//write data to port1
        {
        	IOCLR1 = 0xF0000000;					//Reset data
        	IOSET1 = (value<<28);
        }
        
        //==============================
        void write_string(unsigned char *string)
        {	
        	while(*string != '\0')	  				//string sentence is a array of characters
        	{						    			//when refer to sentence is the address
        		write_character(*string);			//*sentence is the content of that address
        		delay(500);
        		++string;
        	} 
        }	  
        
        //==============================
        void delay(unsigned int us)
        {
        	unsigned int i = us*10;
        	while(i>0)
        	{i--;}
        }

        Comment


        • Các bác ai đã làm việc với mấy con keypad thì chỉ giúp em với, loại 4x4 hay 3x4 cũng được ạ, em có bài tập cần đến giao tiếp với keypad mà không rõ hoạt động, rồi thì chân cẳng của cái keypad nó thế nào

          Comment


          • Nguyên văn bởi hvhien Xem bài viết
            Các bác ai đã làm việc với mấy con keypad thì chỉ giúp em với, loại 4x4 hay 3x4 cũng được ạ, em có bài tập cần đến giao tiếp với keypad mà không rõ hoạt động, rồi thì chân cẳng của cái keypad nó thế nào
            vấn đề này giống như điều khiển led matrix đấy mà .có điều led matrix là xuất tín hiệu ra còn bàn phím là đọc về .nếu bạn hiểu rõ nguyên lý của nó thì mình nghĩ là bạn sẽ làm được thôi.
            vấn đề khó hơn một chút là lập trình chống dội phím.

            Comment


            • Giúp! Delay dùng timer

              Hi mọi người,

              MÌnh mới bắt đầu học ARM LPC2103. Mình viết một chương trình delay đơn giản dùng timer1 nhưng khi build ra và nạp vào chip thì không thấy có tác dụng gì hết, có vẻ như uvision4 không dịch code được chính xác hay có vấn đề gì đó về map memory.
              Mong mọi người có kinh nghiệm giúp đỡ.
              Thanks
              [code]
              #include <lpc210x.h>
              void set_up_PLL(void)
              {
              PLLCFG=0x00000024; //xtal=12Mhz, cclk=60Mhz => M=5, P=2
              PLLCON=0x00000003; //PLL contected, PLL enabled
              PLLFEED=0x000000AA;
              PLLFEED=0x00000055; //PLL feeded
              VPBDIV=0x000000002; //pclk=1/2cclk
              }
              void set_up_timer1(void)
              {
              T1CTCR=0x00000000; //timer1 set as a timer, so T1CTCR[1:0]=00
              T1PR=0x00000009; //Pclk devided by 10 when using for Timer1
              T1MR0=0x002DC6C0; //T1MRO=3000000, after rising pulse, PC register increases by 1, when PC register reaches to 9
              //which means that 10 rising pulses executed, PC register will be reset and TC will increase by 1
              //when TC reaches to value in T1MR0=3000000 that means there would have been 30000000 pulses rose by
              //pclk (similar with time of 1 second) there will be a event depending on set up of T1MCR register
              T1MCR=0x00000002; //the event selected is to reset timer1 so T1MCR[2:0]=0b101;
              }
              void set_up_outputpin(void)
              {
              PINSEL1=0x00000020; // pin P0.19 is selected as MAT1.2
              T1EMR=0x00000300; //after timer1 reset, pin MAT1.2 (P0.19) will be reversed bit, so T1EMR[5:4] should be 1:1
              }
              int main(void)
              {
              set_up_PLL(); //set up PLL so that cclk=60Mhz, pclk=30Mhz
              set_up_timer1(); //set up timer1 as timer to count Pclk rising pulses, after 1s, 1 event will reset timer 1
              set_up_outputpin(); //set up status of output pin when events generated by timer0 and timer1
              T1TCR=0x00000002; //reset timer1
              T1TCR=0X00000001; //enable time1;
              while(1)
              {
              ;
              }

              }
              [\code]
              Last edited by uydanh; 08-07-2010, 23:13.

              Comment


              • Hi mọi người,

                MÌnh mới bắt đầu học ARM LPC2103. Mình viết một chương trình delay đơn giản dùng timer1 nhưng khi build ra và nạp vào chip thì không thấy có tác dụng gì hết, có vẻ như uvision4 không dịch code được chính xác hay có vấn đề gì đó về map memory.
                Mong mọi người có kinh nghiệm giúp đỡ.
                Thanks
                Code:
                #include <lpc210x.h>
                void set_up_PLL(void)
                {
                	PLLCFG=0x00000024;		//xtal=12Mhz, cclk=60Mhz => M=5, P=2
                	PLLCON=0x00000003;		//PLL contected, PLL enabled
                	PLLFEED=0x000000AA;
                	PLLFEED=0x00000055;		//PLL feeded
                	VPBDIV=0x000000002;		//pclk=1/2cclk
                }
                void set_up_timer1(void)
                {
                	T1CTCR=0x00000000;		//timer1 set as a timer, so T1CTCR[1:0]=00
                	T1PR=0x00000009;		//Pclk devided by 10 when using for Timer1
                	T1MR0=0x002DC6C0;		//T1MRO=3000000, after rising pulse, PC register increases by 1, when PC register reaches to 9
                							//which means that 10 rising pulses executed, PC register will be reset and TC will increase by 1
                							//when TC reaches to value in T1MR0=3000000 that means there would have been 30000000 pulses rose by
                							//pclk (similar with time of 1 second) there will be a event depending on set up of T1MCR register
                	T1MCR=0x00000002;		//the event selected is to reset timer1 so T1MCR[2:0]=0b101;
                }
                void set_up_outputpin(void)
                {
                	PINSEL1=0x00000020;		// pin P0.19 is selected as MAT1.2
                	T1EMR=0x00000300;		//after timer1 reset, pin MAT1.2 (P0.19) will be reversed bit, so T1EMR[5:4] should be 1:1
                }
                int main(void)
                {
                	set_up_PLL();  			//set up PLL so that cclk=60Mhz, pclk=30Mhz
                	set_up_timer1();		//set up timer1 as timer to count Pclk rising pulses, after 1s, 1 event will reset timer 1
                	set_up_outputpin();		//set up status of output pin when events generated by timer0 and timer1
                	T1TCR=0x00000002;		//reset timer1
                	T1TCR=0X00000001;		//enable time1;
                	while(1)
                	{
                	;
                	}	
                	
                }
                Attached Files

                Comment


                • Hi,
                  Trước đây mình viết một chương trình rất đơn giản, chỉ xuất LED thôi mà khi nạp vào mạch nó không chạy gì hết.
                  Sau đó so sánh với file mẫu thì trong "option for target--> Linker" mình đã không tick vào cái "use memory layout from target dialog" như là chương trình gốc đã làm. Thế là nó chạy được.
                  Nhưng vẫn không hiểu vấn đề là vì sao lại như vậy?
                  Và lần này khi viết chương trình cho timer dấu hiệu cũng tương tự nhưng có tick vào đó nó vẫn không chạy được.
                  Rất mong có bạn giúp mình giải thích các set up trong Linker đó có ý nghĩa gì vậy?

                  Cảm ơn mọi người nhiều.

                  Comment


                  • Mình không rành lắm về những cái option của KeilARM, nhưng trước giờ lập trình cho ARM của NXP, dù chương trình lớn hay phức tạp, mình cũng tuân thủ một vài bước tạo project sau và không bao giờ gặp lỗi cả.
                    1. Chọn đúng device (trong tab device)
                    2. Set xung crystal trong Target, chọn ARM mode (hoặc Thumb mode, tùy mục đích).
                    3. Tab Output chọn file hex nếu nạp bằng ISP, hoặc bỏ chọn nếu nạp qua Ulink (Jlink).
                    4. Tab C++ và ASM, gõ vào đường dẫn đến source hoặc header bên ngoài project trong "include path".
                    5. Tab Debug và Ulities chọn Ulink ARM nếu có.
                    6. Add file startup.s nếu KeilARM yêu cầu (nên add)
                    7. Dùng file target.c (và .h)_nếu muốn chỉnh PLL thì chỉnh trong target.h (2 file này trong example project của NXP.
                    8. Dùng file irq.c (và .h)_ để dùng các hàm cài đặt và gỡ bỏ interrupt.

                    Tất cả các project mình đều làm như vậy, và ko có vấn đề trục trặc gì xảy ra cả. Hiện nay mình chuyển qua Linux xài, nên dùng các toochain để dịch tuy hơi khó khăn một tí, nhưng các file source của KeilARM đều chạy tốt cả (bao gồm cả target và irq).
                    Chỉ có điều là mình chưa biết xử dụng Jlink trên Linux.
                    Có ai biết xử dụng Jlink trên Linux xin vui lòng chỉ giúp. Cám ơn.

                    Comment


                    • Bác nào biết cách tính toán thời gian trễ để nạp vào timer để tạo ra sự kiện ngắt . Ví dụ như cần ngắt là 5ms thì cách tính toán giá trị như thế nào?
                      Và cách tính giá trị nạp cho cổng UART khi thạch anh thay đổi không?
                      Cảm ơn nhiều nhiều.
                      n
                      ĐT: 0986 492 489

                      Tham khảo:

                      Comment


                      • Cái này trong User Manual có rất chi tiết , cả công thức luôn.

                        Comment


                        • Nguyên văn bởi dinhkhanh06 Xem bài viết
                          Cái này trong User Manual có rất chi tiết , cả công thức luôn.
                          Đã lỡ trả lời rồi thì nêu hướng đi cụ thể lun đi bạn Lê. Hay bạn chỉ biết nó ở đâu thôi mà ko hiểu nó ra sao. he he.

                          Nguyên văn bởi minhhieu Xem bài viết
                          Bác nào biết cách tính toán thời gian trễ để nạp vào timer để tạo ra sự kiện ngắt . Ví dụ như cần ngắt là 5ms thì cách tính toán giá trị như thế nào?
                          Và cách tính giá trị nạp cho cổng UART khi thạch anh thay đổi không?
                          Cảm ơn nhiều nhiều.
                          Bạn hãy down usermanual của con chip bạn đang dùng, coi kỹ chương "Clocking and power control" để biết cách chọn Clock Source, thiết lập giá trị cho bộ PLL, từ bộ PLL clock sẽ được cấp cho CPU, bộ USB và các bộ chức năng khác. Bạn nên tự đọc để hiểu rõ sẽ phải thiết lập ra sao.
                          Tổng quan là :
                          Có 3 nguồn tạo xung (thạch anh ngoài, xung nội, và xung của RTC) cần chọn 1 gọi là Fosc.
                          Sau khi chọn nguồn xung, Fosc sẽ lựa chọn đi qua bộ PLL hay không, để tạo ra Fpllclk, thông thường sẽ được nhân lên rất cao so vơi Fosc
                          Fpllclk này sẽ đi vào 2 bộ chia xung cho CPU và USB (nếu có) gọi là Fcclk và Fusb. Fcclk của ARM7 thông thường nhỏ hơn 84MHz, Fusb phải tính toán đúng 48MHz.
                          Fcclk sẽ tiếp tục chia để đi vào các bộ chức năng, lúc này gọi là Fpclk.
                          Từ đó, Fpclk này sẽ đưa vào các công thức tính cho Timer hoặc Baudrate của UART.
                          UART có công thức tính Baudrate rất dễ dùng, TIMER thì phải đi qua một vài thanh ghi giống như là một bộ chia xung nữa, tính hơn phức tạp một chút.

                          Bạn xem tiếp về Power control để bật các chức năng mặc định ban đầu sẽ tắt. Vd: TIMER2 và TIMER3 mặc định khi reset sẽ tắt.

                          Chúc học tốt.
                          Last edited by tdlong506; 28-07-2010, 19:50.

                          Comment


                          • em mới hoc ARM chua biết j nhiều, em dung keil c để lập trình và trong quá trình tạo project mới thì keil khởi tạo cho mình một Startup. Như vậy khi lập trình mình có cần quan tâm đến nó không vì mình thấy trong đó có các giá trị khởi tạo cho PLL. Các bác có thể nói dõ hơn cái đó nó làm nhiệm vụ j ko. Thank u

                            Comment


                            • Nguyên văn bởi hoang_tuan Xem bài viết
                              em mới hoc ARM chua biết j nhiều, em dung keil c để lập trình và trong quá trình tạo project mới thì keil khởi tạo cho mình một Startup. Như vậy khi lập trình mình có cần quan tâm đến nó không vì mình thấy trong đó có các giá trị khởi tạo cho PLL. Các bác có thể nói dõ hơn cái đó nó làm nhiệm vụ j ko. Thank u
                              Startup này khởi tạo cho board MCB2300 tuy nhiên nếu không có MCB2300 thì cũng cứ OK chẳng sao cả cái gì cần khới tạo thì mình khởi tạo lại thôi.theo kinh nghiệm thì nên cho vào . Sau đó nếu không cần thiết khởi tạo lại thì cứ viết chương trình bình thường nạp vào VDK là OK.

                              Comment


                              • File startup.s này viết bằng ASM, thông thường để khởi tạo các điều kiện ban đầu cho chip và cũng dùng để định hướng cho trình dịch. File này không phải chỉ dùng riêng cho một board nào cả, mà tuy từng chip và mục đích mà edit. Trong file này có thể khai báo cấu trúc bộ nhớ (memory map), vị trí các khối code, vị trí ram dành riêng cho các ngoại vi đặc biệt (USB, Ethernet). Nếu dịch bằng toolchain trên Linux thì rất cần thiết, còn dịch bằng KeilC thì những khai báo về cấu trúc bộ nhớ có sẵn khi chọn device, nên trong file startup chỉ còn thiết lập các thông số pll, reset các thanh ghi, khởi tạo IRQ...
                                Theo như sự hiểu biết hạn hẹp của mình là như vậy, không biết có ai phản bác thì mình xin gởi lời cảm ơn.
                                Rất mong nhận được ý kiên của các cao nhân.

                                Comment

                                Về tác giả

                                Collapse

                                emdaikho Tìm hiểu thêm về emdaikho

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X