'중도연재종료/CORTEX M3'에 해당되는 글 20건

  1. 2013.06.14 Get Character
  2. 2013.06.14 당분간 정지
  3. 2013.06.08 UART_ Hello_Wolrd 찍기_2
  4. 2013.06.08 UART_ Hello World 찍기_1
  5. 2013.05.25 GPIO_Init
  6. 2013.05.24 Key가 눌린것 알아채기
  7. 2013.05.24 고급스러운 코딩1.
  8. 2013.05.24 LED 끄기[GPIO Set Reset 레지스터]
  9. 2013.05.22 LED회로도를 통한 기본적인 이해
  10. 2013.05.22 Cortex M3 시작. 자료

USART의 RS 스텟을 본다.


#define USART_FLAG_RXNE    ((uint16_t)0x0020)

:Read data register not empty

multi-buffer 통신 등의 상황에서 사용


1은 데이터가 수신되어 읽을 수 있는 상태가 되었다는 것을 의미

0은 데이터가 아직 수신되지 않았다는 의미


RDR shift register[각주:1]가 데이터를 수신하고 이것을 USART_DR register로 옮기게 된다. 모두 옮겨졌을 경우 이 비트가 1이 된다.


rc_w0:read & c_w0

c_w0 : 0을 write함으로써 이 비트는 0으로 clear 된다는 것을 의미

c_w1 : 1을 write함으로써 비트가 0으로 clear 된다.


uint16_t USART_ReceiveData(USART_TypeDef* USARTx)

{

/* Receive Data */

return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);

}

USART_DR레지스터에서 값을 읽어온다.

USART_DR레지스터의 아홉비트만이 의미가 있다.


  1. 어디있냐? [본문으로]

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

RCC_GetClockFreq  (0) 2013.06.23
Clock Control  (0) 2013.06.23
당분간 정지  (0) 2013.06.14
UART_ Hello_Wolrd 찍기_2  (0) 2013.06.08
UART_ Hello World 찍기_1  (0) 2013.06.08
Posted by 십자성군

그때그때 정리하니까 시간이 너무 걸린다.

빨리빨리 해서 한번 다 하고 적어나가자

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

Clock Control  (0) 2013.06.23
Get Character  (0) 2013.06.14
UART_ Hello_Wolrd 찍기_2  (0) 2013.06.08
UART_ Hello World 찍기_1  (0) 2013.06.08
GPIO_Init  (0) 2013.05.25
Posted by 십자성군

자세한 이론 내용은 책 참조... 정리하는데 시간이 너무 지나감


void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure; 

  

  GPIO_InitStructure.GPIO_Pin = GPIO_USART_Tx_Pin;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIO_USART,&GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = GPIO_USART_Rx_Pin;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIO_USART,&GPIO_InitStructure);

}




void USART1_Init(void)

{

  USART_InitTypeDef USART_InitStructure; 

  

  /*USARTx configured as follow:

  -BaudRate : 115200 baud

  -Word Length = 8bits

  -One Stop Bit

  -No parity

  -Hardware flow control disabled (RTS and CTS signals)

  -Receive and transmit enabled

  */

  

  USART_InitStructure.USART_BaudRate = 115200;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_Parity = USART_Parity_No;

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;

  

  //Configure the USARTx

  

  USART_Init(USART1, &USART_InitStructure);

  

  //Enable the USART1

  USART1->CR1 |= CR1_UE_Set;

}


typedef struct

{

  __IO uint16_t SR;

  uint16_t  RESERVED0;

  __IO uint16_t DR;

  uint16_t  RESERVED1;

  __IO uint16_t BRR;

  uint16_t  RESERVED2;

  __IO uint16_t CR1;

  uint16_t  RESERVED3;

  __IO uint16_t CR2;

  uint16_t  RESERVED4;

  __IO uint16_t CR3;

  uint16_t  RESERVED5;

  __IO uint16_t GTPR;

  uint16_t  RESERVED6;

} USART_TypeDef;


UART : CPU에서 나오는 신호레벨(TTL)

RS-232 : SP


P240. Reference Table180 참조

BaudRate

