본문 바로가기
코스웨어/15년 스마트컨트롤러

20151019 안향진 TIM2 delay_파이선 led on/off_code/data/stack view, load, memory clear

by 알 수 없는 사용자 2015. 10. 20.
728x90
반응형

==========================================================================================

CORTEX

==========================================================================================


<CORTEXM3>


=TIM2,3,4,5


-Rp372


EX )아트메가 UBRR 9600 : 103 설정 ( 16M기준 )

                4800 ( 8M기준 )일 것임



= CLOCK SOURCE 선택












=TIMER 이용한 Delay함수 만들기










void Delay_ms(unit8_t time);



=단위시간 1ms



1. 1ms 간격의 Timer Interrupt


1. 1ms 간격의 Timer Interrupt서비스 루틴 안에서 별도의 카운트



=단순 LED ON/OFF


TIM_Cmd()

TIM_ITConfig()




<main.c>


#include <stm32f10x.h>

void TIM2_IRQHandler(void)
{
  
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  {
    
// Timer Counter 가 처리하는 내용
     GPIOA->ODR ^=(uint32_t)0x01;
    /* Clear the TIM1 Capture Compare 1 interrupt pending bit */
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  }
  
return;
}

void TIM2_Init(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  TIM_TimeBaseInitStruct.TIM_Period 
= 1000-1// 1KHz
  TIM_TimeBaseInitStruct.TIM_Prescaler = 24-1//1MHz
  TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseInitStruct.TIM_CounterMode 
= TIM_CounterMode_Up ;
  
//TIM_RepetitionCounter;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
  
return;
}

void NVIC2_Init(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  
/* Enable TIM2 global interrupt with Preemption Priority 0 and Sub
  Priority as 2 */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 
= 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority 
= 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd 
= ENABLE;
  NVIC_Init(
&NVIC_InitStructure);    
  
return;
}

void PIOA0_OutInit(void)
{
  
/* Configure all the GPIOA in Output PP mode */
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin 
= GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed 
= GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode 
= GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, 
&GPIO_InitStructure);  
  
return;
}

