Hiển thị các bài đăng có nhãn ARM. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn ARM. Hiển thị tất cả bài đăng

Thứ Sáu, 19 tháng 10, 2012

[Lập trình ARM-LPC2378] Cách Chuyển Đổi Tương Tự/ Số - ADC, DAC

Nội dung

+ Tạo file Thư viện *.lib
+ Chuyển đổi Tương tự - Số: ADC
+ Chuyển đổi Số - Tương tự: DAC

Tạo file thư viện*.lib







+ Có 1 project định nghĩa các hàm.
+ Biên dịch project này ra file *.lib.
+ Một project khác add file .lib này vào và có thể gọi sử dụng các hàm trong file *.lib.
+ File gọi *.lib là file thư viện.


ADC
Giới thiệu
+ LPC2378 hỗ trợ 8 kênh chuyển đổi ADC


Các thanh ghi liên quan
+ AD0CR ( A/D Control Register ): Thanh ghi điều khiển AD - chọn chế độ xử lý cho qua trình chuyển đổi AD.
+ AD0GDR ( A/D Global Data Register ): Thanh ghi dữ liệu toàn cục - Chứa kết quả chuyển đổi AD gần nhất.
+ AD0STAT ( A/D Status Register ): Thanh ghi trạng thái - Cờ DONE và OVERRUN cho tất cả các kênh.
+ AD0INTEN (A/D Interrupt Enable Register): Thanh ghi bật / ngắt.

+ AD0DRn (A/D Channel n Data Register): Thanh ghi chứa dữ liệu tại kênh n– chứa kết quả chuyển đổi gần nhất trên kênh n.


Bật Power
Quản lý bởi Thanh ghi PCONP tại địa chỉ 0xE01FC0C4:






Cấu hình PINSEL





Đọc giá trị ADC

+ Kết quả chuyển đổi AD dược đọc tại thanh ghi AD0DR0 (từ bit thứ 6 đến bit thứ 15):
value = (AD0DR0 >> 6) & 0x3FF;





DACGiới thiệu
Bộ DAC chuyển đổi dữ liệu số thành tín hiệu bên ngoài (điển hình là âm thanh)


Các thanh ghi liên quan

+ DACR (D/A Control Register) : thanh ghi điều khiển AD –để đặt giá trị cần thay đổi tới.


Cấu hình PINSEL






PINSEL1 &= ~(0x03<<20); //enable DAC
PINSEL1 &= ~(0x02<<20); //enable DAC
(nguồn: ĐHKHTN TP.HCM)

[Lập trình ARM-LPC2378] Các Ngắt Trong LPC23xx

Nội Dung

+ Giới thiệu về ngắt trong LPC23xx
+ Các thanh ghi liên quan tới điều khiển ngắt
+ Hàm cài đặt ngắt install_irq()


Giới thiệu về ngắt trong LPC23xx

+ LPC2378 hỗ trợ 32 ngắt với 16 mức độ ưu tiên.
+ Có 2 loại ngắt: Interrupt request (IRQ) và Fast Interrupt Request (FIQ).
+ Fast Interrupt Request là ngắt có độ ưu tiên cao nhất. IRQ có độ ưu tiên thấp hơn.
+ Nếu có nhiều ngắt cùng độ ưu tiên thì ngắt nào ở Vector có chỉ số nhỏ hơn sẽ được thực thi trước.





+ Bảng trên thể hiện vị trí thứ tự các bit tương ứng với ngắt cho từng loại đối tượng.




Các thanh ghi liên quan tới điều khiển ngắt

+ VICIRQStatus (32bits) : Thanh ghi trạng thái của ngắt loại IRQ, bit bật lên 1 cho biết đối tượng ngắt tương ứng được kích hoạt và loại ngắt là IRQ.
+ VICFIQStatus (32bits) : Thanh ghi trạng thái của ngắt loại FIQ, bit bật lên 1 cho biết đối tượng ngắt tương ứng được kích hoạt và loại ngắt là FIQ.
+ VICVectAddrn (32bits) : Thanh ghi địa chỉ, chỉ tới hàm sẽ thực hiện nếu có ngắt xảy ra.
+ VICIntEnable (32bits) : Cho giá trị bằng 1 ở bit muốn cài đặt.
+ VICVectPriorityn (32bits) : Thanh ghi xét độ ưu tiên.
n: bit thứ n ( Với n: 0 -> 31 ).
Ví Dụ:
VICVectAddr4 = ( unsigned long ) TO_IRQHandler;
VICVectCnt4 = 15;
VICIntEnable = ( 1 << 4 );


