embeded/Cortex-M4 Ti2018. 1. 4. 14:35

일단.. 사용중인 보드가 UART0가 아닌 UART1을 외부용으로 쓰고 있어서 손을 봐야 했는데

bl_config.h 에서 얘가 원본이고

#define UART_ENABLE_UPDATE

#define UART_AUTOBAUD

//#define UART_FIXED_BAUDRATE     115200

#define UART_CLOCK_ENABLE         SYSCTL_RCGCUART_R0

#define UARTx_BASE                UART0_BASE

#define UART_RXPIN_CLOCK_ENABLE   SYSCTL_RCGCGPIO_R0

#define UART_RXPIN_BASE         GPIO_PORTA_BASE

#define UART_RXPIN_PCTL         0x1

#define UART_RXPIN_POS          0

#define UART_TXPIN_CLOCK_ENABLE SYSCTL_RCGCGPIO_R0

#define UART_TXPIN_BASE         GPIO_PORTA_BASE

#define UART_TXPIN_PCTL         0x1

#define UART_TXPIN_POS          1


UART1을 쓰려고 한다면 요렇게 6개를 손을 봐주어야 한다.

#define UART_ENABLE_UPDATE

//#define UART_AUTOBAUD

#define UART_FIXED_BAUDRATE     38400

#define UART_CLOCK_ENABLE         SYSCTL_RCGCUART_R1

#define UARTx_BASE                UART1_BASE

#define UART_RXPIN_CLOCK_ENABLE   SYSCTL_RCGCGPIO_R1

#define UART_RXPIN_BASE         GPIO_PORTB_BASE

#define UART_RXPIN_PCTL         0x1

#define UART_RXPIN_POS          0

#define UART_TXPIN_CLOCK_ENABLE SYSCTL_RCGCGPIO_R1

#define UART_TXPIN_BASE         GPIO_PORTB_BASE

#define UART_TXPIN_PCTL         0x1

#define UART_TXPIN_POS          1


그리고 PORTB의 2번 핀이 485 TXEN으로 했는데

좀 더 테스트를 해봐야겠지만, 38400 에서는 문제없이 PC와 1m 이내 선으로 연결해서는 문제없이 업데이트 된다.

(57600 까지는 성공적인듯.. 115k는 줄여줘도 안되네.. rs485 특성으로 보임)

(Autobaud는 작동을 못하네.. rs485 특성일려나?)

void

UARTSend(const uint8_t *pui8Data, uint32_t ui32Size)

{

    //

    // Transmit the number of bytes requested on the UART port.

    //

    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_PIN_2);

    Delay(10);

    while(ui32Size--)

    {

        //

        // Make sure that the transmit FIFO is not full.

        //

        while((HWREG(UARTx_BASE + UART_O_FR) & UART_FR_TXFF))

        {

        }


        //

        // Send out the next byte.

        //

        HWREG(UARTx_BASE + UART_O_DR) = *pui8Data++;

    }


    //

    // Wait until the UART is done transmitting.

    //

    UARTFlush();

    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_2, 0);

    Delay(10);


LM Flash 에서는 UART로 하고 귀차니즘으로 인해(...)

Autobaud 대신 38400 으로 고정을 했는데


Program탭에서 Program Address Offset만 0x00001000 으로 바꾸어 주면 된다.

LR_IROM 0x00001000 0x00040000

{

    ER_IROM 0x00001000 0x00040000

    {

        *.o (RESET, +First)

        * (InRoot$$Sections, +RO)

    }


    RW_IRAM 0x20000000 0x00008000

    {

        ;* (vtable, +First)

        * (+RW, +ZI)

    }


(물론 해당 바이너리는 sct 파일에서 0x00000000을 0x00001000 으로 바꾸고 다시 컴파일 해야 한다)


coocox 라는 녀석을 사용중인데 이녀석은 0x1000이 아니라 0x1 섹터로 옵셋을 잡아주니 잘 쓴다.

옆에 써있듯 4번 섹터가 0x00001000 이니 offset을 0x04로 해주면 될것으로 보인다.

[링크 : http://www.coocox.org/book/coocox/CoFlash/GUI-Mode]

+

38400은 delay 없이도 일단 작동

57600은 delay(10) 있어야 작동


+

머지.. 부트로더 올리고 시리얼로 올린다음은 되는데 그 이후에는 안켜진다 -ㅁ-?

Posted by 구차니