:Tx/Rx baud=fck/(16*USARTDIV)

ex)Baudrate 115200으로 잡을 경우

DIV_Mantissa=39=0b100111=0x27

DIV_Fraction=16*0.625=10=0xA

USARTDIV=0x27A


WordLength

#define USART_WordLength_8b                  ((uint16_t)0x0000)

#define USART_WordLength_9b                  ((uint16_t)0x1000)


StopBits

#define USART_StopBits_1                     ((uint16_t)0x0000)

#define USART_StopBits_0_5                   ((uint16_t)0x1000)

#define USART_StopBits_2                     ((uint16_t)0x2000)

#define USART_StopBits_1_5                   ((uint16_t)0x3000)


Parity

#define USART_Parity_No                      ((uint16_t)0x0000)

#define USART_Parity_Even                    ((uint16_t)0x0400)

#define USART_Parity_Odd                     ((uint16_t)0x0600) 


HadwafeFlowControl

#define USART_HardwareFlowControl_None       ((uint16_t)0x0000)

#define USART_HardwareFlowControl_RTS        ((uint16_t)0x0100)

#define USART_HardwareFlowControl_CTS        ((uint16_t)0x0200)

#define USART_HardwareFlowControl_RTS_CTS    ((uint16_t)0x0300)


USART_Mode

#define USART_Mode_Rx                        ((uint16_t)0x0004)

#define USART_Mode_Tx                        ((uint16_t)0x0008)


#define CR1_UE



void SerialPutChar(uint8_t c){

  USART_SendData(USART1,c);

  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

}


USART_FLAG_TXE : 송신을 할 수 있는 상태인지 검사


새로운 명령

apbclock = HSI_Value

CR2_STOP_CLEAR_Mask

USART_StopBits

CR1_CLEAR_Mask

USART_WordLength

USART_Parity

USART_Mode

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

Get Character  (0) 2013.06.14
당분간 정지  (0) 2013.06.14
UART_ Hello World 찍기_1  (0) 2013.06.08
GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
Posted by 십자성군

P224~



UART : CPU에서 나오는 신호레벨(TTL 레벨)

RS-232 : UART칩을 거쳐 나온 신호


#define USART1_BASE    (APB2PERIPH_BASE + 0x3800)    관련 RSMap은 맨 위의 표와 같음

#define USART1            ((USART_TypeDef*)USART1_BASE)



<Source_Code>


#include <stm32f10x.h>


#define GPIO_USART  GPIOA

#define GPIO_USART_Rx_Pin GPIO_Pin_10

#define GPIO_USART_Tx_Pin GPIO_Pin_9


//GPIOA의 10번과 9번 핀을 각각 수.송신부로 사용하고 있다.


void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure; 

  

  GPIO_InitStructure.GPIO_Pin = GPIO_USART_Tx_Pin;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIO_USART,&GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = GPIO_USART_Rx_Pin;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIO_USART,&GPIO_InitStructure);

}


void USART1_Init(void)

{

  USART_InitTypeDef USART_InitStructure; 

  

  /*USARTx configured as follow:

  -BaudRate : 115200 baud

  -Word Length = 8bits

  -One Stop Bit

  -No parity

  -Hardware flow control disabled (RTS and CTS signals)

  -Receive and transmit enabled

  */

  

  USART_InitStructure.USART_BaudRate = 115200;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_Parity = USART_Parity_No;

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;

  

  //Configure the USARTx

  

  USART_Init(USART1, &USART_InitStructure);

  

  //Enable the USART1

  USART1->CR1 |= CR1_UE_Set;

}


void Serial_PutString(uint8_t *s){

  while(*s != '\0'){

    SerialPutChar(*s);

    s++;

  }

}


void RCC_Set(void){

  RCC->APB2ENR |= RCC_APB2Periph_USART1;

}


int main(void)

{

  RCC_Set();


  GPIO_Configuration();

  

  USART1_Init();


  while(1){

 Serial_PutString("\r\nHello World! Hello Cortex-M3!\r\n") ; 

  }

}




'중도연재종료 > CORTEX M3' 카테고리의 다른 글

