embeded/Cortex-M3 Ti2017. 3. 15. 10:07

테스트 코드

19200bps와 38400bps를 오가면서 1바이트씩 보내는 예제


  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);

GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);


while(1)

{

UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(), 19200, UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);

UARTCharPut(UART1_BASE,'A');

MDINDLY_mSec(100);

UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(), 38400, UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);

UARTCharPut(UART1_BASE,'B');

MDINDLY_mSec(100);

}



근데 도대체.. 예전에는 왜 안되었던 거지??


+

추가로

FIFO 설정은 UARTConfigSetExpClk 에서 무조건 Enable 시키니 주의

Posted by 구차니
embeded/Cortex-M3 Ti2016. 9. 2. 20:13

지금까지 굽는것만 시도하다가 웬일로(?) 디버깅에도 시도해보겠다고

평소와 다른 기운으로 시도했더니 성공 ㄷㄷ



플래시 굽기 / 디버그 시

C:\Keil\ARM\BIN\CooCox\devices\TI

에 프로젝트에 설정된 칩 이름으로 XML 파일이 존재하는지 확인 필요 하다.



---

머야.. 전에 안되던거 다시 해보니 되네? 머지?!?!?!?

다른 pc에서 해보니 예전에 사용하던 칩에 대한 XML 파일이(lm3s1607.xml) 존재하지 않았던 것

아무튼.. XML 파일이 은근히 별로 없다.

Posted by 구차니
embeded/Cortex-M3 Ti2016. 8. 27. 16:10

음.. 표현이 미묘한데


ekc-lm3s811 보드 자체가 ICDI 보드로 사용이 가능하다

다르게 표현하자면.. 이녀석에 external target을 꽂아 jtag으로 사용이 가능하다는 건데

먼가 하나 땜질해주면 된다고만 들어서 상세방법을 몰랐는데..

오늘에야 발견 -_-


수동으로 하려면

RST 버튼을 눌러준채로 LM Flash programmer로 구워주면 되고



JTAG의 20번 핀을 GND로 처리해주면 된다.


in ICDI mode... 이걸 이해를 못하고 그냥 넘어가서

이녀석에 달린 JTAG 핀으로 이해해버렸... ㅠㅠ


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

lm3s1607 uart baudrate runtime change  (0) 2017.03.15
keil uvision에서 colink-ex 연동하기  (0) 2016.09.02
cortex-m3 hibernate module...  (0) 2016.04.14
cortex-m3 인터럽트 관련 조사  (0) 2016.02.18
uart tx interrupt  (0) 2015.12.18
Posted by 구차니
embeded/Cortex-M3 Ti2016. 4. 14. 13:51

아.. 이래서 시간이 초기화가 안된거였나..





unsigned long ulStatus;

unsigned long ulNVData[64];

//

// Need to enable the hibernation peripheral before using it.

//

SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);

//

// Enable clocking to the Hibernation module.

//

HibernateEnableExpClk(SysCtlClockGet());

//

// User-implemented delay here to allow crystal to power up and stabilize.

//

//

// Configure the clock source for Hibernation module, and enable the RTC

// feature. This configuration is for a 4.194304 MHz crystal.

//

HibernateClockSelect(HIBERNATE_CLOCK_SEL_DIV128);

HibernateRTCEnable();

//

// Set the RTC to 0, or an initial value. The RTC can be set once when the

// system is initialized after the cold-startup, and then left to run. Or

// it can be initialized before every hibernate.

//

HibernateRTCSet(0);

//

// Set the match 0 register for 30 seconds from now.

//

HibernateRTCMatch0Set(HibernateRTCGet() + 30);

//

// Clear any pending status.

//

ulStatus = HibernateIntStatus(0);

HibernateIntClear(ulStatus);

//

// Save the program state information. The state information will be

// stored in the ulNVData[] array. It is not necessary to save the full 64

// words of data, only as much as is actually needed by the program.

//

HibernateDataSet(ulNVData, 64);

//

// Configure to wake on RTC match.

//

HibernateWakeSet(HIBERNATE_WAKE_RTC);