+ Với n=4: Ngắt của Timer0
+ Hàm thực hiện khi ngắt xảy ra là TO_IRQHandler
+ Độ ưu tiên cho ngắt là 15
+ Khởi động Bộ điều khiển ngắt ở bit thứ 4


Khai báo
+ Hàm ngắt: có từ khóa __irq hoặc __fiq
VD:
void TO_IRQHandler(void)__irq
{
...
VICVectAddr = 0;
}
__irq void TO_IRQHandler(void)
{
...
VICVectAddr = 0;
}




Hàm cài đặt ngắt install_irq()
Hàm cài đặt ngắt
DWORD install_irq( DWORD IntNumber, void *HandlerAddr, DWORD Priority )
{
DWORD *vect_addr;
DWORD *vect_prio;


VICIntEnClr = 1 << IntNumber; //Disable Interrupt
if( IntNumber >= VIC_SIZE )
{
return( FALSE );
}
else
{
/* find first un assigned VIC address for the handler */
vect_addr = (DWORD *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + IntNumber*4);
vect_prio = (DWORD *)(VIC_BASE_ADDR + VECT_PRIO_INDEX + IntNumber*4);
*vect_addr = (DWORD)HandlerAddr; /* set interrupt vector */
*vect_prio = Priority;
VICIntEnable = 1 << IntNumber; /* Enable Interrupt */
return( TRUE );
}
}




Ví Dụ: Tạo ngắt cho Interrupt0 Button(INT0)





+ PINSEL4 = 0x01 << 20;
+ VICVectAddr14 = (unsigned long)abc;
+ VICVectCntl14 = 14;
+ VICIntEnable = (1 << 14);
+ __irq void abc (void)
{
……// xuat ten cua ban ra HyperTerminal
EXTINT=0x01;
VICVectAddr = 0;
}


(nguồn: ĐHKHTN TP.HCM)

[Lập trình ARM-LPC2378] Truyền Thông Nối Tiếp Không Đồng Bộ- UART

Nội dung
- - Giới thiệu về UART
- Các thanh ghi liên quan tới UART
- Cấu hình PINSEL
- Sử dụng Hyper Terminal


Giới thiệu về UART
Cổng COM









UART
+ + Viết tắt của: Universal Asynchronous Receiver/ Transmitter - Bộ thu/ phát không đồng bộ đa năng, là một loại thu/ phát không đồng bộ dùng để thực hiện việc chuyển đổi dữ liệu song song thành dữ liệu nối tiếp và truyền nhận nối tiếp giữa các bên phát và thu.
- + LPC2378 hỗ trợ 4 UARTs: UART 0, UART 1, UART 2, UART 3
- + UART 0/2/3: TXD, RXD
- + UART 1: TXD, RXD, CTS, RTS, DTR, DSR, RI…
-


Các thanh ghi liên quan tới UART
Các thanh ghi
- + UnRBR ( Receive Buffer Register, 1 byte) : thanh ghi chứa byte dữ liệu nhận.
- + UnTHR ( Transmit Holding Register, 1 byte): Thanh ghi chứa byte dữ liệu sẽ được gửi.
- + UnLCD (Line Control Register, 1 byte): Thanh ghi điều khiển, quyết định định dạng dữ liệu được truyền nhận (DataLength, Stop bit, Parity…)
- + UnIER (Interrupt Identification Register, 4 bytes ): thanh ghi để active 3 ngắt sử dụng cho UART
- + UnllR ( Interrupt Identification Register, 4 bytes) : thanh ghi cho biết có ngắt đang xảy ra hay không, nếu có thì là ngắt nào
- + UnDLL ( Divisor Latch LSB Register, 1 byte): quyết định baudrate của UART
- + UnDLM (Divisor Latch MSB Register, 1 byte)


Thanh ghi UnLSR
- + Nhận dữ liệu:
- Ta xét trạng thái ở bit 0
0: Thanh ghi UnRBR rỗng
1: Thanh ghi UnRBR có chứa dữ liệu
Int getkey (void)
{
While (!(UxLSR & 0x01));
Return (UxRBR);
}
- + Truyền dữ liệu:
+ Ta xét trạng thái ở bit 5
0: Thanh ghi UnTHR có chứa dữ liệu
1: Thanh ghi UnTHR rỗng
Int sendchar (int ch)
{
While (!(UxLSR & 0x20));
Return (UxTHR = ch);
}




