PDA

View Full Version : C Programming for ARM7 tutorial???


nguyentrunght
09-12-08, 17:09
Hiện tại em đang làm việc (bắt đầu) với đồng chí AT91SAM7S256 trên kit AT91SAM7S256 EV mua ở PNlab
em đang dùng complier là Keil C,ban đầu bị choáng với cái header (dài hơn 2000 câu lệnh(cả comment)) và Library của nó(2500 câu)
tự hỏi ...khi nào thì dùng cái gì?như thế nào?cần những cái gì?....
Nói chung là stuck rất nhiều,cái democode kèm theo và trong phần sample thì lại quá ít,trên mạng tìm không thấy,tutorial đa phần bằng viết cho Assembly,có vẻ như bác Keil support không được tốt thì phải các bác ạ,vào trang chủ tìm bở hơi tai chẳng có cái gì hữu ích cả...
Cũng thấy có bác Tây hỏi về vấn đề tương tự nhưng cũng không đâu vào đâu,có 1 quyển sách hay nhưng not free....hơi oải
Hỏi bác Google mãi không được đành nhờ các bác vậy,ai có kn về lập trình C trên Keil cho ARM post lên mọi người cùng tham khảo góp ý nhé!
Cảm ơn các bác nhìu!
Em có search được 1 vài thứ
1 ví dụ
http://www.triplespark.net/elec/pdev/arm/at91sam7.html
Application note
http://www.atmel.com/dyn/products/app_notes.asp?family_id=605
Forum portal
http://www.at91.com
ARM Wiki
http://www.open-research.org.uk/ARMuC/HomePage.html

cation_h
09-12-08, 19:37
mình nghĩ bạn hoàn toàn có thể viết lại các file trên tùy thuộc vào nhu cầu của bạn.
bạn cũng nên biết một chút về tập lệnh của nó bởi vì các file startup bắt buộc phải viết bằng hợp ngữ. Bạn chỉ dùng được C khi đã có stack. hợp ngữ sẽ giúp bạn thiết lập các vùng nhớ, địa chỉ interupt, stack v.v... Môt số lệnh bắt buộc phải dùng hợp ngữ ko thể dùng được C.

Chi tiết bạn nên dọc quyển này:

http://ifile.it/6b4trv/1558608745.rar

trong đấy có link đến chõ down example code nữa, sách có phần tối ưu code cho chip arm rất hay và còn nhiều phần khác nữa.

chúc vui.

nguyentrunght
10-12-08, 09:35
cảm ơn bác cation_h em đang down về,nhưng ifile.it có vẻ down vất vả quả bác ạ.

chinh_dktd49
16-12-08, 22:26
mình cũng đang nghiên cứu đồ án về SAM7 nhưng mà không tìm được tài liệu..

bạn nào giúp mình với

cation_h
16-12-08, 22:46
mình nghĩ là CPU nào ko quá quan trọng
cùng 1 dòng thì tập lệnh sẽ như nhau: ví dụ cùng arm v4 (tương dương ARM7TDMI),v5, v5,v6 ...
nếu bạn Viết C thì gần như không phải quan tâm nhiều đến version.
Nếu bạn có tools rồi thì bạn xem trong programmer reference của nó sẽ có phần chỉ dẫn biên dịch và linker.
Do arm chỉ là IP core. Các hãng khác nhau sẽ có các module riêng của người ta -> tốt nhất là xem datasheet và các tài liệu kèm theo cùng với board.
Bạn muốn đọc về kiến trúc, tập lệnh, tối ưu code C cho arm, một số chương trình cấp cao hơn thì xin mời đọc quyển sách mình đã post ở trên.
chúc vui.

ududu
08-01-09, 15:40
oh
tìm mãi mới thấy thứ mình cần
thanks các pác :))

hbaocr
09-01-09, 05:52
@cation_h

mình nghĩ người mới học ảm nên sử dụng các complier có support sẵn;làm hộ mình nhiều thứ (như startup code;linker;makefile...) để có thời gia ma biết ARM nó làm ăn ra sao chứ mới vô nhào vào viết mấy cái kia thi mất thời gian lắm!KHi đã có 1 lượng kiến thức nhất định về ARM thì bạn mới sử dụng Gcc