당분간 정지  (0) 2013.06.14
UART_ Hello_Wolrd 찍기_2  (0) 2013.06.08
GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
Posted by 십자성군

책을 읽다보니 후에 GPIO_Init설명이 나왔다... 책을 순서대로 학습한다면 지금부터 쓰는거였다.


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

{

  uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;

  uint32_t tmpreg = 0x00, pinmask = 0x00;

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));

  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  

  

/*---------------------------- GPIO Mode Configuration -----------------------*/

  currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);

  if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)

  { 

    /* Check the parameters */

    assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));

    /* Output mode */

    currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;

  }


1줄 : input mode, output mode 판별. 0x0F를 이용하여 하위 4비트의 값만 추출

2줄 : mode가 0x00이 아니면 output모드



typedef enum

{ GPIO_Mode_AIN = 0x0,

  GPIO_Mode_IN_FLOATING = 0x04,

  GPIO_Mode_IPD = 0x28,

  GPIO_Mode_IPU = 0x48,

  GPIO_Mode_Out_OD = 0x14,

  GPIO_Mode_Out_PP = 0x10,

  GPIO_Mode_AF_OD = 0x1C,

  GPIO_Mode_AF_PP = 0x18

}GPIOMode_TypeDef;

/*---------------------------- GPIO CRL Configuration ------------------------*/

  /* Configure the eight low port pins */

  if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)    //CRL인지 확인

  {

    tmpreg = GPIOx->CRL;

    for (pinpos = 0x00; pinpos < 0x08; pinpos++)                                    //어느위치 설정값인지 확인(앞의 학습에서 했음)

    {

      pos = ((uint32_t)0x01) << pinpos;

      /* Get the port pins position */

      currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;                            //맞는 핀 위치 확인

      if (currentpin == pos)

      {

        pos = pinpos << 2;                             //CRL은 4비트 단위로 값 담당. pinpos*4로 위치값 구함(2만큼 왼쪽으로 shift)

        /* Clear the corresponding low control register bits */

        pinmask = ((uint32_t)0x0F) << pos;

        tmpreg &= ~pinmask;                    //원하는 부분만 0으로 만든값을 tmpreg에 and함. 원하는 부분만 0으로 변함

        /* Write the mode configuration in the corresponding bits */

        tmpreg |= (currentmode << pos);        //현재 설정값을 원하는 위치에 shift시켜 or시켜 적용

        /* Reset the corresponding ODR bit */

//CRL,CRH가 아닌 BRR.BSRR레지스터 설정

//input mode에서 pull-down, pull-up으로 설정할 경우, 그 GPIO에 값이 설정되어야한 정상적으로 설정 가능.

//즉, 해당 작업을 밖에서 설정하는것이 아니라, GPIO초기화 과정에서 한번에 처리

//Pull-down : Reset(0), Pull-up : Set(1)

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

        {

          GPIOx->BRR = (((uint32_t)0x01) << pinpos);

        }

        else

        {

          /* Set the corresponding ODR bit */

          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

          {

            GPIOx->BSRR = (((uint32_t)0x01) << pinpos);

          }

        }

      }

    }

    GPIOx->CRL = tmpreg;

  }

/*---------------------------- GPIO CRH Configuration ------------------------*/

  /* Configure the eight high port pins */

  if (GPIO_InitStruct->GPIO_Pin > 0x00FF)

  {

    tmpreg = GPIOx->CRH;

    for (pinpos = 0x00; pinpos < 0x08; pinpos++)

    {

      pos = (((uint32_t)0x01) << (pinpos + 0x08));

      /* Get the port pins position */

      currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);

      if (currentpin == pos)

      {

        pos = pinpos << 2;

        /* Clear the corresponding high control register bits */

        pinmask = ((uint32_t)0x0F) << pos;

        tmpreg &= ~pinmask;

        /* Write the mode configuration in the corresponding bits */

        tmpreg |= (currentmode << pos);

        /* Reset the corresponding ODR bit */

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

        {

          GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));

        }

        /* Set the corresponding ODR bit */

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

        {

          GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));

        }

      }

    }

    GPIOx->CRH = tmpreg;

  }

}



