ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (STM32 무작정 LED켜기 1) AHB와 APB
    Cortex-M3/STM32F103 2010. 5. 12. 19:38

    STM32F103 Datasheet의 내용이다.
    아래 그림을 보면 여러종류의 BUS가 있는데 그중 GPIO, USART등의 주변장치를 이어주는 BUS이다.


    AHB는 두개의 APB(APB1, APB2)를 연결해주고 
    APB1은 최고 36MHz
    APB2는 최고 72MHz로 동작한단다.
    'GPIO, USART1, SPI1, ADC1 등 APB2에 속한놈들이 더빨리 동작하겠군..'
    'datasheet의 memory map을 보면 AHB에도 뭔가가 있다.'


    우선 LED를 제어해보기 위해.. 
    'LED는 외부 회로상에 연결 된거기때문에.. GPIO.. 음.. 그럼 GPIO가 속해있는 APB2를 건들여야 하겠군..'
    'LED가 Low에서 켜지는지, High에서 켜지는지는 나중에 생각하도록하고..'

    RM0008 Reference manual(이하 RM0008)을 보면 RCC레지스터가 있다.
    -Reset and clock control register (RCC)
    밑에 그림은 RCC register map이며 리셋시 값이 어떻게 되는지 보여주는 표이다 (RM0008)




    위에서부터 정리해보면
    RCC_CR : Clock Control
    RCC_CFGR : Clock Configuration
    RCC_CIR : Clock Interrupt
    RCC_APB2RSTR : APB2 Peripheral Reset
    RCC_APB1RSTR : APB1 Peripheral Reset
    RCC_AHBENR : AHB Peripheral Clock Enable
    RCC_APB2ENR : APB2 Peripheral Clock Enable
    RCC_APB1ENR : APB1 Peripheral Clock Enable
    RCC_BDCR : Backup Domain Control
    RCC_CSR : Control/Status

    '이름을 보니 뭔가 클럭틱한(?) 레지스터들이다..'

    우선은 LED를 켜야하니.. LED는 GPIO에 연결되어있고 GPIO는 APB2라는놈과 관련이 있으니..
    RCC_APB2RSTR : APB2 Peripheral Reset
    RCC_APB2ENR  : APB2 Peripheral Clock Enable

    이 두개의 레지스터와 크게 관련이 있을거 같아서 살펴보겠다.

    우선 RCC_APB2RSTR
    (RM0008) 아래 그림에서 보면 해당비트에 '1'을 넣으면 해당 기능이 Reset된단다.. 
    Reset Value가 전부 0 이므로 아직은 아무일도 일어나지 않았다.
    그리고 필요할때 (Reset을 시켜야할때) 1로 채워주면 될거같다.!!


    그리고 RCC_APB2ENR 
    (RM0008) 해당비트를 1로 설정하면 해당기능의 클럭이 활성화 된단다.
    Reset Value가 전부 0이므로,

    해당기능을 사용하기 위해서는 
    RCC_APB2ENR 의 해당비트를 1로 만들어줘서 클럭을 공급해줘야겠다.
    'Atmega는 이런거 없어도 잘되는데..'



    내가사용하는 M3 Board의 회로도중 LED부분이다.
    PA 4~7, PE 0~3 에 연결되어있으므로 PORTA와 PORTE의 Clock을 Enable 시켜줘야 한다. 
    "회로도가 다를수 있으므로 자신의 Board의 회로도를 확인한후 설정해야한다!!"

    그리고 이회로는 CPU(M3)의 Port에서 Low레벨의 Output이 나가야지 LED가 ON되는 회로이다. 
    "혹~시 LED켜지는 원리를 모르시는분은 인터넷에 검색하길.."




    코드상으로는..

    #define   RCC_APB2ENR    (*(volatile unsigned int*)0x40021018)
    int main()
    {
      RCC_APB2ENR = 0x44

      while(1);
      return 0;
    }


    이런코드가 나오게 되겠다.!!

    혹은 조금더 '아..주 조금더' 고급스럽게

    RCC_APB2ENR = 0x44; 부분을 아래와같이..

    RCC_APB2ENR |= (1<<2) | (1<<6);  이런식이나..

    #define   IOPEEN    0x40
    #define   IOPAEN    0x04

    RCC_APB2ENR |= IOPEEN | IOPAEN;   이런식으로 쓸수있겠다.. 

    '더 고급스럽게 해보고싶지만 한계인가보다..'


    SIGI는 초보프로그래머다. 아직 Datasheet도 잘 볼줄 모르고.. 코딩도 잘하지 못한다.. 설명은 더더욱.. 
    블로그는 개인 노트 용도로 쓰고 있으므로, 잘못된점이나 수정해야할점있으면 고수님들 지적 부탁드립니다. Plz..


    STM32 무작정 LED켜기 2 탄에서 이어 집니다. ㅎ 


    댓글 1

    • 우왕 2012.02.10 00:59

      너무 감사해요

      ATMEGA128 하다가 넘어왔는데

      IO가 많이 달라서 햇깔렸는데

      관련 레지스터를 알기쉽게 잘 정리해 주셨군요 감사해용 ㅋ

Designed by Tistory.