cation_h
09-01-09, 19:19
tự làm thì lại biết được nhiều hơn và hiểu hơn chứ sao đang học cơ mà.
chưa biết làm thế nào thì lại google hoặc đọc document của GCC. Nó làm ra thì nó cũng viết tài liệu hướng dẫn hết chứ có phải ko viết đâu.
thêm nữa đọc tài liệu học TA luôn :)

chúc vui.

teovubk
08-10-09, 11:09
may pac giai thĩ gium em cai Keil Review voi C arm coi.Em dang xai Keil Review de tap viet nhung bi loi :
#include < stdio.h>
em goi lun: printf("....");
no bao loi em hoai cac pac a?? help me

hbaocr
08-10-09, 23:00
may pac giai thĩ gium em cai Keil Review voi C arm coi.Em dang xai Keil Review de tap viet nhung bi loi :
#include < stdio.h>
em goi lun: printf("....");
no bao loi em hoai cac pac a?? help me
vấn đề này là do bạn chưa viết các hàm retarget cho thư viện stdio.h
để sửa được lỗi này bạn phải thêm vào project của bạn 2 hàm

int sendchar (int ch); // Put Char to UART-0
int getkey (void); // Get Char From Uart-0


code cụ thể như sau
/************************************************** ****************************/
/* RETARGET.C: 'Retarget' layer for target-dependent low level functions */
/************************************************** ****************************/
/* This file is part of the uVision/ARM development tools. */
/* Copyright (c) 2005 Keil Software. All rights reserved. */
/* This software may only be used under the terms of a valid, current, */
/* end user licence from KEIL for a compatible version of KEIL software */
/* development tools. Nothing else gives you the right to use this software. */
/************************************************** ****************************/

#include <stdio.h>
#include "serial0.h"

#pragma import(__use_no_semihosting_swi)


//extern long timeval; /* in Time.c */


struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;


int fputc(int ch, FILE *f) {
return (sendchar(ch));
}

int fgetc(FILE *f) {
return (sendchar(getkey()));
}


int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}


void _ttywrch(int ch) {
sendchar (ch);
}


void _sys_exit(int return_code) {
while (1); /* endless loop */
}

và đay là function

#include "LPC214x.H" // LPC2148 MPU Register
#include "serial0.h"

/******************************/
/* Initial UART0 = 9600,N,8,1 */
/* VPB(pclk) = 60.00 MHz */
/******************************/
/******************************/
/* Write Character To UART0 */
/******************************/
int sendchar (int ch)
{
if (ch == '\n')
{
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
U0THR = 0x0D; // Write CR
}
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
return (U0THR = ch); // Write Character
}

/*****************************/
/* Read Character From UART0 */
/*****************************/

int getkey (void)
{
while (!(U0LSR & 0x01)); // Wait RXD Receive Data Ready
return (U0RBR); // Get Receice Data & Return
}


void init_serial0 (void)
{
PINSEL0 &= 0xFFFFFFF0; // Reset P0.0,P0.1 Pin Config
PINSEL0 |= 0x00000001; // Select P0.0 = TxD(UART0)
PINSEL0 |= 0x00000004; // Select P0.1 = RxD(UART0)

U0LCR &= 0xFC; // Reset Word Select(1:0)
U0LCR |= 0x03; // Data Bit = 8 Bit
U0LCR &= 0xFB; // Stop Bit = 1 Bit
U0LCR &= 0xF7; // Parity = Disable
U0LCR &= 0xBF; // Disable Break Control
U0LCR |= 0x80; // Enable Programming of Divisor Latches

// U0DLM:U0DLL = 15.00 MHz / [16 x Baud]
// = 15.00 MHz / [16 x 9600]
// = 97.6 = 98 = 0062H
U0DLM = 0x00; // Program Divisor Latch(391) for 9600 Baud
U0DLL = 0x62;

U0LCR &= 0x7F; // Disable Programming of Divisor Latches

U0FCR |= 0x01; // FIF0 Enable
U0FCR |= 0x02; // RX FIFO Reset
U0FCR |= 0x04; // TX FIFO Reset
U0FCR &= 0x3F;
}