//

// Request hibernation. The following call may return since it takes a

// finite amount of time for power to be removed.

//

HibernateRequest(); 


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

keil uvision에서 colink-ex 연동하기  (0) 2016.09.02
ekc-lm3s811 를 ICDI로 사용하기  (0) 2016.08.27
cortex-m3 인터럽트 관련 조사  (0) 2016.02.18
uart tx interrupt  (0) 2015.12.18
coflash 구조 및 에러 메시지..  (0) 2015.12.11
Posted by 구차니
embeded/Cortex-M3 Ti2016. 2. 18. 14:57

master 인터럽트를 disable 하면 어떻게 작동할까?

우연히 그 타이밍에 발생할 인터럽트가 있었다면.. pending 될까? 아니면 그냥 잊혀지는걸까?



SW-DRL-UG-6288.pdf


13.2.2.3 IntMasterDisable

Disables the processor interrupt.

Prototype:

tBoolean

IntMasterDisable(void)

Description:

Prevents the processor from receiving interrupts. This does not affect the set of interrupts

enabled in the interrupt controller; it just gates the single interrupt from the controller to the

processor.

Note:

Previously, this function had no return value. As such, it was possible to include interrupt.h

and call this function without having included hw_types.h. Now that the return is a

tBoolean, a compiler error will occur in this case. The solution is to include hw_types.h

before including interrupt.h.

Returns:

Returns true if interrupts were already disabled when the function was called or false if they

were initially enabled.


13.2.2.4 IntMasterEnable

Enables the processor interrupt.

Prototype:

tBoolean

IntMasterEnable(void)

Description:

Allows the processor to respond to interrupts. This does not affect the set of interrupts enabled

in the interrupt controller; it just gates the single interrupt from the controller to the processor.

Note:

Previously, this function had no return value. As such, it was possible to include interrupt.h

and call this function without having included hw_types.h. Now that the return is a

tBoolean, a compiler error will occur in this case. The solution is to include hw_types.h

before including interrupt.h.

Returns:

Returns true if interrupts were disabled when the function was called or false if they were

initially enabled.


13.2.2.5 IntPendClear

Unpends an interrupt.

Prototype:

void

IntPendClear(unsigned long ulInterrupt)

Parameters:

ulInterrupt specifies the interrupt to be unpended.

Description:

The specified interrupt is unpended in the interrupt controller. This will cause any previously

generated interrupts that have not been handled yet (due to higher priority interrupts or the

interrupt no having been enabled yet) to be discarded.

Returns:

None.


13.2.2.6 IntPendSet

Pends an interrupt.

Prototype:

void

IntPendSet(unsigned long ulInterrupt)

Parameters:

ulInterrupt specifies the interrupt to be pended.

Description:

The specified interrupt is pended in the interrupt controller. This will cause the interrupt con

troller to execute the corresponding interrupt handler at the next available time, based on the

current interrupt state priorities. For example, if called by a higher priority interrupt handler,

the specified interrupt handler will not be called until after the current interrupt handler has

completed execution. The interrupt must have been enabled for it to be called.

Returns:

None.



interrupt.c


tBoolean

IntMasterEnable(void)

{

    //

    // Enable processor interrupts.

    //

    return(CPUcpsie());

}


tBoolean

IntMasterDisable(void)

{

    //

    // Disable processor interrupts.

    //

    return(CPUcpsid());

}


void

IntEnable(unsigned long ulInterrupt)

{

    //

    // Check the arguments.

    //

    ASSERT(ulInterrupt < NUM_INTERRUPTS);


    //

    // Determine the interrupt to enable.

    //

    if(ulInterrupt == FAULT_MPU)

    {

        //

        // Enable the MemManage interrupt.

        //

        HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_MEM;

    }

    else if(ulInterrupt == FAULT_BUS)

    {

        //

        // Enable the bus fault interrupt.

        //

        HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_BUS;

    }

    else if(ulInterrupt == FAULT_USAGE)

    {

        //

        // Enable the usage fault interrupt.

        //

        HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_USAGE;

    }

    else if(ulInterrupt == FAULT_SYSTICK)

    {

        //

        // Enable the System Tick interrupt.

        //

        HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN;

    }

    else if((ulInterrupt >= 16) && (ulInterrupt <= 47))

    {

        //

        // Enable the general interrupt.

        //

        HWREG(NVIC_EN0) = 1 << (ulInterrupt - 16);

    }

    else if(ulInterrupt >= 48)

    {

        //

        // Enable the general interrupt.

        //

        HWREG(NVIC_EN1) = 1 << (ulInterrupt - 48);

    }

}