Cấu hình PINSEL


Cấu hình PINSEL – UARTO





Cấu hình PINSEL – UART1










Sử dụng Hyper Terminal


Hyper Terminal
Các bạn Download phần mềm Hyper Terminal hercules 3.2.4 Tại Đây!


Các thông tin truyền nhận qua cổng COM
+ Baudrate: 9600 bps ( bits per second )
+ Data length: 8 bits
+ Parity: None
+ Stop bit: 1
+ Flow control: None


Thiết lập các thông số cho UART
+ Khi sử dụng thanh ghi UxDLL và UxDLM thì bit DLAB trong thanh ghi UxLCR phải là 1.
UxLCR = 0x83; // 8 bits, no Parity, 1 Stop bit
UxDLL = 78; // 9600 Baud Rate @ 12.0 MHZ PCLK
UxDLM = 0; // High divisor latch = 0
UxLCR = 0x03; // DLAB = 0
+ Sau khi thiết lập xong cho bit DLAB = 0 để sử dụng thanh ghi UnRBR, UnTHR

(Nguồn: ĐHKHTN TP.HCM)

ARM là gì? Giới thiệu về cấu trúc



Cấu trúc ARM


Cấu trúc ARM (viết tắt từ tên gốc là Acorn RISC Machine) là một loại cấu trúc vi xử lý 32-bit kiểu RISC được sử dụng rộng rãi trong các thiết kế nhúng. Do có đặc điểm tiết kiệm năng lượng, các bộ CPU ARM chiếm ưu thế trong các sản phẩm điện tử di động, mà với các sản phẩm này việc tiêu tán công suất thấp là một mục tiêu thiết kế quan trọng hàng đầu.
Ngày nay, hơn 75% CPU nhúng 32-bit là thuộc họ ARM, điều này khiến ARM trở thành cấu trúc 32-bit được sản xuất nhiều nhất trên thế giới. CPU ARM được tìm thấy khắp nơi trong các sản phẩm thương mại điện tử, từ thiết bị cầm tay (PDA, điện thoại di động, máy đa phương tiện, máy trò chơi cầm tay, và máy tính cầm tay) cho đến các thiết bị ngoại vi máy tính (ổ đĩa cứng, bộ định tuyến để bàn.) Một nhánh nổi tiếng của họ ARM là các vi xử lý Xscale của Intel.


Lịch sử phát triển





Một bộ vi xử lý Conexant được dùng chủ yếu trong các bộ định tuyến
Việc thiết kế ARM được bắt đầu từ năm 1983 trong một dự án phát triển của công ty máy tính Acorn.
Nhóm thiết kế, dẫn đầu bởi Roger Wilson và Steve Furber, bắt đầu phát triển một bộ vi xử lý có nhiều điểm tương đồng với Kỹ thuật MOS 6502 tiên tiến. Acorn đã từng sản xuất nhiều máy tính dựa trên 6502, vì vậy việc tạo ra một chip như vậy là một bước tiến đáng kể của công ty này.

Nhóm thiết kế hoàn thành việc phát triển mẫu gọi là ARM1 vào năm 1985, và vào năm sau, nhóm hoàn thành sản phẩm ‘’thực’’ gọi là ARM2. ARM2 có tuyến dữ liệu32-bit, không gian địa chỉ 26-bit tức cho phép quản lý đến 64 Mbyte địa chỉ và 16thanh ghi 32-bit. Một trong những thanh ghi này đóng vai trò là bộ đếm chương trình với 6 bit cao nhất và 2 bit thấp nhất lưu giữ các cờ trạng thái của bộ vi xử lý. Có thể nói ARM2 là bộ vi xử lý 32-bit khả dụng đơn giản nhất trên thế giới, với chỉ gồm 30.000 transistor (so với bộ vi xử lý lâu hơn bốn năm của Motorola là 68000với khoảng 68.000 transistor). Sự đơn giản như vậy có được nhờ ARM không có vi chương trình (mà chiếm khoảng ¼ đến 1/3 trong 68000) và cũng giống như hầu hết các CPU vào thời đó, không hề chứacache. Sự đơn giản này đưa đến đặc điểm tiêu thụ công suất thấp của ARM, mà lại có tính năng tốt hơn cả 286. Thế hệ sau,ARM3, được tạo ra với 4KB cache và có chức năng được cải thiện tốt hơn nữa.