xem thêm chi tiết ở đây


http://dientuvietnam.net/forums/showthread.php?t=12936&page=23

omalee
14-10-09, 22:19
Cho mình hỏi code ARM7 cho LPC2100 và AT91SAM7S khác nhau chỗ nào. Mình có coi code mẫu và thấy code cho LPC2100 hình như dễ hơn AT91SAM7S. Ko bít bác nào có thể nói rõ về sự khác biệt này ko? Và có thể áp dụng code của LPC2100 cho AT91SAM7S ko? Và có thể convert code qua lại được ko?
Cảm ơn!

Phong.dq
26-01-10, 15:30
Em cũng vừa mua một kit sam7s256 của PNLab, nhưng đang có dự án cần dùng IAR. Thực sự đây là lần đầu dùng IAR (trước toàn dùng keil:-<). Thế nên em chưa nắm được về cách thức lập trình trong IAR lắm.

Các bác cho em hỏi, IAR nó thường có 1 file board.h trong đó định nghĩa chip và các thanh ghi. Vậy việc lựa chọn chip (at91sam7s128 hay 256) nó nằm ở đâu ah? bởi vì em gặp lỗi "Board does not support the specified chip" này nhg ko thể tìm ra để sửa.

Mong nhận được phản hồi từ các bác. Em xin chân thành cảm ơn.:laychua:

Phong.dq
26-01-10, 15:39
Cho mình hỏi code ARM7 cho LPC2100 và AT91SAM7S khác nhau chỗ nào. Mình có coi code mẫu và thấy code cho LPC2100 hình như dễ hơn AT91SAM7S. Ko bít bác nào có thể nói rõ về sự khác biệt này ko? Và có thể áp dụng code của LPC2100 cho AT91SAM7S ko? Và có thể convert code qua lại được ko?
Cảm ơn!

Mỗi hãng sản xuất ARM quy định khác nhau về các thanh ghi, cách thức cấu hình ngoại vi như GPIO, UART... thế nên mỗi với mỗi hãng ARM (như LPC2100 hay AT91SAM7S...) bác phải nắm được cách thức định nghĩa của nó. Không thể convert hay chuyển đổi code của hãng này sang hãng khác được. Còn code dễ hay khó là do người viết thôi bác ah, một người có tư duy về C/C++ tốt sẽ có nhg định nghĩa rõ ràng và logic hơn là nhg người mới bắt đầu. Chứ không có chuyện dễ hơn hay khó hơn.

Chúc bác tìm được thành công với mọi loại chip ARM.

kamejoko80
26-01-10, 17:25
Vô forum của ATMEL,

http://www.at91.com/component/resource/article/products/3-sam7/3-sam7s.html
Community khá đầy đủ, đọc nhiều lần cũng sẽ thấy chân lý mà thôi.

Down load gói "at91sam7s-ek.zip" về, trong đó có một số project mẫu cho KEIL, IAR, GNU... có sẵn hết, ta chỉ có việc ngồi chén mà thôi.

Sao không dùng opensource WinARM hay là YAGATO gì đó. Xài phần mềm "chùa" nhiều quá ngại tay ghê.

anhxuyen
27-05-10, 22:47
cho minh hoi voi
minh bay gio moi tim hieu arm

mình dùng trình biên dịch keil 4.01

mình viết 1 mẩu nhỏ xem thanh ghi thế nào như sau

#include <AT91SAM7S128.H>



int main (void) {

int i;
i=i+1;
PIO_PSR = 0x0000FFFF;


}
////////////
mình tra datasheet rõ ràng có thanh ghi PIO_PSR, PIO_OSR...
nhưng khi biên dịch nó toàn báo không định nghĩa thế là sao.
hay mình phải mở file nào nữa thế
thanks