[ST_MICRO]/STM322011. 3. 17. 21:16

STM32 Infomation block 내부 EEPROM처럼 사용하기

STM32 Infomation block EEPROM처럼 사용하기

STM32는 AVR과 달리 내부 EEPROM이 없다. 대신 내부 플래시를 EEPROM처럼 쓸 수 있다고 한다.
제작한 보드에 ID를 부여해 인식하려고 하는데.. 데이트시트를 보면 내부 영역중 Information block 이 있다.
이부분은 ST에서 제공하는 플래시 프로그램으로 제어 가능하기 때문에 PC 소프웨어 부담없이 가능할것 같다.
Option Byte 영역을 수정하여 ID를 부여해 보도록 하겠다.



Flash Loder에서 Edit Option Byte를 선택하여 수정할 수 있다.



Option Byte에서 Byte for user data storage 부분을 FF에서 EC로 변경하고 저장한다.



이제 펌웨어에서 이부분을 읽어서 ID를 처리하면 쉽게 해결된다.

#define StartAddr  ((uint32_t)0x1FFFF800)

unsigned long  Address = 0x00;

Address = StartAddr;

 for(i=0;i<16;i++)
    {
        DebugPrint("%02X: %X\r\n", i, *(vu32*)Address);
        Address += 4;
    }


STM32 User Data Read 프로그램 실행 결과
변경한 데이터 EC를 플래시 영역에서 확인 할 수 있다.
00: FF5AA5
01: FF13EC
02: FF00FF
03: FF00FF
04: FFFFFFFF
05: FFFFFFFF
06: FFFFFFFF
07: FFFFFFFF
08: FFFFFFFF
09: FFFFFFFF
0A: FFFFFFFF
0B: FFFFFFFF
0C: FFFFFFFF
0D: FFFFFFFF
0E: FFFFFFFF
0F: FFFFFFFF
Posted by nexp

댓글을 달아 주세요

  1. crecento

    관리자의 승인을 기다리고 있는 댓글입니다

    2011.06.01 10:14 [ ADDR : EDIT/ DEL : REPLY ]

[ST_MICRO]/STM322011. 1. 20. 18:04

STM32 SPI Slave Mode 테스트

STM32 SPI Slave Mode 테스트
SPI Slave통신에 시간을 많이 까먹었는데... 아무튼 아래와 같이 해결 했다.
Master로 부터 데이터 수신클럭 받고 SPI_I2S_ReceiveData()로 데이터를 받아주어야 했는데... 이부분을 생각 못해서 데이터가 이상하게 출력되었다.
 
  //SPI Master로 부터 클럭이 들어오면 데이터 받고
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
  temp = SPI_I2S_ReceiveData(SPI2);
  //DebugPrint("SPI2 RX:%02X\r\n", temp);
  
  //원하는 데이터를 보낸다.
  //Send SPI2 data
  SPI_I2S_SendData(SPI2, cnt++);
  //DebugPrint("DataOut2\r\n");
 
 
Master에서는 그냥
    temp = SPI0_WriteReadByte(0x00);
    DebugPrint("Encoder=%02x\r\n", temp);
 
이렇게 하면 데이터 읽어 올 수 있다.
Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM322010. 2. 23. 16:17

SysTick 인터럽트 사용 하기

SysTick 인터럽트 사용 하기
Cortex-M3코어 내부에 SYSTICK 타이머가 NVIC에 직접되어 있으며 우선순위도 높고 다른칩간에 호환성에도 유리하다. 24비트 타이머 이고 클럭소스는 칩마다 조금씩 다르다고 한다.

STM32의 SysTick 타이머는 ST에서 제공하는 API로 간단히 몇개 함수를 이용해 초기화 가능하다.

void SysTimerInit(void)
{
 //SysTick end of count event each 1ms with input clock equal to 9MHz (HCLK/8, default)
 //SysTick_SetReload(9000);    //1ms
 SysTick_SetReload(36);  //4us
  
 NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 0, 0);
 
 //Enable SysTick interrupt
 SysTick_ITConfig(ENABLE); 

 //Enable the SysTick Counter
 SysTick_CounterCmd(SysTick_Counter_Enable);
}


//SyTick 타이머 인터럽트 핸들러
void SysTickHandler(void)
{
      Led1Toggle(); 
}




STM32F100 (24MHZ)에서 1ms 는?
    SysTick_SetReload(1000);    //1ms
로 설정하면 된다.


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM322008. 12. 20. 10:00

[STM32-64 EVM] ST Cortex-M3 GPIO속도 테스트

[STM32-EVM] ST Cortex-M3 GPIO속도 테스트

사용자 삽입 이미지


RCC_Configuration() 함수에서 PLL을 기본(9, 8Mhz x 9 = 72Mhz)으로 설정후 GPIO토글링
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
GPIO토글 주기 ->152ns, 3.27Mhz

비트 제어 레지스터로 설정했을때 ->  12Mhz가 나온다.

[다른 MCU속도 측정 결과] 에 비교하면 플래시에서 실행 하고도 상당히 빠른편이다.

플래시 Latency를 1로 줄이면 75ns까지 가능하다.
-> FLASH_SetLatency(FLASH_Latency_1);   


테스트 프로그램
#define PORTA       GPIOA->ODR