Vào những năm cuối thập niên 80, hãng máy tính Apple Computer bắt đầu hợp tác với Acorn để phát triển các thế hệ lõi ARM mới . Công việc này trở nên quan trọng đến nỗi Acorn nâng nhóm thiết kế trở thành một công ty mới gọi là Advanced RISC Machines. Vì lý do đó bạn thường được giải thích ARM là chữ viết tắt của Advanced RISC Machines thay vì Acorn RISC Machine. Advanced RISC Machines trở thành công ty ARM Limited khi công ty này được đưa ra sàn chứng khoán London vàNASDAQ năm 1998.
Kết quả sự hợp tác này là ARM6. Mẫu đầu tiên được công bố vào năm 1991 và Apple đã sử dụng bộ vi xử lý ARM 610 dựa trên ARM6 làm cơ sở cho PDA hiệu Apple Newton. Vào năm 1994, Acorn dùng ARM 610 làm CPU trong các máy vi tínhRiscPC của họ.
Trải qua nhiều thế hệ nhưng lõi ARM gần như không thay đổi kích thước. ARM2 có 30.000 transistors trong khi ARM6 chỉ tăng lên đến 35.000. Ý tưởng của nhà sản xuất lõi ARM là sao cho người sử dụng có thể ghép lõi ARM với một số bộ phận tùy chọn nào đó để tạo ra một CPU hoàn chỉnh, một loại CPU mà có thể tạo ra trên những nhà máy sản xuất bán dẫn cũ và vẫn tiếp tục tạo ra được sản phẩm với nhiều tính năng mà giá thành vẫn thấp.

Thế hệ thành công nhất có lẽ là ARM7TDMI với hàng trăm triệu lõi được sử dụng trong các máy điện thoại di động, hệ thống video game cầm tay, và Sega Dreamcast. Trong khi công ty ARM chỉ tập trung vào việc bán lõi IP, cũng có một số giấy phép tạo ra bộ vi điều khiển dựa trên lõi này.
Dreamcast đưa ra bộ vi xử lý SH4 mà chỉ mượn một số ý tưởng từ ARM (tiêu tán công suất thấp, tập lệnh gọn …) nhưng phần còn lại thì khác với ARM. Dreamcast cũng tạo ra một chip xử lý âm thanh được thiết kế bởi Yamaha với lõi ARM7. Bên cạnh đó, Gameboy Advance của Nintendo, dùng ARM7TDMI ở tần số 16,78 MHz.

Hãng DEC cũng bán giấy phép về lõi cấu trúc ARM (đôi khi chúng ta có thể bị nhầm lẫn vì họ cũng sản xuất ra DEC Alpha) và sản xuất ra thế hệ Strong ARM. Hoạt động ở tần số 233 MHz mà CPU này chỉ tiêu tốn khoảng 1 watt công suất (những đời sau còn tiêu tốn ít công suất hơn nữa). Sau những kiện tụng, Intel cũng được chấp nhận sản xuất ARM và Intel đã nắm lấy cơ hội này để bổ sung vào thế hệ già cỗi i960 của họ bằng Strong ARM. Từ đó, Intel đã phát triển cho chính họ một sản phẩm chức năng cao gọi tên là Xscale.
Các dạng lõi


Họ
Lõi
Đặc tính
Cache (I/D)/MMU
MIPS điển hình @ MHz
Ứng dụng
ARM7TDMI
ARM7TDMI(-S)
3-tầng pipeline
không
15 MIPS @ 16.8 MHz
Game Boy Advance,
Nintendo DS, iPod

ARM710T
MMU

36 MIPS @ 40 MHz
Psion 5 series

ARM720T

8KB unified,MMU
60 MIPS @ 59.8 MHz


ARM740T

MPU



ARM7EJ-S
Jazelle DBX
không


ARM9TDMI
ARM9TDMI
5-tầng pipeline
không



ARM920T

16KB/16KB, MMU
200 MIPS @ 180 MHz
GP32,GP2X (lõi đầu tiên),
Tapwave Zodiac (Motorola i. MX1)

ARM922T

8KB/8KB, MMU



ARM940T

4KB/4KB, MPU

GP2X (lõi thứ hai)
ARM9E
ARM946E-S

thay đổi được, tightly coupled memories, MPU

Nintendo DS,
Nokia N-Gage,
Conexant 802.11 chips