int main(void)
{
  
// 사용할 기능 : GPIOA0, TIM2
  /* Enable GPIOA, clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  
/* Enable TIM2 clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  
  PIOA0_OutInit();
  TIM2_Init();
  NVIC2_Init();
  
  TIM_Cmd(TIM2, ENABLE);  
//Timer 활성화
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);  
// Timer Interrupt 활성화
  while(1)
  {
    ;
  }
  
return 0;
}


=소스파일


20151019.zip


==========================================================================================

ROBOT

==========================================================================================


<ROBOT>


<책 수업>

=ZigBee


: 망 구축 없이 통신 가능 (Node) => 메시 토폴로지

=> Wifi 다 설치되어있어 무의미 => 산불 관재등에 사용(사람 못들어가는 곳)

:250kb/s : 저속


=IOT(사물인터넷) => IOE(만물인터넷)


=삼성스마트TV 

-리눅스+모니터 => 스마트TV


=GPIO : GERNERAL PURPOSE I/O(AVR: PORT)  => LED ON/OFF


=>GPIO로 UART 가능

=AVR 비동기 UART

Tx

A -> B

=패킷 트레일러(Physical Layer의 구조알면 가능) :테일 + 데이터(8BIT) + 헤더

한비트 보내는 시간이하(BAUD RATE)로 만들어 낼 수 있으면 가능



=GPIO 테스트 하기

1. GPIO회도로

2. 파이선 라이브러리

3. 회로구성

4. GPIO HIGH LOW 테스트




=

1. GPIO회로도

http://pi.gadgetoid.com/pinout/pin12_gpio18





2. 







=구구단









=









3.연결

GPIO18번 - 저항 - LED(-) -LED(+) - 3.3V



4. LED ON/OFF


<led_blink.py>

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

LED 
= 18

GPIO.setup(LED, GPIO.OUT)

try:
    
while (True):
        GPIO.output(LED, GPIO.LOW)
        time.sleep(
1)
        GPIO.output(LED, GPIO.HIGH)
        time.sleep(
1)

except KeyboardInterrupt:
    GPIO.output(LCD, GPIO.LOW)
    GPIO.cleanup()









=결과



=소스파일


20151019.zip


==========================================================================================

CORTEX

==========================================================================================


<ASSEMBLY>




=CODE, DATA, STACK HEXAVIEW로 표시










=실행

-메뉴 순서

code

data

stack => 초기 데이터 확인

load => 각각 데이터 채우기

code

data

stack => 확인

mc => 0 으로 채우기

code

stack

data => 지워졌는지 확인




#include <stdio.h>

#define CMD_SIZE  20
#define MAX_PRG_SIZE  (64*1024)
#define MEM_SIZE  (MAX_PRG_SIZE*2)  //(128*1024)
#define  MASK_CODE  0xFFFF0000
void * vpMem_Start;
void * vpMem_End;
void * vpCode;
void * vpData;
void
 * vpStack;

typedef struct _context
{
  
unsigned int efl;
  
unsigned int eip; // R.A
  unsigned int edi; // pushad
  unsigned int esi;
  
unsigned int ebp; // 따로처리
  unsigned int esp; // 따로처리
  unsigned int ebx; 
  
unsigned int edx;
  
unsigned int ecx;
  
unsigned int eax;
  
}Context;

typedef struct _comm
{
  
char * cpCmd;
  
void (*fp)(void);
}Comm;

static Context stOldstate;
void Print_R();
void Print_Help();
void View_Code();
void View_Data();
void View_Stack();
void Load();
void Memory_Clear();
void Quit();
void HexaView(void * , unsigned int );

Comm  stCmdMap[] 
=   {      // Message Map : switch case 유사
        {"R", Print_R},  
        {
"H", Print_Help},  
        {
"MC", Memory_Clear},
        {
"CODE", View_Code},
        {
"DATA", View_Data},        
        {
"STACK", View_Stack},          
        {
"LOAD", Load},          
        {
"Q", Quit},
        {
"QUIT", Quit},
        {
00}
};

void Print_R()
{
  printf(
"eax [ %08x ]  ebx [ %08x ]\n", stOldstate.eax, stOldstate.ebx);
  printf(
"ecx [ %08x ]  edx [ %08x ]\n", stOldstate.ecx, stOldstate.edx);
  printf(
"esi [ %08x ]  edi [ %08x ]\n", stOldstate.esi, stOldstate.edi);
  printf(
"ebp [ %08x ]  esp [ %08x ]\n", stOldstate.ebp, stOldstate.esp);
  printf(
"eip [ %08x ]  efl [ %08x ]\n", stOldstate.eip, stOldstate.efl);

  
//printf("main()  [ %08x ]\n",main);
  //printf("&stOldstate  [ %08x ]\n", &stOldstate);

  return;
}

void Print_M()
{
  printf(
"Code Start Address  : %08X\n", vpCode);
  printf(
"Dynamic Memory area : %08X to %08X <128KBytes>\n", vpMem_Start, vpMem_End);
  
return;
}

void Memory_Clear()
{
  memset(vpMem_Start, 
0x00, MEM_SIZE);
  
return;
}

void Quit()
{
  free(vpMem_Start);
  exit(
0);
}

void Print_Help()
{
  printf(
"R : Print Register Status\n");
  printf(
"H : Print Command List\n");
  
return;
}

void View_Code(void * vP, unsigned int uiLen)
{
  HexaView(vpCode, 
16*16);
  
return
;
}


void View_Data(void * vP, unsigned int uiLen)
{
  HexaView(vpData, 
16*16);
  
return;
}

void View_Stack(void * vP, unsigned int uiLen)
{
  HexaView(vpStack, 
16*16);
  
return;
}

void Load()
{
  memset(vpCode, 
0xFF, 16*16);
  memset(vpData, 
0xEE, 16*16);
  memset(vpStack, 
0xDD, 16*16);
  
return;
}

void HexaView(void * vP, unsigned int uiLen)
{

  
  
  
unsigned int uiCnt;
  
unsigned int uiLine;

  printf(
"===============================================================================\n");
  printf(
"  Address                           Hexa                           ASCII       \n");
  printf(
"-------------------------------------------------------------------------------\n");
  
for (uiLine = 0; uiLine < uiLen; uiLine = uiLine + 16)
  {
    printf(
" %08X  ", vP);
    
//printf("%02X ",*((char *)vP)); // LITTLE ENDIAN = 100
    //vP = vP + 1;      // ERROR => void
    for (uiCnt = 0; uiCnt < 16; ++uiCnt)
    {
      printf(
"%02X ", *((unsigned char *)vP));
      vP 
= (char *)vP + 1;
    }
    putchar(
' ');
    vP 
= (char *)vP - 16;
    
for (uiCnt = 0; uiCnt < 16; ++uiCnt)
    {
      
if (32 > *((unsigned char *)vP)) // ASCII 32 => SPACE // 제어문자 => '.'출력
      {
        putchar(
'.');        
      }
      
else if ( 127 < *((unsigned char *)vP)) // ASCII 128이상 (확장아스키) // 한글 => '.'출력
      {
        putchar(
'.');
      }
      
else
      {
        printf(
"%c", *((unsigned char *)vP));
      }
      vP 
= (char *)vP + 1;
    }
    putchar(
'\n');
  }
  
return;
}

int main()
{
  
char cInput[CMD_SIZE];
  
int iRet;
  Comm * stpCmd;
  
  vpMem_Start 
= (void *)malloc(MEM_SIZE);
  
if(0 == vpMem_Start)
  {
    printf(
"Memory alocation Fail\n");
    
return 0;
  }
  vpCode 
= (void *)(((int)vpMem_Start&MASK_CODE) + MAX_PRG_SIZE);
  vpData 
= (void *)((int)vpCode + 0x2000);  
  vpMem_End 
= (void *)((int)vpMem_Start + MEM_SIZE -1);
  vpStack 
=  (void *)((int)vpMem_End - (16*16) +1
);
  Print_M();

  STST(
&stOldstate);
  printf(
"Moniter Program Start\n");

  
while(1)
  {
    putchar(
'>');
    iRet 
= read(0, cInput, CMD_SIZE);
    
if(1 == iRet)  
    {
      
continue;
    }
    cInput[iRet-
1= 0;
    
//printf("%s\n", cInput); // 스텁(Stub)코드 주석처리
    stpCmd = stCmdMap;
    strupr(cInput);
    
while(0 != (stpCmd->fp))
    {
      
if(0 == strcmp(cInput, stpCmd->cpCmd))
      {
        
break;
      }
      ++stpCmd;
    }

    
if(0 != (stpCmd->fp))  // 찾으면 실행
    {
      (stpCmd-
>fp)();
    }
    
else
    {
      Print_Help();
    }  
  }
  
return 0;
}





=










=소스파일


main.c


728x90