embeded/Cortex-M4 Ti2016. 11. 23. 17:08

원인 불명(?)으로

trim 값이 0x7FFF가 기본값인데

0x0114정도 들어있어서

어느 순간인가 갑자기 1초 더해지는게 아닌 2초가 더해지는 현상을 발견 -_-


결론은.. 이걸 어떻게 구워삶냐 인가..

일단 

  if(HibernateIsActive())

{

HibernateRTCTrimSet(0x7FFF);

}

식으로 되어 있어야 trim이 설정되는거 같은데 끄응... 머리 아프네

어떤 조건에서 설정이 되는지 알수가 없다보니..


+

일단은.. hibernate가 on 되어야 설정이 되는데

그렇다면.. 설정이 안된채로 넘어간적도 있다는 건가? 싶은데.. 머지?


데이터 시트 상으로는, 64초 마다 더하거나 뺸다고

그런 이유로 보고 있으면 갑자기 시간이 2초가 간다거나 하는 식으로 드러난다.

(물론 0x7FFF 보다 적을 경우는 빠르게 가고 0x7FFF < x < 0x10000 일 경우에는 느리게가는 듯?)


+

lm3s1607의 hibernate예제

클럭 초기화가 두번이네.. 일단은 이렇게 해주니 문제없이 rtc가 가동되는 듯..

     //

    // Enable the Hibernation module.

    //

    SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);


    //

    // Per an erratum, sometimes on wake the Hibernation module control

    // register will be cleared when it should not be.  As a workaround a

    // location in the non-volatile data area can be read instead.  This data

    // area is cleared to 0 on reset, so if the first location is non-zero then

    // the Hibernation module is in use.  In this case, re-enable the

    // Hibernation module which will ensure that the control register bits have

    // the proper value.

    //

    HibernateDataGet(&ulHibernateCount, 1);

    if(ulHibernateCount)

    {

        HibernateEnableExpClk(SysCtlClockGet());

        HibernateClockSelect(HIBERNATE_CLOCK_SEL_DIV128);

    }


    //

    // Check to see if Hibernation module is already active, which could mean

    // that the processor is waking from a hibernation.

    //

    if(HibernateIsActive())

    {

        //

        // Read the status bits to see what caused the wake.

        //

        ulStatus = HibernateIntStatus(0);

    }


    //

    // Enable the Hibernation module.  This should always be called, even if

    // the module was already enabled, because this function also initializes

    // some timing parameters.

    //

    HibernateEnableExpClk(SysCtlClockGet());


    //

    // If the wake was not due to button or RTC match, then it was a reset.

    //

    if(!(ulStatus & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0)))

    {

        //

        // Configure the module clock source.

        //

        HibernateClockSelect(HIBERNATE_CLOCK_SEL_DIV128);


        //

        // Finish the wake cause message.

        //

        RIT128x96x4StringDraw("RESET", COL(7), ROW(4), 15);


        //

        // Wait a couple of seconds in case we need to break in with the

        // debugger.

        //

        SysTickWait(3 * 100);


        //

        // Allow time for the crystal to power up.  This line is separated from

        // the above to make it clear this is still needed, even if the above

        // delay is removed.

        //

        SysTickWait(15);

    }


    //


Posted by 구차니
embeded/Cortex-M4 Ti2016. 11. 2. 19:19

32.768kHz를 달았는데

10분에 10초 빨라짐..

도대체 머가 문제일까...


//*****************************************************************************

//

// Macros defining oscillator configuration options for the

// HibernateClockConfig() function.

//

//*****************************************************************************

#define HIBERNATE_OSC_LFIOSC    0x00080000

#define HIBERNATE_OSC_LOWDRIVE  0x00000000

#define HIBERNATE_OSC_HIGHDRIVE 0x00020000

#define HIBERNATE_OSC_DISABLE   0x00010000

#define HIBERNATE_OUT_WRSTALL   0x20000000

#define HIBERNATE_OUT_SYSCLK    0x00000001

#define HIBERNATE_OUT_ALT1CLK   0x00000002 


드라이버 상에서

