embeded/Cortex-M3 Ti2013. 6. 11. 18:02
cortex-m3용 저가형 JTAG을 찾을일이 있어서 테스트 해봄
VAT 포함 3.3만원 정도로 구매할수 있어
TI Evaluation 보드로 하는것 보다 저렴하게 할 수 있다.

[링크 : http://funchip.co.kr/shop/goods/goods_view.php?&goodsno=9996461&category=004004] 국내 판매 대행
[링크 : http://blog.iteadstudio.com/] 제조사
[링크 : http://wooridisplay.co.kr/Documents/X-LinkEx.pdf] 데이터 시트
[링크 : http://coocox.org/] 드라이버


근데 MDK 연동은 머가 엉겼는지 안됨 -_-



드라이버 설치하면 아래와 같이 두개가 추가된다.


일단 MDK는 포기하고 전용 프로그램으로 굽기!(coflash)


1607이라서 안될줄 알았는데 음..
elf 파일로는 문제없이 구워진다. 그리고 MDK 에서 ICDI 하는것보다 더욱 빠르게 굽고 확인한다! 우옹!


'embeded > Cortex-M3 Ti' 카테고리의 다른 글

bitband / cortex-m3  (0) 2013.08.16
LM3S1968과 H-JTAG(wiggler)  (0) 2013.06.28
cortex-m3가 문제인가.. keil이 문제인가?  (2) 2013.02.05
LM3S - FlashProgram()  (0) 2012.11.06
TI Stellaris LM3S 시리즈 ICDI가 사라졌어요!!!  (0) 2012.09.22
Posted by 구차니
embeded/Cortex-M3 Ti2013. 2. 5. 10:44
unsigned 를 int로 변경할때 코드상의 문제였나 해서 테스트를 해봤는데 -_-
헐.. 머야 이거.. 컴파일러 특성인가?

int t1,t2,t3,t4;
unsigned char t9=-1;

t1 = t9;
t2 = (char)t9;
t3 = (int)t9;
t4 = (int)(char)t9;
		
printf("%d %d %d %d",t1,t2,t3,t4);
//255,255,255,255

아무튼, cortex-m3 + keil 에서는 일단
음수일 경우(MSB가 0x80 이면)
if(t9 & 0x80) t1 = t9 | 0xFFFFFF00;
else t1 = t9;

이런식으로 구현해서 써야 할 듯 -_-

2013/02/04 - [Programming/C++ / STL] - unsigned char -> int 변환 주의사항

---
추가로 테스트 해보니 unsigned char가 아닌 char 일 경우에도
up convert시 음수에 대해서 제대로 키워주지 못하는 문제가 있다.
KEIL 컴파일러 문제이려나? 

'embeded > Cortex-M3 Ti' 카테고리의 다른 글

LM3S1968과 H-JTAG(wiggler)  (0) 2013.06.28
cortex-m3 JTAG / X-LinkEx 1.1  (0) 2013.06.11
LM3S - FlashProgram()  (0) 2012.11.06
TI Stellaris LM3S 시리즈 ICDI가 사라졌어요!!!  (0) 2012.09.22
stellarisware - UARTStdioInit()  (4) 2012.07.23
Posted by 구차니
embeded/Cortex-M3 Ti2012. 11. 6. 14:56
근 일주일을 골머리 아프게 만든 녀석...
데이터를 저장하는데 귀찮아서 몇단계 래핑해버리고 쓰다보니
그리고 정말정말 운이좋게 4의 배수로 저장이 되서 티가 안났었는데
이번에 프로그램을 수정/확장하다가 우연히 발견.. -_-

아무튼, LM3S에서(cortex-m3) FlashProgram()을 통해서 내장 플래시에 데이터를 써넣을때
4바이트 align이 되지 않으면 미치거나 죽는다 -_- (무한루프 돌고 있을지도?)
어쩌면 쓰긴 쓰는데 개비지 값이 이상한데로 튀어서 SRAM 영역 건드리는게 아닐까 싶을 정도..

10.2.2.8 FlashProgram
Programs flash.
Prototype:
long FlashProgram(unsigned long *pulData, unsigned long ulAddress, unsigned long ulCount)
Parameters:
pulData is a pointer to the data to be programmed.
ulAddress is the starting address in flash to be programmed. Must be a multiple of four.
ulCount is the number of bytes to be programmed. Must be a multiple of four.
Description:
This function programs a sequence of words into the on-chip flash. Each word in a page of
flash can only be programmed one time between an erase of that page; programming a word
multiple times results in an unpredictable value in that word of flash.
Because the flash is programmed one word at a time, the starting address and byte count
must both be multiples of four. It is up to the caller to verify the programmed contents, if such
verification is required.
This function does not return until the data has been programmed.
Returns:
Returns 0 on success, or -1 if a programming error is encountered.  

Posted by 구차니
embeded/Cortex-M3 Ti2012. 9. 22. 13:02
어느날 프로그램 구으려는데 장치를 못 찾아서 배째는 현상 발생
근 1달 넘게 손을 놓고 있었는데.. -_-t
Win7으로 갈아타려고 하면서 드라이버를 설치하면서 혹시나 했는데 역시나 해결 -_-


일단 증상은 아래와 같이 MDK에서 ICDI 설정시 Attached Devices 목록에 나오지 않는다.


정상이라면 아래와 같이 Stellaris FTDI ICDI가 떠야 한다.


물론 드라이버는 정상적으로 설치되어 있겠으나
"범용 직렬 버스 컨트롤러 - Stellaris ICDI Board A"를 재설치 하니 문제없이 인식한다.
EKC-LM3S1968-CD\Tools\FTDI 의 경로에서 해당 드라이버를 수동으로 잡아서 해주면 된다.


"이 위치에서 가장 적합한 드라이버 검색" 으로 경로를 넣어줘서는 동일한 버전이라고 설치가 안되니
"검색 안 함. 설치할 드라이버를 직접 선택" 으로 경로를 넣어주고 직접 골라서 설치하면 된다.



윈7으로 갈아 타려는데 삼성 IDE  80GB 하드라서 속도가 외장 USB 플래시 만도 못한
초당 15MB/s....그냥 XP로 길이길이 고이고이 살아가련다 ㅠ.ㅠ 
Posted by 구차니
embeded/Cortex-M3 Ti2012. 7. 23. 10:44
stellraisware의 UARTStudioInit()는 간단하게 UART를 초기화 해주는 함수이다.
UARTStudioInit()의 초기화 값은 0에서 2까지 가능하며 이 내용이 합당한 정의는 존재하지 않는듯.
그리고 baud rate 라던가 인터럽트 등은 초기화 해준다고 해도
포트 자체를 사용할지에 대한 초기화는 사용자가 해주어야 한다.
그리고 115200-N-8-1로 무조건 정의되니 주의!!

만약 주변장치 초기화를 하지 않으면, 당연히(!) 아무런 것도 출력되지 않는다.

SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);

UARTStdioInit(1);
UARTprintf("Hello World\n"); 

//*****************************************************************************
//
//! Initializes the UART console.
//!
//! \param ulPortNum is the number of UART port to use for the serial console
//! (0-2)
//!
//! This function will initialize the specified serial port to be used as a
//! serial console.  The serial parameters will be set to 115200, 8-N-1.
//! An application wishing to use a different baud rate may call
//! UARTStdioInitExpClk() instead of this function.
//!
//! This function or UARTStdioInitExpClk() must be called prior to using any
//! of the other UART console functions: UARTprintf() or UARTgets().  In order
//! for this function to work correctly, SysCtlClockSet() must be called prior
//! to calling this function.
//!
//! It is assumed that the caller has previously configured the relevant UART
//! pins for operation as a UART rather than as GPIOs.
//!
//! \return None.
//
//*****************************************************************************
void
UARTStdioInit(unsigned long ulPortNum)
{
    //
    // Pass this call on to the version of the function allowing the baud rate
    // to be specified.
    //
    UARTStdioInitExpClk(ulPortNum, 115200);
} 

[링크 : http://e2e.ti.com/support/microcontrollers/stellaris_arm_cortex-m3_microcontroller/f/471/p/45229/160748.aspx]
Posted by 구차니
embeded/Cortex-M3 Ti2012. 6. 30. 11:17
말이 거창한데...
아무튼 스택의 크기가 작으면 함수 호출의 깊이가 깊을 경우
스택이 깨지면서 프로그램이 예측 불가능하게 죽는 문제가 발생한다.
이런 경우 해당 파일의 Stack 변수를 수정해주면 된다.
프로젝트를 생성해보지 않아서 잘 모르겠지만.. 아무튼 스택 크기는 512Byte(0x0200)으로 잡혀 있으니
용도에 맞게 설정하면 된다.

;******************************************************************************
;
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
;******************************************************************************
Stack   EQU     0x00000200   



Posted by 구차니
embeded/Cortex-M3 Ti2012. 6. 28. 22:00
기본제공 되는 예제에서 unsigned 만 삭제하면 문제없이 영하에 대해서도 작동한다.

long GetTemperature(char isCelcius)
{
	long ulADC0_Value[1];
	long ulTemp_ValueC;
	long ulTemp_ValueF;
	
	ADCProcessorTrigger(ADC0_BASE, 3);
	while(!ADCIntStatus(ADC0_BASE, 3, false))
	{
	}

	ADCSequenceDataGet(ADC0_BASE, 3, ulADC0_Value);
	ulTemp_ValueC = ((1475 * 1023) - (2250 * ulADC0_Value[0])) / 10230;
	ulTemp_ValueF = ((ulTemp_ValueC * 9) + 160) / 5;

	if(isCelcius) return ulTemp_ValueC;
	return ulTemp_ValueF;
}
Posted by 구차니
embeded/Cortex-M3 Ti2012. 6. 18. 22:52
이름은 거창한데,
간단하게 말하면 잘못 구성된 인터럽트 전송 방식에서의 문제점 이다.

void main()
{
    while(1)
        uart_handler();
}

void uart_handler()
{
    if(send != recv) flush();
}

대략 이런 구조에서 단순하게 send와 recv로 전송할 데이터가 있는지만 확인하고
flush()를 이용해 uart tx finish interrupt를 통해 데이터를 지속적으로 보내려고 할경우
uart_handler()에 의해 루프를 도는중 지속적으로 flush를 함으로서 데이터가 몇바이트 깨지거나
순서가 바뀌는 것 같은 문제가 발생하기도 한다.


간단하고 당연한(?) 해결책은
전송이 시작되었고 전송중이라는 플래그를 두는 것. 
Posted by 구차니
embeded/Cortex-M3 Ti2012. 2. 20. 21:19
어떤 i2c 칩이랑 avr이랑 통신하려니 안되서 ti 칩으로 바꾸고 나니 잘되는데 -_-
이제야 와서 이유를 찾아보게 되는데..

TI 칩에서 I2C로 Alternative Function을 사용하게 되면 open drain으로 설정되는데, 
아마도 AVR atmel 은 pull-up이 되면서 모종의 문제가 발생하는 듯하다.

 When using the I2C module, in addition to configuring the pin to open drain, the GPIO Alternate Function Select (GPIOAFSEL) register bits for the I2C clock and data pins should be set to 1 (see examples in “Initialization and Configuration” on page 185).  

15.2 Functional Description
Each I2C module is comprised of both master and slave functions which are implemented as separate peripherals. For proper operation, the SDA and SCL pins must be connected to bi-directional open-drain pads. A typical I2C bus configuration is shown in Figure 15-2 on page 399. See “Inter-Integrated Circuit (I2C) Interface” on page 546 for I2C timing diagrams. 

[링크 : http://cooa.tistory.com/entry/20030676476]
Posted by 구차니
embeded/Cortex-M3 Ti2012. 2. 5. 22:08
driverlib 관련 분석 내용 / uart 예제사용
전반적으로 초기화 설정을 보면 무언가.. 중복되도록 설정하는 느낌?
특히 UART의 경우에는 몇단계를 통해서 설정을 하는 것을 보면...

함수설명
extern void SysCtlClockSet(unsigned long ulConfig); // 클럭설정을 하도록 함.
 

extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); // 포트를 사용하도록 설정함
extern void GPIOPinConfigure(unsigned long ulPinConfig); // GPIO로 쓸지 하드웨어 내장 기능을 쓸지 설정함

extern void GPIOPinTypeGPIOInput(unsigned long ulPort, unsigned char ucPins); // 해당 포트의 해당핀을 입력용으로 설정
extern void GPIOPinTypeGPIOOutput(unsigned long ulPort, unsigned char ucPins); // 해당 포트의 해당핀을 출력용으로 설정
extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulStrength, unsigned long ulPadType);
                                                                                  // 해당 포트의 해당핀에 대한 GPIO 드라이브 전류와 pull-up / open-drain 설정
 

예제설명
int main(void)
{
    char cThisChar;

    // 시스템 클럭설정
    SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
    // UART0 기능을 사용하도록 함
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    // UART 핀이 포함된 GPIOA 포트를 사용하도록 함
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    // GPIO A의 0번 핀을 U0 RX로 사용하도록 함
    GPIOPinConfigure(GPIO_PA0_U0RX);
    // GPIO A의 1번 핀을 U0 TX로 사용하도록 함
    GPIOPinConfigure(GPIO_PA1_U0TX);
    // GPIO A의 0번 1번 핀을 UART에 할당함
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    // UART의 클럭소스와 Baudrate등을 설정함
    UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,
                       (UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));
    do
    {
        // UART0로 부터 1문자를 받아옴(blocking 방식)
        cThisChar = UARTCharGet(UART0_BASE);
        // 받아온 문자을 UART0로 출력함
        UARTCharPut(UART0_BASE, cThisChar);
    } while((cThisChar != '\n') && (cThisChar != '\r'));

    return(0);
}

'embeded > Cortex-M3 Ti' 카테고리의 다른 글

uart 인터럽트 / 폴링 충돌  (0) 2012.06.18
Ti lm3s1968 arm cortex m3 i2c  (0) 2012.02.20
Cortex-M3 인터럽트 관련 문서  (0) 2012.01.31
Cortex-M3 예제소스  (0) 2012.01.27
Cortex-M3 LM3S1968 Evaluation board  (0) 2012.01.27
Posted by 구차니