void

IntDisable(unsigned long ulInterrupt)

{

    //

    // Check the arguments.

    //

    ASSERT(ulInterrupt < NUM_INTERRUPTS);


    //

    // Determine the interrupt to disable.

    //

    if(ulInterrupt == FAULT_MPU)

    {

        //

        // Disable the MemManage interrupt.

        //

        HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_MEM);

    }

    else if(ulInterrupt == FAULT_BUS)

    {

        //

        // Disable the bus fault interrupt.

        //

        HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_BUS);

    }

    else if(ulInterrupt == FAULT_USAGE)

    {

        //

        // Disable the usage fault interrupt.

        //

        HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_USAGE);

    }

    else if(ulInterrupt == FAULT_SYSTICK)

    {

        //

        // Disable the System Tick interrupt.

        //

        HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN);

    }

    else if((ulInterrupt >= 16) && (ulInterrupt <= 47))

    {

        //

        // Disable the general interrupt.

        //

        HWREG(NVIC_DIS0) = 1 << (ulInterrupt - 16);

    }

    else if(ulInterrupt >= 48)

    {

        //

        // Disable the general interrupt.

        //

        HWREG(NVIC_DIS1) = 1 << (ulInterrupt - 48);

    }

}


cpsid / cpsie 어셈블리 인스트럭션을 통해서 마스터 인터럽트를 제어한다.



SetEnable() 시에는 EN0를


SetDisable() 시에는 DIS0를 사용한다.


용도를 찾지 못한.. 이 펜딩.. 머지?



