_t는 구조체에 붙이는 거라기 보다는 user-defined type에 붙이는거죠.

uint8_t, uint32_t등은 stdint.h를 보면 알 수 있습니다.

platform마다 datatype의 크기가 다르기 때문에 portability를 지원하기 위해서

 uint8_t,uint32_t등이 있습니다.

_t 같은 data type을 전문 용어로 Primitive System Data Type 라고 불러요...

정수 비트 길이와 바이트가 문제가 될 때 char 또는 short, int, long, long long 같은 데이터 형식을 사용하지 않고 고정 길이 데이터 형식을 이용한다. 

C 언어의 표준으로 규정되어 있는 부호 및 부호 없는 고정 길이 정수는 위와 같다. 

이유는 다음과 같다. ISO가 개발한 C 언어 표준 "ISO / IEC 9899"에서는 char 또는 short, int, long, long long 같은 데이터 형식의 길이(비트 길이)에 대한 처리 계에 마다 정의하는 것이 허용되며 이식성 문제를 일으킨다. 


1999년에 개정된 "ISO / IEC 9899:1999"에서도 이 문제의 잠재적인 원인은 해결되지 않았지만 표 1에 표시한 비트 길이를 고유하게 정의한 데이터 형식이 추가되었다. 이 새로운 형식은 "stdint.h"라는 헤더 파일에 정의되어있다.



한마디로 32비트와 64비트의 데이터 길이의 변화에 따른 버그,에러를 막기 위해서 define해서 사용하는거~ 리눅스, 임베디드 계열에서는 많이 사용한단다. 




출처:http://kldp.org/node/3270

채터링이란?
->전자 회로 내의 스위치나 계전기의 접점이 붙거나 떨어질 때 기계적인 진동에 의해 실제로는 매우 짧은 시간 안에 접점이 붙었다가 떨어지는 것을 반복하는 현상. 이는 회로에 나쁜 영향을 끼치므로 제거해야 한다. 

문제점->스위치를 한번만 눌렀을경우에도 여러번 눌렀다고 판단한다.
수정안->여러번 눌렀을경우(&누르고있는경우) 한번만 인식하기 위해 채터링을 사용한다
Solution
1. 선 채터링
이방법은 스위치를 누르고 있는동안은 while에서 무한 루프에 걸리게 됩니다 그러나 스위치를 때면 while  문 다음으로 넘어가게 되겠죠?
if(PINB & 0x04){
while(PINB & 0x04)
// 처리내용
}


2. 후 채터링
위에것과 다르게 이건 스위치를 눌렀을떄 먼저바뀌고 무한루프로 들어가는 겁니다(누르고있을때) 스위치를 때면 무한루프를 나가게 되며   if문이 종료 되는거죵~

if(PINB & 0x04){
 // 처리내용
while(PINB & 0x04)
;
}

어때요? 간단하지만 좋은방법이죵?

!참고!-> 
또 한가지더.. 스위치를 누르고있을때 다른동작을 하고 싶다면 while문 안에 하고 싶은 동작을 입력해주면 되요~ 그런데 while문.. 스위치를 누르고 있는동안 무한 반복을 한다는점을 생각해야겟죵"?ㅋ


R0008: Reference Manuals 은 10.6M라서 압축해서 올립니다. 윈도우가 아니라서 암거나 압축했는데 되겟죠?^^ㅋ
www.St.com 에 들어가서 Product .. macroprocessor ... stm32f103rbt6.. 에보면 나오는거죠~(현재V2.2)가 있네요

저는 usbto serial 이 잘못된건지 망고보드가 나간건지.. 미니 usb가 잘못된건지... 내일 친구집에 가서 확인을 해봐야 할상황이네요;

 
사용방법은 다들 아시리라 믿습니다. ~ 115200 baud rate 해놓고 연결하시면 될듯하네요^^  뭐 no response from the tarher, the boot loader can not be started.
Please, verify the boot mode configuration and the flash protection status,
Reset your device then try again...

->나오면 리셋 스위치 누르시고 난뒤 next하면 잘된다고 는 합니다.~ 참고하세요~

해결햇네요 저의 문제점은 망고보드가 보드측에서 TX RX GND 이라고 설명한거였네요 이렇게 입력하라는건 아니구요;; 괜히 선 짤랏네요;-_-; 그래서 결과는..
-> RX TX GND  (GND를 잘보시고 연결하시면 됩니다.)