LOWDRIVER / HIGHDRIVER는 12pF / 24pF 관련설정이고 기본은 12pF(LOW)

OSC_DISABLE은 아래의 OSCBYP 쪽인데.. 설정을 하던 안하던 동일하다..

설정문제일까.. 클럭문제일까..


일단 32.7인데 33k 정도 잡히는거 봐서 빠른게 당연한건가 싶기도 하고

오실로스코프 한계일지도 모르지만 클럭이 날뛰면서 60k로도 잡히고 1M급으로도 날뛰어서

머가 문제인지... ㅠㅠ



+

RTC trim으로 조절하라는데 끄응...

[링크 : https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/257944]


어떻게 보면.. 0x7FFF는 32,767이고 

32.768kHz 에서 카운터로 사용하는 녀석이라 빠른 만큼 조절해주면

1초를 맞출수는 있는데.. 그래도 어느정도는 하드웨어로 맞추는게 낫지 않으려나...


extern void HibernateRTCTrimSet(uint32_t ui32Trim); 




계산을 해보니 1분 = 60초에 1초가 더 빨라지는 식이니

32768hz * 60 = 1분

32768/60 = 546.1333 이니

대충.. 32222 = 0x7DDE로 trim을 설정하면 시간이 맞아 지려나?

미네랄 여전히 똑같이 빠르네 -_-

(2분 확인)


미친척 더해보자? ㅋㅋ

0x8222


---

0xFFFE 로 했는데도 속도에 차이가 없는걸 보면 다른 설정을 건드려야

trim이 적용 되는 걸..지도?

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

tm4c 하이버네이트 소스...  (0) 2016.12.20
tm4c rtc trim...  (0) 2016.11.23
tm4c hibernate module 초기화 관련..  (0) 2016.11.01
32.768kHz 크리스탈과 1Mohm 저항 유무에 따른 파형 차이  (0) 2016.10.28
tm4c FIFO 길이  (0) 2016.10.26
Posted by 구차니
embeded/Cortex-M4 Ti2016. 11. 1. 11:04

예전에는 다른거(timer라던가 uart라던가) 초기화 다 하고

hibernate 모듈을 해주어도 부팅이 문제가 없었는데

tm4c 되면서 그런가.. 안켜짐!


아무튼 초기화 루틴중 hibernate 쪽을 가장 앞으로 놓고

SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);

if(HibernateIsActive())