'중도연재종료 > CORTEX M3' 카테고리의 다른 글

UART_ Hello_Wolrd 찍기_2  (0) 2013.06.08
UART_ Hello World 찍기_1  (0) 2013.06.08
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
Posted by 십자성군

P213


참고. STM32_Reference_manual. p140의 table 17, 18


직접 만드는것도 연습이 되나, 되도록 있는 함수를 이용하도록한다. 새로 만든 함수와 기존 함수를 병행하면 헷갈리기 쉽기때문에 본래 있는 함수에 익숙하도록 하자.


P216의 GPIO_Port_Init의 대체함수로 GPIO_Configuration을 이용하자.

아래와 같다.


void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


   GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0+GPIO_Pin_1+GPIO_Pin_4);

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //output

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

}


위의 함수들은 본래 주어진다.


BitAction함수도 본래 주어진다.


GPIO_ReadInputDataBit도 주어진다.




GPIO_TypeDef->IDR

:_IO uint32_t IDR

:0~15번 비트까지 0번 핀에서 15번 핀까지의 입력 데이터의 값을 가지고 있다.

GPIO_Pin은 사용하는 핀에 대하여 1이 들어가 있고<핀정보> IDR에 이를 AND함으로써 데이터값이 1이 들어와 있는 핀에 대해서는 1을 반납한다. 물론 IDR에는 복수핀에 대한 데이터 정보로 되어있고 GPIO_Pin은 단일도 복수도 가능하다. 단일일 경우 해당핀만 조건을 만족하면 되고, 복수이면 여러핀이 조건을 만족해야 한다. Bit_RESET, SET은 각각 0,1이다. 32비트로 처리한다. 반납값 bitstatus는 8비트로 0,1표현


ex)

IDR : 0b1011110111110001

PIN : 0b1001001100101100

&    : 0b1001000100100000

rese: 0b0000000000000000


테스트 파일. LED3개를 이용하여 깜빡임. 스위치 하나.

 Key_Test.zip


'중도연재종료 > CORTEX M3' 카테고리의 다른 글

UART_ Hello World 찍기_1  (0) 2013.06.08
GPIO_Init  (0) 2013.05.25
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Posted by 십자성군

내용핵심

예를들어 GPIOB_BRR이 0x40010C14라고 하자.

여기서 GPIOB : 0x40010C00이며

BRR은 여기에 + 0x14를 더한것이다.

GPIOA : 0x40010800이며 GPIOA_BRR은 0x40010814이다.


이러한것을 #define을 이용하여 일일이 주소를 치던것을 간단하게 GPIOA_BRR, GPIOB_BRR 등으로 쳐서 표현하자는것


이 책에서 나오는 define은 대부분 STMicroelectronics의 Standard Peripheral Driver Library에 적용되어 있다.


여기에 연습하면서 적은 코드를 적어둔다

/////////////////////////////////////////////////////////////////////////////////////

platform_config.h

#define GPIOA_CRL (*(volatile unsigned *)0x40010800)

#define GPIOA_CRH (*(volatile unsigned *)0x40010804)


typedef enum{

  GPIO_Mode_User_Out_PP=0x00,

  GPIO_Mode_Use_Out_OD=0x01,

  GPIO_Mode_Use_AF_PP=0x10,

  GPIO_Mode_Use_AF_OD=0x11

}GPIOMode_Output_TypeDef;