->또.. 전 2.0버전, 2.2 버전은. 안돌아가네요;; 희한하네요; 2.1버전은 돌아 가고요 희한하네요; 그래서 2.0 ,2.1 2.2 버전 다 올려봅니다. 참고하세요~

2.2버전▼
2.1버전▼
2.0버전 ▼

 

 


Bit banding 이란. Bit operation 을 빠르게 해줄수 있는 방법을 제공하는것.

공통적으로 alias 영역에 Write 행위는 그에 상응하는 bit-band 영역의 특정비트에 영향을 주는것.

ex)
-> 0x2000 0000 번지의 1번 비트가 어떻게 되는지 보면 결과적으로는 0x2200 0004 번지에 할당되어 있다.
    
그럼 0x2000 0000 번지의 0번비트의 해당하는 alias 영역은,, 0x2200 0080 이되고

1번비트는 0x2200 0084번지..
2번비트는 0x2200 0088번지..
3번비트는 0x2200 0092번지..


이렇게 보면 간단한 식으로 설명할수가 있다.

bit_word_addr = bit_band_base + (byte_offset * 32) + (bit_number * 4)

bit_band_base는 SRAM에서는 0x2200 0000 이 될것이고  
                   Paripheral에서는 0x4400 0000 이 될것이다.

byte_offset는 구하고자하는 주소에서  SRAM에서는 0x2000 0000 을 빼준것이 될것이고  
                                   Paripheral에서는 0x4000 0000 을 빼준것이 될것이다

ex) 0x2000 00400 번지의 2번 비트에 해당하는 alias의 영역 번지를 구하여라~
  0x2200 8008=0x2200 0000 + 0x400 * 0x20(dec 32) + (2 * 4) 

그니깐..여기서 주의 해야 할점은. 32곱해주기전 32가 10진수이니 HEX(16진수)로 타입을 바꾸어서 계산을 해야 합니다.

저는 이부분에서 ..민망한 실수를 했군요.ㅜ흑..

(편의상 hex값을 4자리로 나눠서 보기 싶게 해놓았음.)
8Bit=1Byte  그러므로 32Bit=4Byte

다른 티스토리 사용자의 내용을 조금 .. 담아본다.. --추가내용--
출처: http://todayis.tistory.com/254


위 그림에서 붉은 박스로 된 부분, 즉 SRAM과 Peripheral의 하위 0x03FFFFFF 영역을 보면 1MB의 Bit Band region32MB의 Bit Band alias로 되어있다.

Cortex M3 이전의 ARM7, ARM9 등의 CPU에서 SRAM이나 Peripheral Memory 영역에 bit 연산을 하기 위해서는 AND 나 OR 연산을 사용해서 프로그래밍을 했다. 이러한 방법은 읽기, 수정, 쓰기 작업을 하는데 있어서 set, clear 등의 작업을 통한 많은 작업이 필요했다.
하지만, Cortex M3에서는 bit banding를 사용함으로 alias된 영역의 한 바이트에 값을 넣어주는 방식으로 원하는 bit에 접근을 할 수 있다.

왼쪽은 기존의 ARM7, ARM9에서 사용하던 bit 연산이고, 오른쪽이 Cortex M3에서 사용하는 Bit Banding 방식이다.

기존의 bit 연산을 보면 01001011 이라는 값에서 하위 세번 째 비트를 1로 세팅하기 위해 11111111 과 or 연산을 한다. 이렇듯 bit 연산을 하기 위새 AND 혹은 OR 연산을 통해 Mask를 하거나 다른 작업을 하게 된다. 이는 생각보다 많은 CPU 타임을 잡아먹는다고 한다.

Cortex M3에서의 bit banding를 보면..
실제 수정을 가할 32bit의 메모리 공간(0x20000000 ~ 0x200FFFFF)이 있고, 이 영역에 alias 된 가상의 메모리 공간(0x22000000 ~ 0x23FFFFFF)가 존재한다. 오른쪽 그림을 보면 왠지 감이 올듯도 한데.. alias 된 메모리 공간의 각 바이트들은 실제 bit banding 영역의 한 비트와 매칭된다. alias 된 가상의 메모리 공간의 한 바이트에 값을 넣게 되면 이와 매칭되는 실제 bit banding 메모리 공간(한 비트)에 프로그래밍 한 것과 동일한 효과를 갖는 것이다.
AND 나 OR 연산을 하지 않고 SRAM이나 Peripheral의 특정 메모리 영역에 별다른 instruction 없이 원하는 값을 쓰거나 읽기만 하면 되는 것이다. 이를 Cortex M3에서는 H/W 적으로 구현이 되어있다.




 