{

    HibernateIntClear(HibernateIntStatus(0));

return;


이렇게 처리해주니 일단 부팅은 정상적으로 잘 진행된다.

(몇번 껏다 켜야 겨우 부팅이 되었음)

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

tm4c rtc trim...  (0) 2016.11.23
tm4c rtc 빨라...  (0) 2016.11.02
32.768kHz 크리스탈과 1Mohm 저항 유무에 따른 파형 차이  (0) 2016.10.28
tm4c FIFO 길이  (0) 2016.10.26
tm4c hibernate module oscillator 관련  (0) 2016.10.26
Posted by 구차니
embeded/Cortex-M4 Ti2016. 10. 28. 09:23

4.19MHz에서는 1Mohm 문제 없었는데

32.768kHz에서는 아래와 같이 파형이 완전 차이가 난다.


흰색(ref)가 32.768k + 1Mohm

노란색이 32.768k + 저항없음



결론 : lm3s1607 -> tm4c123 마이그레이션 중 hibernate module 클럭에서 저항은 빠져야 함


+

lm3s1607 데이터 시트상 회로

X1에 평행하게 RL이 존재하는데 저항 용량은 알아서?


tm4c1231e6pm 데이터 시트상 회로

X1에 평행한 RL이 사라졌다.

LM3S devices support a 4.194304-MHz crystal. This crystal is not supported for TM4C devices,
however a 32.768-kHz crystal is supported. In addition, an external load resistor is not required
  

[원본 : spma049a.pdf]

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

tm4c rtc 빨라...  (0) 2016.11.02
tm4c hibernate module 초기화 관련..  (0) 2016.11.01
tm4c FIFO 길이  (0) 2016.10.26
tm4c hibernate module oscillator 관련  (0) 2016.10.26
tm4c 비교표  (0) 2016.10.26
Posted by 구차니
embeded/Cortex-M4 Ti2016. 10. 26. 18:10

기본값은

RX 0x02

TX 0x10


라이브러리에서 확인하면

#define UART_FIFO_TX4_8         0x00000002  // Transmit interrupt at 1/2 Full

#define UART_FIFO_RX4_8         0x00000010  // Receive interrupt at 1/2 Full


1/2이 차면 한번씩 인터럽트를 발생시키게 되어 있다.

Posted by 구차니
embeded/Cortex-M4 Ti2016. 10. 26. 17:17




main clk

0~2.6V


hibernate clk

0.5~1.2v


문제 없어야 하는거 아닌가?

~HIB도 계속 high도 도대체 머가 문제지.. ㅠㅠ


+


[링크 : http://www.ti.com/lit/an/spma065/spma065.pdf]


the problem is resolved. the 1Mresistor is just the problem. thanks very much! regarding this problem, your answer is the best answer i have see in this forum.

[링크 : https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/385581]


+

아마도.. lm3s1607에서 4.1MHz 클럭을 쓰면서 1Mohm 저항을 달아서 섰는데

그걸 그대로 사용해서 그런걸지도?


+

2016.11.01

1M 저항 달아서 발진이 억눌리면서 안된 문제였음 -_-

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

32.768kHz 크리스탈과 1Mohm 저항 유무에 따른 파형 차이  (0) 2016.10.28
tm4c FIFO 길이  (0) 2016.10.26
tm4c 비교표  (0) 2016.10.26
tm4c HibernateEnableExpClk() 차이점  (0) 2016.10.22
tm4c ..어라? hibernate...  (0) 2016.10.20
Posted by 구차니
embeded/Cortex-M4 Ti2016. 10. 26. 14:29

희한하네..


암튼 ek-tm4c123 쪽 보다는 

dk-tm4c123 쪽이 더 비싸고 좋고(어?)

예제도 많은듯

[링크 : https://github.com/yuvadm/tiva-c/tree/master/boards/dk-tm4c123g]

[링크 : https://github.com/yuvadm/tiva-c]




[링크 : http://www.ti.com/lit/sg/spmt285d/spmt285d.pdf]

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

tm4c FIFO 길이  (0) 2016.10.26
tm4c hibernate module oscillator 관련  (0) 2016.10.26
tm4c HibernateEnableExpClk() 차이점  (0) 2016.10.22
tm4c ..어라? hibernate...  (0) 2016.10.20
tm4c123 rtc hibernate module  (0) 2016.09.28
Posted by 구차니
embeded/Cortex-M4 Ti2016. 10. 22. 14:27

음.. lm3s랑 tm4c driverlib을 보다 보니..


tm4c

static void

_HibernateWriteComplete(void)

{

    //

    // Spin until the write complete bit is set.

    //

    while(!(HWREG(HIB_CTL) & HIB_CTL_WRC))

    {

    }

}


void

HibernateEnableExpClk(uint32_t ui32HibClk)

{

    //

    // Turn on the clock enable bit.

    //

    HWREG(HIB_CTL) |= HIB_CTL_CLK32EN;


    //

    // Wait for write complete following register load (above).

    //

    _HibernateWriteComplete();


코드 분위기를 보아하니.. HibernateEnableExpClk()는 쓰지 말고, 얘를 쓰면 될 듯?

void

HibernateClockConfig(uint32_t ui32Config)

{

    uint32_t ui32HIBCtl;


    ASSERT((ui32Config & ~(HIBERNATE_OSC_HIGHDRIVE | HIBERNATE_OSC_LOWDRIVE |

                           HIBERNATE_OSC_DISABLE)) == 0);


    ui32HIBCtl = HWREG(HIB_CTL);


    //

    // Clear the current configuration bits.

    //

    ui32HIBCtl &= ~(HIBERNATE_OSC_HIGHDRIVE | HIBERNATE_OSC_LOWDRIVE |

                    HIBERNATE_OSC_LFIOSC | HIBERNATE_OSC_DISABLE);


    //

    // Set the new configuration bits.

    //

    ui32HIBCtl |= ui32Config & (HIBERNATE_OSC_HIGHDRIVE |

                                HIBERNATE_OSC_LOWDRIVE |

                                HIBERNATE_OSC_LFIOSC |

                                HIBERNATE_OSC_DISABLE);


    //

    // Must be sure that the 32KHz clock is enabled if the hibernate is about

    // to switch to it.

    //

    if(ui32Config & HIBERNATE_OSC_LFIOSC)

    {

        ui32HIBCtl |= HIB_CTL_CLK32EN;

    }


    //

    // Set the hibernation clocking configuration.

    //

    HWREG(HIB_CTL) = ui32HIBCtl;


    //

    // Wait for write completion

    //

    _HibernateWriteComplete();


    //

    // Write the output clock configuration for devices that support

    // controlling the output clocks from the hibernate module.

    //

    if(HIBERNATE_CLOCK_OUTPUT)

    {

        HWREG(HIB_CC) = ui32Config & (HIBERNATE_OUT_SYSCLK |

                                      HIBERNATE_OUT_ALT1CLK);

    }


lm3s

void

HibernateEnableExpClk(unsigned long ulHibClk)

{

    //

    // Turn on the clock enable bit.

    //

    HWREG(HIB_CTL) |= HIB_CTL_CLK32EN;


    //

    // For Fury-class devices, compute the number of delay loops that must be

    // used to achieve the desired delay for writes to the hibernation

    // registers.  This value will be used in calls to SysCtlDelay().

    //

    if(CLASS_IS_FURY)

    {

        g_ulWriteDelay = (((ulHibClk / 1000) * DELAY_USECS) /

                          (1000L * LOOP_CYCLES));

        g_ulWriteDelay++;

    }

}


tm4c 레지스터

WRC는 WR Complete 확인용인데 여기서 벗어나질 못하네



CLK32EN은.. tm4c 되면서 클럭이 무조건 32k로 바뀌었으니..



+

크리스탈이 발진 안하면 루프를 못 빠져 나오나?


The only time that I know of if the code loops like this is if the 32768Hz clock is not getting started. if this is a custom board can you make sure that the 32768Hz crystal is well mounted/soldered?

[링크 : https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/393107]

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

tm4c hibernate module oscillator 관련  (0) 2016.10.26
tm4c 비교표  (0) 2016.10.26
tm4c ..어라? hibernate...  (0) 2016.10.20
tm4c123 rtc hibernate module  (0) 2016.09.28
tm4c uart fifo/buffer 문제  (0) 2016.09.28
Posted by 구차니
embeded/Cortex-M4 Ti2016. 10. 20. 22:22

driverlib 데이터시트..


HIBRTCSS가 헤더에 없다 -ㅁ-?

이걸 써야 hibernate module rtc counter mode를 쓸수 있는데?!?!





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

tm4c 비교표  (0) 2016.10.26
tm4c HibernateEnableExpClk() 차이점  (0) 2016.10.22
tm4c123 rtc hibernate module  (0) 2016.09.28
tm4c uart fifo/buffer 문제  (0) 2016.09.28
lm3s tm4c 시스템 클럭 차이점  (0) 2016.09.24
Posted by 구차니
embeded/Cortex-M4 Ti2016. 9. 28. 20:54



[링크 : http://stackoverflow.com/questions/31887470/get-the-timestamp-from-microcontroller-tm4c123-in-c]

[링크 : http://forum.43oh.com/topic/7533-tm4c129-hibernation-rtc-and-calendar-mode/]


tm4c123x 에서 tm4c129x로 가야 할지도 모르겠네 -_-

[링크 : http://www.deyisupport.com/.../an01296-Differences-Between-TM4C123x-and-TM4C129x-MCUs.pdf]

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

tm4c HibernateEnableExpClk() 차이점  (0) 2016.10.22
tm4c ..어라? hibernate...  (0) 2016.10.20
tm4c uart fifo/buffer 문제  (0) 2016.09.28
lm3s tm4c 시스템 클럭 차이점  (0) 2016.09.24
ek-tm4c123gxl launchpad 클럭  (0) 2016.09.24
Posted by 구차니