void GPIO_A_Output_Init(uint16_t pinNum, GPIOSpeed_TypeDef speedValE, GPIOMode_Output_TypeDef modeE){

  //modeE : CNF

  //speedValE : MODE

  //pinNum : 비트방식의 pinNum표시. 0x1(0b1), 0x2(0b10)... 16비트:16핀

  //0xFFFF : 0b1111.1111.1111.1111.

  //GPIOSpeed_TypeDef : stm32f10x_gpio.h에 정의

  uint32_t tmpVal = modeE<<2 | speedValE; //CNF와 MODE 붙임

  uint32_t pinpos = 0x00;


  //pin #0~#7(GPIO_CRL)

  if((pinNum & 0xFF)!=0){

    //하위 8비트에 어떤 값이 존재

    for(pinpos=0x00; pinpos<0x08; pinpos++){

      if(pinNum==((uint32_t)0x01) << pinpos){

        //pinpos : 원하는 설정을 저장할 위치(4비트 단위로 건너뜀)

        pinpos = pinpos*4;

        GPIOA_CRL &= ~(0xF << pinpos);  //대상비트를 0으로 Set. 나머지는 그대로 살림(and)

        GPIOA_CRL |= tmpVal << pinpos;  //대상비트에 설정사항(tmpval)적용

        break;

      }

    }

  }

  

  //pin #8~#15

  else{

    //8비트 오른쪽 shift시켜 CRH의 port bit configuration에 적용

    pinNum = pinNum>>8;

    for(pinpos = 0x00; pinpos < 0x08; pinpos++){

      if(pinNum == ((uint32_t)0x01) << pinpos){

        pinpos = pinpos*4;

        GPIOA_CRH &= ~(0xF << pinpos);

        GPIOA_CRH |= tmpVal << pinpos;

        break;

      }

    }

  }

}


책에 있는데 안적은 내용은, 위에서 언급한 Standard peripheral Driver Library에 있기때문


/////////////////////////////////////////////////////////////////////////////////////////////

Test_LED_Function_Used.c


#include <stm32f10x.h>

#include <platform_config.h>


static void delay_int_count(volatile unsigned int nTime)

{

 for(; nTime > 0; nTime--); 

}


void delay_1_second(void)

{

  delay_int_count(806596); 

}


//앞의 platforconfig.h와 비교

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //output

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

}


void GPIOA_0_On(void){

  GPIOA->BRR |= GPIO_Pin_0; 

}

void GPIOA_1_On(void){

  GPIOA->BRR |= GPIO_Pin_1; 

}

void GPIOA_4_On(void){

  GPIOA->BRR |= GPIO_Pin_4; 

}


void GPIOA_0_Off(void){

  GPIOA->BSRR |= GPIO_Pin_0; 

}

void GPIOA_1_Off(void){

  GPIOA->BSRR |= GPIO_Pin_1; 

}

void GPIOA_4_Off(void){

  GPIOA->BSRR |= GPIO_Pin_4; 

}


void GPIOA_On_All(void){

  GPIOA_0_On(); 

  GPIOA_1_On(); 

  GPIOA_4_On(); 

}


void GPIOA_Off_All(void){

  GPIOA_0_Off(); 

  GPIOA_1_Off();

  GPIOA_4_Off();

}


void GPIOA_OnOffAll_Mult(uint32_t count){

  for(;count>0;count--)

  {

    GPIOA_0_Off();

    GPIOA_1_On();

    GPIOA_4_On();

    delay_1_second();

    

    GPIOA_0_On();

    GPIOA_1_Off();

    GPIOA_4_On();

    delay_1_second();

    

    GPIOA_0_On();

    GPIOA_1_On();

    GPIOA_4_Off();

    delay_1_second(); 

  }

}


void GPIOA_Test(void){

#if 0

  GPIOA_On_All();

  delay_1_second();

  GPIOA_Off_All();

  delay_1_second();

#else

  GPIOA_OnOffAll_Mult(10);

#endif

}

int main(void){

  RCC->APB2ENR |= RCC_APB2Periph_GPIOA;

  

  //GPIO_Speed_10MHz : output mode의 Open-drain

  GPIO_A_Output_Init(GPIO_Pin_0,GPIO_Speed_10MHz,GPIO_Mode_User_Out_PP);

  GPIO_A_Output_Init(GPIO_Pin_1,GPIO_Speed_10MHz,GPIO_Mode_User_Out_PP);

  GPIO_A_Output_Init(GPIO_Pin_4,GPIO_Speed_10MHz,GPIO_Mode_User_Out_PP);

  

  while(1){

   GPIOA_Test(); 

  }

}


GPIOA를 이용해서 LED테스트를 해보았다. 직접 읽고 내용을 이해할 수 있었으면 한다.


'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Cortex M3 시작. 자료  (0) 2013.05.22
Posted by 십자성군

P171


소스


static void delay_int_count(volatile unsigned int nTime)

