STM32 내부클럭 사용하기

[ST_MICRO]/STM32 | 2014/07/13 11:39
Posted by nexp

STM32 내부클럭 사용하기

보드 단가를 낮추기 위해서는 내부 오실레이터를 이용하면 좋은데 특히 STM32F100 시리즈는 저렴하기 때문에 보드 단가 측면에서 내부 오실레이터를 사용하는것이 유리하다. 


다만 디폴트가 PLL클럭의 1/2이다.


/* PLL entry clock source */

#define RCC_PLLSource_HSI_Div2           ((u32)0x00000000)

#define RCC_PLLSource_HSE_Div1           ((u32)0x00010000)

#define RCC_PLLSource_HSE_Div2           ((u32)0x00030000)



void RCC_Configuration(void)

{

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   

     

  /* 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);

 

    /* HCLK = SYSCLK */

    RCC_HCLKConfig(RCC_SYSCLK_Div1); 

  

    /* PCLK2 = HCLK */

    RCC_PCLK2Config(RCC_HCLK_Div1); 


    /* PCLK1 = HCLK/2 */

    RCC_PCLK1Config(RCC_HCLK_Div2);


    /* On STICE the PLL output clock is fixed to 72 MHz */

//    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6);    


    /* 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)

    {

    }


  }

}


저작자 표시 비영리 변경 금지

M052LBN EVM - ADC 테스트

Cortex-M/NUVOTON | 2014/07/09 14:01
Posted by nexp

M052LBN EVM - ADC 테스트




NUVOTON M051 시리즈 ADC는 최대 12비트해상도 이고 특이사항으로 5V까지 측정 가능하다.


- 입력레인지 : 0~5V

- 10bit 12bit, 해상도

- 8채널 싱글, 4채널 differenctial

- 760kSPS (16Mhz)




M052LBN ADC 블록도




M052LBN ADC 초기화 코드

void ADCInit( void)

{

    SYS_UnlockReg();

    /* Enable ADC module clock */

    CLK_EnableModuleClock(ADC_MODULE);

    /* ADC clock source is 22.1184MHz, set divider to 7, ADC clock is 22.1184/7 MHz */

    CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_CLKDIV_ADC(7));

    

 

    //ADC 포트 설정

    GPIO_DISABLE_DIGITAL_PATH(P1, BIT0);


    SYS->P1_MFP &= ~(SYS_MFP_P10_Msk);

    SYS->P1_MFP |= SYS_MFP_P10_AIN0;

    SYS_LockReg();

}



M052LBN ADC Read 코드

nsigned int ADCRead( unsigned int channelNum )

{

    ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_SINGLE_CYCLE, BIT0<<channelNum);


    /* Power on ADC module */

    ADC_POWER_ON(ADC);


    /* clear the A/D interrupt flag for safe */

    ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);


    /* start A/D conversion */

    ADC_START_CONV(ADC);


    /* Wait conversion done */

    while(!ADC_GET_INT_FLAG(ADC, ADC_ADF_INT));


    return ADC_GET_CONVERSION_DATA(ADC, channelNum);    

}



int main(void)

{

    _SystemInit();

    

    Led1Init();

    Led1On();


    Led2Init();

    Led2On();

    

    //Serial Init

    DebugInit(BAUD_115200);

    DebugPrint("NUVOTON ADC Test Program.\r\n");

    

    //ADC 초기화

    ADCInit();


    while(1)

    {

        DebugPrint("adc=%d\r\n", ADCRead(0));

        Led1Toggle();

        Delay(300);

    }

}


저작자 표시 비영리 변경 금지

M052LBN EVM - SPI 테스트

Cortex-M/NUVOTON | 2014/07/09 12:52
Posted by nexp

M052LBN EVM - SPI 테스트




M052LBN는 저렴한 MCU임에도 2채널의 SPI를 제공한다. FIFO있고 SPI속도도 빠르다.




M052LBN SPI 블록도



M052LBN SPI 초기화 함수

void SPI0_Init(void)

{

SYS_UnlockReg();    

     CLK_EnableModuleClock(SPI0_MODULE);

         

    /* Set multi function pin for SPI1 */

    //SYS->P0_MFP = SYS_MFP_P04_SPISS1 | SYS_MFP_P05_MOSI_1 | SYS_MFP_P06_MISO_1 | SYS_MFP_P07_SPICLK1;

     SYS->P1_MFP = SYS_MFP_P15_MOSI_0 | SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0;

    

    

        /* Select HXT as the clock source of SPI1 */

    CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);


    /* Enable SPI1 peripheral clock */

    CLK_EnableModuleClock(SPI0_MODULE);

    

    /* Lock protected registers */

    SYS_LockReg();

    

    

    /* Configure SPI1 as a master, MSB first, 8-bit transaction, SPI Mode-0 timing, clock is 6MHz */

    SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 8, 6000000);


    /* Enable the automatic hardware slave select function. Select the SS0 pin and configure as low-active. */

    SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);

}