ARM966E-S

không có cache, TCMs

ST Micro STR91xF, includes Ethernet [1]

ARM968E-S

không có cache, TCMs



ARM926EJ-S
Jazelle DBX
thay đổi được, TCMs, MMU
220 MIPS @ 200 MHz
Điện thoại di động: 
Sony Ericsson 
(K, W series),
Siemens and Benq
(đời x65 và đời mới hơn)

ARM996HS
Clockless processor
không caches, TCMs, MPU


ARM10E
ARM1020E
(VFP)
32KB/32KB, MMU



ARM1022E
(VFP)
16KB/16KB, MMU



ARM1026EJ-S
Jazelle DBX
variable, MMU or MPU


ARM11
ARM1136J(F)-S
SIMD, Jazelle DBX, (VFP)
variable, MMU



ARM1156T2(F)-S
SIMD, Thumb-2, (VFP)
thay đổi được, MPU



ARM1176JZ(F)-S
SIMD, Jazelle DBX, (VFP)
thay đổi được, MMU+TrustZone



ARM11 MPCore
1-4 core SMP, SIMD, Jazelle DBX, (VFP)
thay đổi được, MMU


Cortex
Cortex-A8
Application profile, NEON, Jazelle RCT, Thumb-2
variable (L1+L2), MMU+TrustZone
lên đến 2000 (2.0 DMIPS/MHz in speed from 600 MHz to greater than 1 GHz)
Texas Instruments OMAP3

Cortex-R4
Embedded profile
variable cache, MMU optional
600 DMIPS
Broadcom là một hãng sử dụng

Cortex-M3
Microcontroller profile
no cache, (MPU)
120 DMIPS @ 100MHz
Luminary Micro[2]microcontroller family
XScale
80200/IOP310/IOP315
I/O Processor




80219





IOP321



Iyonix

IOP33x





PXA210/PXA250
Applications processor


Zaurus SL-5600

PXA255

32KB/32KB, MMU
400 BogoMips @400 MHz
Gumstix

PXA26x





PXA27x


800 MIPS @ 624 MHz
HTC Universal,
Zaurus SL-C1000

PXA800(E)F





Monahans


1000 MIPS @ 1.25 GHz


PXA900



Blackberry 8700

IXC1100
Control Plane Processor




IXP2400/IXP2800





IXP2850





IXP2325/IXP2350





IXP42x



NSLU2

IXP460/IXP465






Các lưu ý về thiết kế

Để đạt được một thiết kế gọn, đơn giản và nhanh, các nhà thiết kế ARM xây dựng nó theo kiểu nối cứng không có vi chương trình, giống với bộ vi xử lý 8-bit 6502 đã từng được dùng trong các máy vi tính trước đó của hãng Acorn.

Cấu trúc ARM bao gồm các đặc tính của RISC như sau:

§ Cấu trúc nạp/lưu trữ.
§ Không cho phép truy xuất bộ nhớ không thẳng hàng (bây giờ đã cho phép trong lõi Arm v6)
§ Tập lệnh trực giao
§ File thanh ghi lớn gồm 16 x 32-bit
§ Chiều dài mã máy cố định là 32 bit để dễ giải mã và thực hiện pipeline, để đạt được điều này phải chấp nhận giảm mật độ mã máy.
§ Hầu hết các lệnh đều thực hiện trong vòng một chu kỳ đơn.
So với các bộ vi xử lý cùng thời như Intel 80286 và Motorola 68020, trong ARM có một số tính chất khá độc đáo như sau:
§ Hầu hết tất cả các lệnh đều cho phép thực thi có điều kiện, điều này làm giảm việc phải viết các tiêu đề rẽ nhánh cũng như bù cho việc không có một bộ dự đoán rẽ nhánh.
§ Trong các lệnh số học, để chỉ ra điều kiện thực hiện, người lập trình chỉ cần sửa mã điều kiện
§ Có một thanh ghi dịch đóng thùng 32-bit mà có thể sử dụng với chức năng hoàn hảo với hầu hết các lệnh số học và việc tính toán địa chỉ.
§ Có các kiểu định địa chỉ theo chỉ số rất mạnh
§ Có hệ thống con thực hiện ngắt hai mức ưu tiên đơn giản nhưng rất nhanh, kèm theo cho phép chuyển từng nhóm thanh ghi.





(Nguồn: wikipedia)
DBS M05479
Quang Cao