[링크 : http://www.ti.com/lit/ds/spms037g/spms037g.pdf]



음.. disabled interrupt를 펜딩으로 상태를 설정한다?

즉, enable/disable/pending 세가지 상태 중 하나만 가능한건가?


Writing 1 to the ISPR bit corresponding to:

an interrupt that is pending has no effect

a disabled interrupt sets the state of that interrupt to pending.

[링크 :http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Cihjjifh.html]

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

ekc-lm3s811 를 ICDI로 사용하기  (0) 2016.08.27
cortex-m3 hibernate module...  (0) 2016.04.14
uart tx interrupt  (0) 2015.12.18
coflash 구조 및 에러 메시지..  (0) 2015.12.11
ADCHardwareOversampleConfigure()  (0) 2015.11.17
Posted by 구차니
embeded/Cortex-M3 Ti2015. 12. 18. 16:54

lm3s1607 데이터 시트

TxFIFO가 있는데 이녀석에서 Transmitter로 한 바이트가 보내지면 TX 인터럽트가 떨어진다.

그런 이유로 가장 마지막 바이트가 UART를 통해 보내지는 시점에 (다음 바이트를 받기 위해) TX 인터럽트가 발생한다.

그래서 485 등을 사용시에는 TX 인터럽트 떨어졌다고 바로 TX Enable을 꺼버리면 안된다.



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

cortex-m3 hibernate module...  (0) 2016.04.14
cortex-m3 인터럽트 관련 조사  (0) 2016.02.18
coflash 구조 및 에러 메시지..  (0) 2015.12.11
ADCHardwareOversampleConfigure()  (0) 2015.11.17
lm3s811 / lm31968 adc 사양비교  (0) 2015.11.17
Posted by 구차니
embeded/Cortex-M3 Ti2015. 12. 11. 14:31

Can NOT Stop MCU!!

Flash driver fuction execution error



도대체.. 머가 문제인거냐...




일단 현재 수상(?) 한건

생산시기에 따른 편차가 있다는것


그리고 2014.7월에 JTAG/SWD 리셋 관련 글이 수정되었다는 점

(물론 예전 버전에도 내용은 존재함)


이래저래 벽에 막힌 기분..


coflash를 이용해서 굽는지라. 초기화 코드등은 수정하려면 할 수는 있으나..

flash 프로그램이 문제인지(elf / *.c / *.h)

xml 설정파일 쪽인지(adapter / debugger / device)

알수가 없네..


현재 의심가는건.. 

1. NVRAM의 설정에서 JTAG으로 설정되거나 SWD로 설정되는 녀석이 혼용되어

JTAG으로 설정된 녀석의 경우 SWD를 통해서 구을수 없다는 경우...


2. 내장 플래시의 문제(혹은 PLL 등?)


+

뒤지다 보니 coflash user defined algorithm이 존재!

[링크 : http://www1.coocox.org/CoFlashGuide/CoFlash_UserGuide_Algorithm.htm]




JTAG-to-SWD Switching

The 16-bit TMS/SWDIO command for switching to SWD mode is defined as b1110.0111.1001.1110, transmitted LSB first.


SWD-to-JTAG Switching

The 16-bit TMS/SWDIO command for switching to JTAG mode is defined as b1110.0111.0011.1100, transmitted LSB first.

 

7.2.3.5 Permanently Disabling Debug

 For extremely sensitive applications, the debug interface to the processor and peripherals can be permanently disabled, blocking all accesses to the device through the JTAG or SWD interfaces. With the debug interface disabled, it is still possible to perform standard IEEE instructions (such as boundary scan operations), but access to the processor and peripherals is blocked. The DBG0 and DBG1 bits of the User Debug (USER_DBG) register control whether the debug interface is turned on or off. The debug interface should not be permanently disabled without providing some mechanism–-such as the boot loader–-to provide customer-installable updates or bug fixes. Disabling the debug interface is permanent and cannot be reversed.

[링크 : http://www.ti.com/lit/ds/symlink/lm3s1607.pdf]

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

cortex-m3 인터럽트 관련 조사  (0) 2016.02.18
uart tx interrupt  (0) 2015.12.18
ADCHardwareOversampleConfigure()  (0) 2015.11.17
lm3s811 / lm31968 adc 사양비교  (0) 2015.11.17
ADC 샘플 시퀀서...  (0) 2015.11.17
Posted by 구차니
embeded/Cortex-M3 Ti2015. 11. 17. 17:26

ADCHardwareOversampleConfigure(ADC0_BASE, 64);

소심하게 2 4 8만 했는데 된다!!! 외쳤는데

실은 2^n 승으로 설정되는게 아니라 실제 배수가 설정되는 ㄷㄷ



void

ADCHardwareOversampleConfigure(unsigned long ulBase, unsigned long ulFactor)

{

    unsigned long ulValue;


    //

    // Check the arguments.

    //

    ASSERT((ulBase == ADC0_BASE) || (ulBase == ADC1_BASE));

    ASSERT(((ulFactor == 0) || (ulFactor == 2) || (ulFactor == 4) ||

           (ulFactor == 8) || (ulFactor == 16) || (ulFactor == 32) ||

           (ulFactor == 64)));


    //

    // Convert the oversampling factor to a shift factor.

    //

    for(ulValue = 0, ulFactor >>= 1; ulFactor; ulValue++, ulFactor >>= 1)

    {

    }


    //

    // Write the shift factor to the ADC to configure the hardware oversampler.

    //

    HWREG(ulBase + ADC_O_SAC) = ulValue;


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

uart tx interrupt  (0) 2015.12.18
coflash 구조 및 에러 메시지..  (0) 2015.12.11
lm3s811 / lm31968 adc 사양비교  (0) 2015.11.17
ADC 샘플 시퀀서...  (0) 2015.11.17
axf to bin  (6) 2015.11.11
Posted by 구차니
embeded/Cortex-M3 Ti2015. 11. 17. 15:00

lm3s811

 Four analog input channels
■ Sample rate of 500 thousand samples/second


lm3s1968

Eight analog input channels
■ Sample rate of one million samples/second


샘플링 속도와 채널 차이?



+

SAR은 맞는듯?




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

coflash 구조 및 에러 메시지..  (0) 2015.12.11
ADCHardwareOversampleConfigure()  (0) 2015.11.17
ADC 샘플 시퀀서...  (0) 2015.11.17
axf to bin  (6) 2015.11.11
lm3s1607 / lm3s811 비교  (0) 2015.11.03
Posted by 구차니
embeded/Cortex-M3 Ti2015. 11. 17. 14:37

샘플 시퀀서 설정은.. 소스상으로는 간단한데

ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);

ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END);

ADCSequenceEnable(ADC0_BASE, 3); 


설정되는 레지스터는 참.. 여러개다 ㄷㄷ
Hardware Averager 
ADCSAC

FIFO Block
ADCSSFIFO0

Sample Sequencer
ADCSSMUX0
ADCSSCTL0
ADCSSFSTAT0

CTRL/STA
ADCACTSS
ADCOSTAT
ADCUSTAT
ADCSSPRI


---
ADCSequenceConfigure()는 ADC Event MUX를 설정하고
ADC_TRIGGER_PROCESSOR는 Controller(자기 자신?)을 지칭한다.
그러고 보니.. ADC0을 3번 샘플러에 연결하는 건가?


ADCSequenceStepConfigure()가 설정되는 부분으로
ADC_CTL_TS 설정시 내부 온도센서가 설정되며 adc 채널 설정은 무효화 된다(내부 센서 설정이 우선권을 가짐)


그러고 보니.. ADC_CTL_END는 3번 시퀀서에서는 기본으로 설정되는데..

FIFO 뎁스가 SS3은 1이라서 무조건 마지막 샘플만 가능한 걸지도..

그래서 예제는 간단한 SS3 시퀀서를 사용하는 것으로 추측된다.



아무튼 ADC_CTL_TS가 설정되지 않으면 ADC_CTL_CH0~ADC_CTL_CH15 값이

ADC Sample Sequence MUX에 설정이 된다.





음.. 데이터 시트 보면 adc 채널은 8개 인데 시퀀서는 4개(lm3s1968 기준)

그러면 실제로는 4개 채널만 동시 입력이 가능한걸려나?

아니면 시퀀서 설정을 통해 하나의 시퀀서에 FIFO를 통해 8개 채널을 한번에 받을수도 있는 걸려나?


811은 adc가 4채널이니.. 이렇게 2비트로 고르고..


1968은 8채널이라 3비트로 선택이 가능한데.. 흐음..


driverlib에서 ADCSSMUX를 건드리는 함수로는 이렇게만 존재

extern void 

ADCSequenceStepConfigure(unsigned long ulBase, unsigned long ulSequenceNum,

                         unsigned long ulStep, unsigned long ulConfig)


extern void 

ADCSoftwareOversampleStepConfigure(unsigned long ulBase,

                                   unsigned long ulSequenceNum,

                                   unsigned long ulStep,

                                   unsigned long ulConfig)


3. 시퀀서란?

시퀀서란 한마디로 말해서 입력 채널을 조작할 때 외부 회로의 도움 없이 채널의 순서등을 바꿀 수 있게 해주는 기능으로 개발자가 필요 채널을 설정 하거나 한 포인트에서 입력을 중복으로 받아 오거나 할 때 사용한다.



4. 시퀀서 응용

시퀀서의 레지스터 설정은 Data sheet의 레지스터를 보면 알 수 있으니 참고 하도록 하고 이번엔 시퀀서를 응용해서 노이즈를 줄이는 방법을 살펴본다.


[링크 : http://egloos.zum.com/circle5940/v/45303


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

ADCHardwareOversampleConfigure()  (0) 2015.11.17
lm3s811 / lm31968 adc 사양비교  (0) 2015.11.17
axf to bin  (6) 2015.11.11
lm3s1607 / lm3s811 비교  (0) 2015.11.03
bitband 고찰..  (0) 2015.10.23
Posted by 구차니