MCU & PLC

MCU(TM4C) ROM에 데이터 기억하기 (feat UARTprintf 사용하기)

sheepone 2021. 5. 31. 14:06
반응형
매번 시리얼 통신으로 셋업치를 날려주기에는 번거로우며 오류의 소지가 있어 롬에 기록하여 전 셋팅치를 기록하기 위해 사용

 

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "drivers/pinout.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"

//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
    while(1);
}
#endif

//ROM SAVE STRUCT E2PROM
struct E2PROM
{
    uint8_t  value1;
    uint8_t  value2;
    uint16_t value3;
    uint8_t  value4[12];
};

struct E2PROM e2prom_write_value = {5,7,9826, "Hello World"}; /* Write struct */
struct E2PROM e2prom_read_value  = {0,0,0,""}; /* Read struct */

uint32_t Write(void){
    uint32_t result = EEPROMProgram(&e2prom_write_value,0x0000,sizeof(e2prom_write_value));
    return result;
}

void Read(void){
    EEPROMRead(&e2prom_read_value, 0x0000, sizeof(e2prom_read_value));
}


//*****************************************************************************
//
// System clock rate in Hz.
//
//*****************************************************************************
uint32_t g_ui32SysClock;

void
ConfigureUART(void)
{
    //
    // Enable the GPIO Peripheral used by the UART.
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    //
    // Enable UART0
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    //
    // Configure GPIO Pins for UART mode.
    //
    ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
    ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    //
    // Initialize the UART for console I/O.
    //
    UARTStdioConfig(0, 115200, g_ui32SysClock);
}

int
main(void)
{
    //
    // Run from the PLL at 120 MHz.
    //
    g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
                SYSCTL_CFG_VCO_480), 120000000);
    //
    // Initialize the UART.
    //
    ConfigureUART();

    //EEPROMInit
    SysCtlPeripheralEnable(SYSCTL_PERIPH_EEPROM0); // EEPROM activate
    EEPROMInit(); // EEPROM start

    Read();

    UARTprintf("First Read value 1 = %d \r\n", e2prom_read_value.value1);
    UARTprintf("First Read value 2 = %d \r\n", e2prom_read_value.value2);
    UARTprintf("First Read value 3 = %d \r\n", e2prom_read_value.value3);
    UARTprintf("First Read value 4 = %s \r\n", e2prom_read_value.value4);
    //수정
    e2prom_write_value.value1 = 1 ;
    e2prom_write_value.value2 = 2 ;
    e2prom_write_value.value3 = 3 ;
    uint8_t value[12] = "bitcoin 35k" ;

    memcpy(e2prom_write_value.value4, value, sizeof(value));

    Write();

    Read();

    UARTprintf("Second Read value 1 = %d \r\n", e2prom_read_value.value1);
    UARTprintf("Second Read value 2 = %d \r\n", e2prom_read_value.value2);
    UARTprintf("Second Read value 3 = %d \r\n", e2prom_read_value.value3);
    UARTprintf("Second Read value 4 = %s \r\n", e2prom_read_value.value4);

}

 

저장할 값들을 E2PROM에 선언해 놓고 해당 값을 저장 및 읽어온다.

 

UARTprintf

이전 값에서 3 , 2 , 1 , bitcoin 36k (ROM에 기록이 잘되는거 확인)
변경된 값에서 1 , 2 , 3 , bitcoin 35k (변경된 값이 잘 기록되는지 확인)

 

이외에 터미널을 사용하여 UARTprintf를 사용하는 방법

 

USB를 연결하면 가상 시리얼 포트가 생기는데 해당 포트를 이용한다.
현재는 COM7번 (Stellaris Virtual Serial Port(COM7))

 

View-Terminal

 

View에서 Terminal 클릭 이후 Open a Terminal

 

Open a Terminal

Serial Terminal 선택 - 위 장치관리자의 COM포트를 입력 - OK

 

blinky.7z
0.06MB

반응형