제가 요즘 관심 있어 하는것중 하나입니다~  농구도 그렇고 독학만 하네요-_-;;ㅋ  독학이 최고인듯 ㅋㅋㅋㅋ

 

아~ 그리고 epic 메인에 안떠서 부담이 줄어든것도 있지만~ 활동을 별로 안해서 미안하기도 하네요;;

 

TR 을 써야 되는데 TR 이 없는 관계로 common을 바로 포트랑 연결 시켜 버렸습니다~ 조금 복잡죠?ㅋ

 

 칩은 74ls47 인데 abcd 입력을받고 8개를 fnd로 뿌려줍니다~  abcd 입력은 포트 0~3 으로 잡았고요~^^

 

방식은 Static Display 방식이랑 Dynamic Display 방식이 있네요~ 

 

Static Display

 

간단하게 Static display 방식은 같은시간에 신호를 줘서 동시에 점등이됩니다~  그러니 Dynamic 보다 소비전력이

 

많고 표시 자리수가 많아질수록 복잡해지죵~ㅋ 그러나 cpu의 부담이 적죠~

 

Dynamic Display( Multiplexing Display)

 

cpu가 각 자리의  FND led의 데이터를 반복적으로 출력하면서 한번에 한자리씩만을 점등하는 방식이죵~

 

만약 12를 나타 낸다면   1을 나타내는 표시데이터와 10자리수니깐 위치를 선택하는 데이터를

 

출력하고 딜레이 준다음 2를 나타내는 표시데이터와 1자리수이니깐 위치를 선택하는데이터를 출력한다

 

이게 순차적으로 반복되면 눈의 잔상효과로 계속 켜져있는것으로 보게 되는거죵~

 

led를 계속 반복해야하니깐 cpu에 부담이 가지만~ 어느순간에든지 led 는 한개만 켜지게 되는 상황이니 소비전력이

 

적어지고  표시자리수가 많아져도 회로가 간단합니다~

 

 

 

 

밑의 회로는 7447입니다 74LS47 라이브러리가 없어서 만들기도뭐하고 ㅋㅋ 해서 그냥 있는걸로 만들었네요~-_-;

 

대략 이런게 다이나믹 구조입니다. 그리고 PORTA 만사용해서 표시해놨어요~

 이놈이 74ls47 입니다.

최소입력은 a0~a3
9~15번핀 연결 하시면 됩니다.  나머진 안써도 되는!

 


이것을 보라! 이것을 보면 다 나와있도다

0x00 = 0 = 0000
0x01 = 1 = 0001
0x02 = 2 = 0010
0x03 = 3 = 0011
 ...
.
.
0x0e = 14 = 0111
0x0f =  15 = 1111

여기서  0x 로 시작하는건 16진수 옆에는 10진수  그리고 옆에 4자리숫자로 된건 2진수라네::

그럼 됬도다~ 
3을 나타내고 싶다면 2진수로  0        1    1 이니 
                                        a1   a2  a3  a4

그러니 a3와 a4에 high 해주면 된다라는 말일세 AVR이 Automatic Voltage Regulator 라는 소리 알겠지?

cmos,HC과 LS에서는 High 나타내는게 조금 다르다네: 그건  여기 를 참고하게나

(애노드타입 ,7447 래치, s-5101asr,atmega 128

 

증상 :
device missing or unknown device [-24]

대부분의 경우 외부 크리스탈로 내부 클럭으로 사용하도록 설정해서 사용하거나, EMI같은 원인으로 퓨즈비트 세팅이 바뀌어 장치인식을 못하게 되는 경우입니다.

이 경우 강제로 외부 클럭(8MHz 전후)을 넣어주어 살릴 수가 있습니다. (일명 인공호흡)
아래 그림과 같이 오실레이터를 연결하면 OUTPUT 신호가 나오게 됩니다. 이 신호를 AVR칩의 XTAL1에 강제로 넣어주고 AVR칩에 전원을 넣으면 동작이 될 겁니다.

다시 퓨즈비트를 사용하고자 하는 것으로 write 하고 다시 읽어 확인한후 전원을 끄고 원래 크리스탈을 꼽아서 사용하시면 됩니다.


+ Recent posts