{

for(; nTime>0; nTime--);

}


int main(void)

{

(*(volatile unsigned *)0x40021018 |= 0x8;

(*(volatile unsigned *)0x40010C04 |=0x10;


(*(volatile unsigned *)0x40010C14 |= 0x200;

delay_int_count(10000);

(*(volatile unsigned *)0x40010C10 |= 0x200;


while(1)

{

;

}

}


[GPIO Set Reset 레지스터]

GPIO핀의 값을 Reset하고 Set하는 작업으로 동작을 On, Off시켰다.


1.Port bit Reset register [GPIOx_BRR]

Address offset:0x14

Reset value: 0x0000 0000


GPIO register map을 참고한다.

0x40010C14 |= 0x200;

0x200=0b001000000000이 된다. 즉, BR9가 ON되어 핀9가 Reset된다.(Register reset)


2.Port bit set/reset register [GPIOx_BSRR]

Address offset: 0x10

Reset value : 0x0000 0000


0x40010C10 |= 0x200으로 인해 BS9가 ON되어 핀9가 Set된다.(Register set)


delay_int_count(10000);

시간지연. 설명 pass

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Cortex M3 시작. 자료  (0) 2013.05.22
Posted by 십자성군

p136, 159




MamoryMap

MamoryMap




RCC register map






GPIO register map



소스코드


int main(void){

(*(volatile unsigned*)0x40021018) |= 0x8;

(*(volatile unsigned*)0x40010C04) |= 0x10;


while(1)

{;}

}


schematic



volatile를 사용하는 이유:

컴파일과정에서 컴파일러가 쓸모없다고 판단하여 삭제해버리는 내용이 있다. 이를 삭제하지말고 컴파일 하게 할 때 사용한다.


소스해석


1.

(*(volatile unsigned*)0x40021018) |= 0x8;

0x40021018 : 위 메모리맵의 AHB 영역에서 RCC에 해당한다. RCC레지스터맵에서 0x18은 RCC_APB2ENR을 나타낸다.

0x8은 16진수표현이다. 이를 2진수로 표현하면 0b1000이다. RCC_APB2ENR에서 IOPBEN에 1이 들어간것과 같은의미.


APB2 peripheral clock enable register (RCC_APB2ENR)

address: 0x18    (해당주소. base 0x40021000 + 0x18 = 0x40021018)


역할

GPIO B를 사용하기 위해서, 이것에 Clock을 공급할 수 있도록 enable 시키는것.

APB2ENR의 IOPBEN을 ON시키기 위해서.


2.

(*(volatile unsigned*)0x40010C04) |= 0x10;

0x40010C04=0x40010C00+0x04

이는 GPIOB_CRH이다.


Port configuration register low(GPIOx_CRL)

Address offset : 0x00


Port configuration register high(GPIOx_CRH)

Address offset : 0x04


Table50을 보자. 32비트 레지스터 내용은 각 Pin별로 4비트씩 설정을 할 수 있도록 되어있다.

CRH에서 0x10을 or 시키면, 0b00010000이 된다. 핀 9번, 8번에 대하여 적용되어, pin8번은 0000, 핀9번은 0001이 적용되어 CNF:00, MODE:01이 된다.


책을보면, MODE 01로 Output mode, max speed 10MHz가 적용, CNFy 00으로 General purpose output push-pull이적용된다.


pull-up, pull-down.과

Open-Drain의 PMOS와 NMOS의 공부가 필요

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
Cortex M3 시작. 자료  (0) 2013.05.22
Posted by 십자성군


ARM.zip

첨부내용:

13475.pdf : STM32F103xx 함수설명서

STM32_Module_Sch_V1_2 : 모듈 회로도

STM32_Module_v1_2 : 모듈 설명서

STM32_Reference_manual : 영문메뉴얼

stm32시작하기_2 : 학습자료. 별로 참고하지 않음


사용장비

(주. 인셈)STM32F103 Module Board(STM32_M)

사용교재

ARM Cortex-M3 시스템 프로그래밍 완전정복 I


교재내용을 읽으면서 학습. 보충설명과 같이 기재하겠음

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Posted by 십자성군