int main(void)
{
    //System Init
    SystemInit();

    //LED Init
    Led1Init();
    Led1On();
    Led2Init();   
 
 while (1)
 {
     PORTA ^= BIT15;
 }
}

     28           while (1)
     29           {
     30            PORTA ^= BIT15;
   \   0000003C   C868               LDR      R0,[R1, #+12]
   \   0000003E   80F40040           EOR      R0,R0,#0x8000
   \   00000042   FAE7               B.N      ??main_1
   \                     ??main_0:
   \   00000044   00043000           DC32     0x300400
   \   00000048   ........           DC32     GPIO_InitStructure
   \   0000004C   00080140           DC32     0x40010800
     31           }



비트 토글 했을때 -> 3.27Mhz


 while (1)
 {
  PORTA |= BIT15;
  PORTA &= ~BIT15;  
 }

 

     28           while (1)
     29           {
     30            PORTA |= BIT15;
   \   0000003C   D168               LDR      R1,[R2, #+12]
   \   0000003E   41F40041           ORR      R1,R1,#0x8000
   \   00000042   D160               STR      R1,[R2, #+12]
     31            PORTA &= ~BIT15;  
   \   00000044   D168               LDR      R1,[R2, #+12]
   \   00000046   0140               ANDS     R1,R0,R1
   \   00000048   F7E7               B.N      ??main_1
   \   0000004A   00BF               Nop     
   \                     ??main_0:
   \   0000004C   00043000           DC32     0x300400
   \   00000050   ........           DC32     GPIO_InitStructure
   \   00000054   00080140           DC32     0x40010800
     32           }



Cortex-M3에서 장점이라 내세우는 비트 제어 방식으로 해 보니 12Mhz가 나온다.


 while (1)
 {
  GPIOA->BSRR = BIT0;
  GPIOA->BRR = BIT0;
 }

ASM코드: STR 두개와 BN명령어만 들어가고 있다.


     28           while (1)
     29           {
     30            GPIOA->BSRR = BIT0;
   \                     ??main_1:
   \   00000040   0161               STR      R1,[R0, #+16]
     31            GPIOA->BRR = BIT0;
   \   00000042   4161               STR      R1,[R0, #+20]
   \   00000044   FCE7               B.N      ??main_1
   \   00000046   00BF               Nop     
   \                     ??main_0:
   \   00000048   00043000           DC32     0x300400
   \   0000004C   ........           DC32     GPIO_InitStructure
   \   00000050   00080140           DC32     0x40010800
     32           }


결론적으로 STM32의 순수 GPIO On/Off  타임은 28ns 로 측정된다.

 

 



참고로 오버클럭킹 해봤다.
PLL을 기본(9, 8Mhz x 16 = 128Mhz)으로 설정후 GPIO토글링
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);
GPIO 토글 주기 -> 85ns, 5.8Mhz

void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
//    FLASH_SetLatency(FLASH_Latency_1);   

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/4 */
    RCC_PCLK1Config(RCC_HCLK_Div4);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while (RCC_GetSYSCLKSource() != 0x08)
    {}
  } 
}


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM322008. 4. 29. 12:26

[ STM32 ] Timer 테스트 - 1초 만들기

[ STM32 ] Timer 테스트 - 1초 만들기
 
타이머 인터럽트로 1ms만든 후 1초를 만들어 보자
STM32는 16비트 타이머를 가지고 있고 ... 정리를 위해 코드를 작성

//----------------------------------------------------------------------------- 
// Timer2 Interrupt Handler

void Timer2IntrHandler(void)
{
 Led1Toggle();
 Timer2_Counter++;
// SetTimer2(value);
}
//-----------------------------------------------------------------------------
 
//-----------------------------------------------------------------------------
//Timer2 Init

void Timer2Init(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 /* TIM2 clock enable */
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
 /* Enable the TIM2 gloabal Interrupt */
 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure); 
 
  /* ---------------------------------------------------------------
    TIM2 Configuration: Output Compare Timing Mode:
    TIM2CLK = 36 MHz, Prescaler = 4, TIM2 counter clock = 7.2 MHz
    CC1 update rate = TIM2 counter clock / CCR1_Val = 146.48 Hz
    CC2 update rate = TIM2 counter clock / CCR2_Val = 219.7 Hz
    CC3 update rate = TIM2 counter clock / CCR3_Val = 439.4 Hz
    CC4 update rate = TIM2 counter clock / CCR4_Val =  878.9 Hz
  --------------------------------------------------------------- */
 
 /* Time base configuration */
 TIM_TimeBaseStructure.TIM_Period = 7200;
 TIM_TimeBaseStructure.TIM_Prescaler = 0;
 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
 
 /* Prescaler configuration */
 TIM_PrescalerConfig(TIM2, 4, TIM_PSCReloadMode_Immediate);
 
 /* TIM IT enable */
 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
 
 /* TIM2 enable counter */
 TIM_Cmd(TIM2, ENABLE); 
}
//-----------------------------------------------------------------------------

간단히 만든 MCU 타이머 계산기로 계산 한 결과
    TIM2CLK = 36 MHz, Prescaler = 4, TIM2 counter clock = 7.2 MHz

 



main에서 1초마다 LED 점등..
 
 if(Timer2_Counter>1000)
 {
  Led2Toggle();
  Timer2_Counter = 0;
 }
 
STM32 1Hz Test

Posted by nexp

댓글을 달아 주세요