SPI_CNTRL 레지스터





M052LBN SPI 송수신 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

    SPI_WRITE_TX0(SPI0, Data);

    /* Trigger SPI transfer */

    SPI_TRIGGER(SPI0);


    /* Check busy state */

    while(SPI_IS_BUSY(SPI0));


   return SPI_READ_RX0(SPI0);

}


저작자 표시 비영리 변경 금지

M052LBN EVM - UART테스트

Cortex-M/NUVOTON | 2014/07/06 23:00
Posted by nexp

M052LBN - UART테스트




M052LBN UART 특징

M0521은 2채널의 UART가 있다. 그리고 FIFO 있고.. RS485 9bit 모지원한다. 저렴한 MCU에서 지원은 좋은것 같다.


 - Separate receive / transmit 16/16 bytes entry FIFO for data payloads

 - hardware auto-flow control and flow control

 - Supports RS-485 9-bit mode

 - Supports hardware or software enable to program RTS pin to control RS-485 transmission direction directly



M052LBN UART 블록도




M052LBN UART 초기화 코드

void U0_Init(unsigned char baud)

{

    SYS_UnlockReg();    

    /* Enable UART module clock */

    CLK_EnableModuleClock(UART0_MODULE);


    /* Select UART module clock source */

    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));


    /* Set P3 multi-function pins for UART0 RXD and TXD */

    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);

    SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);


    /* Lock protected registers */

    SYS_LockReg(); 

    

    U0_SetBaud(baud);

}




M052LBN UART 송수신 함수

void U0_PutByte(unsigned char Data)

{

while((UART0->FSR & UART_FSR_TE_FLAG_Msk) == 0);

UART0->THR = Data;    

}


unsigned char U0_GetByte(void)

{

while(UART0->FSR & UART_FSR_RX_EMPTY_Msk); 

return UART0->RBR;

}




M052LBN RS485 기능 







저작자 표시 비영리 변경 금지

M052LBN EVM - NUVOTON MCU성능 측정

Cortex-M/NUVOTON | 2014/07/06 22:00
Posted by nexp

M052LBN EVM - NUVOTON MCU성능 측정



NUVOTON사의 저렴한 MCU M052LBN 는 최대 클럭 50Mhz로 동작한다. GPIO토글을 이용하여 MCU성능 측정을 해 보았다.



3.2Mhz

#define Led1Toggle() P26 ^= 1


     15              while(1)

     16              {

     17                  Led1Toggle();

   \                     ??main_1: (+1)

   \   00000026   0x6821             LDR      R1,[R4, #+0]

   \   00000028   0x4041             EORS     R1,R1,R0

   \   0000002A   0x6021             STR      R1,[R4, #+0]

   \   0000002C   0xE7FB             B        ??main_1

   \   0000002E   0xBF00             Nop      

   \                     ??main_0:

   \   00000030   0x50004080         DC32     0x50004080

   \   00000034   0x50004258         DC32     0x50004258

     19              }




GPIO On/Off 시 7.2Mhz까지 출력 되는것이 확인된다.

#define Led1Off() P26 = 1

#define Led1On() P26 = 0


     15              while(1)

     16              {

     17                  Led1On();

   \                     ??main_1: (+1)

   \   00000026   0x6025             STR      R5,[R4, #+0]

     18                  Led1Off();

   \   00000028   0x6020             STR      R0,[R4, #+0]

   \   0000002A   0xE7FC             B        ??main_1

   \                     ??main_0:

   \   0000002C   0x50004080         DC32     0x50004080

   \   00000030   0x50004258         DC32     0x50004258

     21              }


1$ 이하 MCU에서 이정도 성는이면 포트도 여유롭고 나쁘지 않다.

 

저작자 표시 비영리 변경 금지

블로그 이미지

nexp

카테고리

분류 전체보기 (1433)
[MyProject] (32)
[TI] (63)
[NXP] (36)
[ST_MICRO] (86)
[FreeScale] (30)
[MSP430] (116)
[Microchip] (121)
Cortex-M (35)
[AnalogDevice] (22)
ARM9 (24)
[ARM7] (47)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (48)
[INTERFACE] (206)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (121)
[SENSOR] (40)
[DATA] (21)
[FPGA/PLD] (29)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)

티스토리 툴바