페이지

글목록

2016년 9월 28일 수요일

[IC 소개] wifi+Bluetooth IC ESP32 를 사용해 볼 예정입니다.

ESP32 IC로 된 wifi+bluetooth 모듈에 대해서 알아보다가, 국내 대리점인 IDK에 연락을 해 봤습니다.

인터넷에서 보기를 블루투스가 아직 테스트 안됐다고 했는데, 실제로 업체와 연락을 해 보니 거의? 다 됐다고 하네요.

http://www.idktech.co.kr/


이 칩은 아직 안 써봤는데, 듀얼코어라서 wireless 통신 외의 응용 프로그램도 어느 정도 돌아갈 것 같습니다.
속도도 240MHz 라서, 현재 STM32F4xx 의 속도를 2배 상회하네요.

가격도 1만개 베이스에 $2 초반이라고 하니 가성비가 좋군요.

다이렉트 와이파이가 지원되어 제가 쓰려고 했던 아트멜 AT1500 모듈을 대체할 수 있고, BLE도 같이 쓰려고 했는데
class 1,2,3,BLE 4.2 모두 지원한다고 하니 단 1개의 모듈로 2가지를 해결할 수 있게 되었습니다.

와이파이와 Bluetooth 를 제어하면서 어플리케이션 프로그램도 무리없이 돌아간다면 할 수 있는 것이 정말 많을 것 같습니다.

DMA도 들어 있으니 정말 괜찮은 것 같아요.

펌웨어 다운로드는 UART로 가능하다고 합니다.

다음주에 개발 보드가 준비된다고 하니, 다음 주부터 테스트를 진행해 볼 예정입니다.

다음 주가 기대 됩니다. ^^

[핀맵]


조금 더 조사를 해 봤습니다.
현재 ESP32 CPU로 만든 모듈은 2가지가 있었습니다.
저도 처음이라 위의 그림에 나온 모듈이 둘 다 똑같은 것으로 알았는데, 위의 모듈(ESP3212) 과 아래 모듈(ESP-WROOM-32)는
다른 것이었네요. 혼란을 드려서 죄송합니다.

ESP-WROOM-32 모듈은 칩 제조사인 espressif 서 만든 reference 모듈이고 ESP3212 모듈은 다른 회사에서 만든 모듈입니다.
주로 ESP3212가 많이 양산이되어 시중에 유통되고 있고, ESP-WROOM-32는 판매처가 잘 안보이네요.

아래 그림은 현재 생산되는 ESP32 모듈을 보여주고 있습니다.




다음은 2개의 모듈의 차이인데, 핀 수가 다릅니다. ESP-3212 모듈은 SD-CARD 관련 핀이 없네요.


다음은 ESP32 IC에서 각각의 모듈과의 핀 차이입니다.
ESP-WROOM-32 에서는 IC에서 2핀이 빠져있습니다.


ESP-3212 모듈은 IC에서 8핀이나 빠져 있습니다.


빠진 핀은 ADC 관련 기능을 사용할 경우 270pF 을 연결한다고 하네요. 
그러므로 ESP32-WROOM-32 는  ESP32 IC 하고 다 연결된 것으로 보이고,
ESP3212 는 SD-CARD 연결 핀만 빠진 것으로 보면 되겠습니다.




2016년 9월 1일 목요일

[STM32F4xx] Nucleo 보드 테스트 #15(uSD Card Read(DMA,4Bit):KEIL)

휴, 안도의 한숨이 나옵니다.
일주일 가량의 시간이 걸려 SDIO(4Bit Bus Width, DMA) 로 micro-SD Card 읽기를 성공했네요.

속도는 약 8.23 MByte / s  정도 나오네요. 아마도 오실로 스코프 상에서는 좀 더 빨라서 9 MBte /s 에 더 가까울 것 같습니다.
DMA를 사용하지 않았을 때는 1.2 MByte / s 정도 나왔으니 8배 정도 빠를 것 같습니다.


검색해 보니, 현재 SD 카드가 엄청 느린 녀석이었는데 좀 더 좋은 것을 쓰면 속도가 더 나올 수 있는 것 같습니다.
어떤 사람은 19 MByte/s 까지 나온다고 합니다. (링크)



DMA 의 개념은, 보통 메모리에 있는 데이터를 읽어서 SPI/UART/SDIO 통신으로 내보내는 경우에 메모리에서 데이터를 읽는 시간이 상당이 걸리는데 그 시간을 줄이는 목적이 있습니다. 
다른 좋은 장점이 또 있을 것 같은데요, 일단은 제가 실감한 것이 그렇습니다.

예를 들자면 다음과 같은 그림으로 잘 설명이 될 것 같습니다.


실제로 제가 측정한 내용은 위와같이, 데이터를 읽는 시간이 SDIO로 보내는 시간 보다 엄청 걸렸습니다. 
위의 그림과 예전의 테스트 상황이 99.9%(?) 일치 했습니다. ^^

그림으로 보니 엄청 빨라질 것 같죠? (DMA를 쓰면 빨라 집니다. 확실히~)

먼저 

이제 DMA를 사용하려다가 몇가지 복병을 만났었는데, 소개해 볼 까 합니다.
(참고로 저는 Receive 동작만 테스트 했습니다)
1. DMA RX 인터럽트 추가한 후, 인터럽트 번호를 잘 설정해 줄 것.
2. DMA 로 f_read 함수를 실행 시, BLOCK_SIZE(512 Byte) 이상을 읽으면 Err 리턴을 무시할 것.
   그리고, 또 한가지.. CUBE 툴에서 생성해 주는 코드에 오류가 있다고 합니다. 
3. 4G u-SD 카드 동작시 SD_read() 함수 입력 변수 계산 방식 수정.(아직 테스트는 못 해봄. 4G 이상 sd-card 없음)

위와 같은 내용을 문제를 해결했습니다.


위 내용의 해결 과정에 앞서서, 일반 polling 방식을 DMA 방식으로 바꾸는 방법을 알아보겠습니다.
저는 거의 모든 STM32 시리즈의 SDIO,u-SD Card 문서 및 웹사이트를 다 돌아 다니면서 코드를 분석도 해 봤는데 별로 건지지 못했고, 노가다 테스트로 해결했습니다.


결론은.. 진짜, 쉽습니다. 

Cube 툴로 생성된 Keil 소스코드에서, Middlewares/FatFs 폴더의 sd_diskio.c 를 열어서 SD_read()함수의 내부 코드를 바꾸면 됩니다.
SD_read() 함수 내의 폴링 방식의 Read 함수인 BSP_SD_ReadBlocks 를 BSP_SD_ReadBlocks_DMA 로,
   단지 이름만 바꿔 주면 됩니다.


그럼 다음으로 제가 만난 복병과 그 해결 방법을 설명 드리겟습니다.
먼저 위에 그림에서 추가로 4gb이상의 sd Card를 읽을 때, 수정해야 하는 내용이 먼저 나와서,
4g sd-card가 없어서 아직 테스트는 못해 봤지만 코드의 수정 내용을 알려 드립니다.

[4gb 이상의 SD Card Access 시 수정할 사항]
현재 sd_diskio.c 파일 내에 있는 SD_read 함수 내부의 코드에서 
BSD_SD_ReadBlocks/BSD_SD_ReadBlocks_DMA 함수의 2번째 파라 메터의 계산 식이 틀려서 4gb 이상의 Sd card가 Access 되지 않는다고 합니다.
 (uint64_t) (sector * BLOCK_SIZE) 을 ((uint64_t) sector * BLOCK_SIZE)로 수정하면 된다고 하네요.

다음은 4gb sd card 이상의 동작에서 오류 수정을 당부하는 내용의 원문입니다. [링크]

[DMA로 수정한 상태에서 f_read 동작이 안되는 경우]
제가 처음에 SD_read 함수에서 BSP_SD_ReadBlocks() 함수를 BSP_SD_ReadBlocks_DMA()함수로 바꿨는데 프로그램이 멈춰버리더군요. 원인은 우연히 찾았는데, DMA 인터럽트 우선순위를 CUBE 툴에서 설정하지 않아서 우선순위가 0으로 되어 있었던 것을 Rx는 1, Tx는 2 로 수정을 했더니 프로그램이 정상 동작을 했습니다.
CUBE 툴에서 인터럽트 우선 순위는 따로 사용자가 결정을 해 줘야 하는 것 같습니다.



[DMA로 수정한 상태에서 BLOCK_SIZE(512 Byte) 이상을 읽으면, f_read() 함수의 return 값이 Error을 리턴한다]
위의 소제목과 같이 Error를 리턴 합니다만, 그냥 무시하고 쓰면 됩니다. 
원인을 찾아서 고치면 좋겠는데, 시간과 능력이 부족하여 저는 그냥 쓰기로 했습니다.
이상하게, 에러는 발생하지만 동작에는 문제가 없었습니다.
(현재 프로그램을 정리하다 보니 이 현상이 없어 졌는데, 조금 더 두고 봐야 겠습니다)

참고로, 인터넷에서 알랑방구 좀 뀌는 외국인의 글을 소개하자면..
u-SD Card 속도를 올리기 위해서는 다음같은 사항을 점검하라고 하네요.
1. 데이터 버스폭은 4Bit 로 했는지 검토.
2. 코드를 DMA로 바꿨는지 검토.
3. 클럭 스피드 검토(Cube 툴에서 기본 설정: 24MHz, 최대 48MHz)

^^   저는 이 분이, sd 카드 DMA에 대해서 알려 주는 것도 같지만.. 지가 한 내용을 가지고 속도 빠르다고 자랑하는 것 같아 보였어요. 소스 코드도 옛날 것이고 받은 코드도 파일이 좀 빠져 있고, 결국엔 아무 도움도 안됐네요.

다만, DMA를 사용하면 빨라진다는 정도만 소득으로 얻었습니다.(링크 주소)


마지막으로 제가 첨부하는 예제의 설명 입니다.
여러가지 테스트 함수들이 들어 있는데, 소스 코드 보시고 참고하시고.. 실제로 실행되는 함수는 read_BMP_file_DMA() 함수입니다.
이 함수 내부의 GPIO ON/OFF 코드는 오실로 스코프로 DMA 시간 테스트를 위해서 만들어 놓은 것이니 괜히 고민하지 마시길 바랍니다. 또한 __nop() 함수는 MCU가 100MHz 동작하니까, 오실로 스코프로 봐도 GPIO 변환 지점이 잘 안보여서 딜레이 대용으로 넣은 것이니 신경 쓰지 않으셔도 됩니다.

예제 코드에서는 64x64 BMP 파일을 DMA 읽어서 UART2 포트로 전부 뿌리도록 되어 있습니다.
UART 출력 결과는 다음과 같습니다.

아가~~ ㄱ ^^ 
정말로 중요한 내용이 빠졌네요.
f_read 에서 한 번에 많은 데이터를 읽을 때, 데이터 버퍼의 크기에 맞게 스택 사이즈 늘려주셔야 합니다.
이전에 다룬 내용을 참고 하시기 바랍니다 


제가 테스트한 보드에서 사용된 MCU의 핀맵입니다.

소스 코드 [링크]


하하~~ 이런.. f_read 함수의 리턴값이 글쓰면서 제대로

 FR_OK(0)으로 되어 있네요. 아 괜히 삽질했던거냥?

 ㅜㅜ. 

걍 BSP_SD_ReadBlocks 을 BSP_SD_ReadBlocks_DMA 

로만 바꾸면 되는 거였네요.


아~~ 억울하다.. ㅠㅠ

2016년 8월 29일 월요일

[라즈3] 와이파이 잡고 유튜브를 보다.

초보가 라즈3에 기본 장착되어 있는 브로드컴 와이파이 칩을 통해서 유튜브를 봤습니다.

이건 간단해서 어느 사이트도 참고할 필요가 없었습니다.

와이파이 접속방법은 우측 위에 클릭.. 걍 그림으로 설명할께요.






2016년 8월 28일 일요일

[라즈3] 인스톨하니 화면이 바로 나오네요. ^^

회사에서 얼마전에 라즈3를 샀었는데,  바빠서 그냥 놔뒀다가 인터넷 보고 따라하니 바로 HDMI 로 화면이 나오네요.


회사에 HDMI 모니터는 40인치 1개 밖에 없어서 여기에 연결했습니다.

잉? 마우스 없네? 아...!!!! USB 포트가 있었군 . 마우스를 여기 꼽으니 바로 화살표가 움직이네요.


와~ 뭐 이리 쉽지? 일단 설치 성공.

제가 따라한 웹사이트 주소는 다음과 같습니다.

2016년 8월 26일 금요일

[PSOC] PSOC4 UART 부트로더가 내장된 키트 소개(049)

이번에 PSOC4 보드(C8CKIT-049)를 여러 개 샀습니다.



저렴해서 ($4) 여러개 구입했는데, 비슷하게 생긴 보드(C8CKIT-043) 와 다른 점은 JTAG 가 포함되지 않은 점입니다.
또한 USB-to-I2C 도 포함되어 있지 않네요. I2C는 CAPSENSOR 튜닝할 때 필수인데... 없군요.


따라서 프로그램할 수 있는 방법이 없기 때문에, UART 부트로더가 내장되어 있습니다.
전원을 넣을 때, Switch 를 누른 상태로 전원을 넣으면 부드로더 모드가 되서 PSOC Creator 에서 UART로 프로그램을 다운로드할 수 있습니다.

자세한 내용은 다음에 좀 더 시간이 나면 올리겠고,,,
CY8CKIT-049 보드에 대해서 평가를 하자면, UART 부트로더를 테스트할 수 있어서 좋았지만
몇천원 더 주고 043 보드를 사는 것이 훨씬 낫다. 입니다.

JTAG와 USB-I2C 가 없어서 아주 많은 기능을 못 쓰게 되니 1개 사실 때는 043 보드가 좋고,
여러개 사실 때는 043 보드 1개에 049 보드 여러개 사시던가, 디버거가 있으시면 049 보드만 사도 괜 찮겠습니다.

[STM32F4xx] Nucleo 보드 테스트 #14(USE_LFN:KEIL)

다음은 USE_LFN(Use Long Filename) 설정하는 방법에 대해서 알아 보겠습니다.

아주 오래 전에 윈도우에서 dir 하고 command line 명령을 치면,
파일명이 xxxxx~1 라고 나온 경험이 좀 있으실 겁니다.

파일 이름이 긴 파일을 표시하지 못하는 경우입니다. 
이것을 해결하는 방법은 간단합니다.

큐브 툴에서 Configuration 을 클릭해서 창이 하나 뜨고 거기에서 FATFS 를 클릭합니다.
그러면 다시 FATFS Configuration 창이 하나 뜨는데, 
여기서 Locale and Namespace Parameters 의 USE_LFN 항목을 클릭하여 Disable 되어 있던 것을 
Enable with static working buffer on the BSS(1) 로 바꿔 주면 됩니다.

그런 다음 project > Generate Code 하시고 Keil 컴파일러에서 컴파일해서 STM32f4xx 보드에 다운로드하고 실행하면
다음과 같이 긴 파일 이름을 쓰실 수 있습니다.

13,14 글에 대한 소스코트 첨부 합니다.

2016년 8월 25일 목요일

[STM32F4xx] Nucleo 보드 테스트 #13(f_read 함수 과 stack:KEIL)

안녕하세요,

요 근래, 파일 시스템 테스트 하다가 안되서 고생고생 했네요.

그 고생한 내용은 다음과 같습니다.

파일 관련 함수는 거의 다 테스트를 했는데, f_read() 함수만 유독 실행이 될 때도 있고, 
어떤 때는 계속 실행이 안되고 Hardfault Error 인터럽트로 점프해서 멈춰 있었습니다.

같은(거의 비슷한?) 입력 파라메터를 갖고 있는 f_write() 함수는 또 잘 된다.
FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from a file */
FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to a file */

하~.., 그래서 사용자 함수를 하나 만들어서 파라메터를 f_read() 와 같이 정의를 해서 테스트를 해보니 f_read()함수와 같은 증상이 발생. ㅜㅜ

안되는 원인을 찾아 보려고 f_read()함수의 파라메터의 입력을 각각 1가지씩 사용자 함수에 적용해서 테스트를 해 봤더니,
입력 인자 중 void* buff 가 문제였습니다.

원인은 입력 인자인 배열(void *buff)을 f_write()에서 보다 많이 잡아서 Stack overflow 가 걸리는 것이었습니다.

에러가 나면 스택 오버플로우 인지 확인도 못하고(혹시 아시는 분 있으시면 방법을 알려 주시면 감사하겠습니다),
그냥 프로그램이 멈춰버리니.. 며칠을 밤새고 나서야 찾을 수 있었습니다.

이번 글의 요점은, 파일 시스템 관련 함수를 사용할 경우에는 스텍을 충분히 확보하라 입니다.

그럼, 다음은 스텍을 늘리는 방법입니다. 방법은 2가지가 있네요.
1. startup_stm32f411xe.s 파일을 열어서 다음과 같이 스택 사이즈를 변경합니다.

2. CUBE 툴에서 project > Setting 메뉴에서 수정할 수도 있습니다. (저는 큐브 툴로 KEIL 소스를 만들어서 이런 방법도 있음을 알려 드립니다)

스택이 0x400 일 때 멈춰버린 프로그램이..

스택을 0x800 으로 고치니까 아주 잘 됩니다. 잘 되서 f_lseek()함수도 사용해서 파일의 offset를 막 이동해 가면서 읽어서 UART로 마구마구 뿌려 댔습니다. ^^

그런데, 나중에 알게된 사실인데... 

큐브 툴의 Help 메뉴를 누르면 UM1718.pdf 파일이 열리는데, 이 곳의 7번의 제목의 글에 스택을 충분이 할당하라는 내용이 약간 나옵니다. ㅜㅜ 저와 같은 문제로 고생하는 사람이 많진 않지만 약간 있나 봅니다.
많았으면 반드시 스택을 많이 잡고 시작하라고 했을 텐데.


그리고 이 PDF의 파일 시스템 예제가 인터넷에 돌아다니는 예제 보다, 가장 잘 나온 것 같습니다.
참고하시면 도움이 될 것 같습니다.

2016년 8월 18일 목요일

장난감 구입 했습니다.

이번에 새로 구입한 장난감입니다. ^^

새로 산 장난감 목록은 다음과 같습니다.
1. STMicro 사에서 나온 레이저 거리 측정 센서와 3각 측량법 알고리즘을 구현하기위한 MCU 보드(STM32F401) 

2. TI 에서 새로 나온 Sub-1GHz 대역 주파수를 사용하는 RF 통신 MCU (CC1310 : Cortex-M3) 키트 2셋


3. 라즈베리파이 3

2016년 8월 16일 화요일

[STM32F4xx] Nucleo 보드 테스트 #12(printf 함수 사용:KEIL)

STM32F4xx에서 uart2 로 printf()함수를 사용하는 방법을 테스트 해보고 정보를 공유합니다.

다음과 같은 코드를 main.c 파일에 추가하면 됩니다.

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 1);
return ch;
}

이 코드를 추가하기 전에 huart2 는 정의를 해야겠죠.
그리고 uart HAL 함수 HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 1); 를 사용해서 폴링으로 1Byte 전송하도록 되어 잇습니다.

2016년 8월 11일 목요일

[STM32F4xx] Nucleo 보드 테스트 #11(GPIO 병렬 출력:KEIL)

이번에는 GPIO에 여러핀을 동시에 출력하는 방법을 알아보겠습니다.

핀 설정도 동시에 할 순 있는데, 좀 귀찮아서 핀설정은 각 핀마다 했습니다.

이제 제가 프로젝트를 시작해야 해서, 프로젝트에서 사용해야 할 핀들을 다 포함시킨 상태에서
GPIO 병렬 포트로 사용할 핀을 지정을 해 봤습니다.

GPIO 설정은 Cube 툴에서 할 수 없으니까, 핀이 표시가 되지 않아서 따로 사용할 핀을 정리해 봤습니다.

그리고 현재 사용한 Nucleo 보드에서 핀헤더의 위치도 표시해 봤습니다.


자.. 그럼 핀 설정은 정리해 보자면,
DATA[7:2] : PA15,14,13,12,11,10
DATA[1:0] : PC7,6
SYNC CLK : PB5

핀 설정 코드는 1핀마다 설정을 했더니 너무 길어서 소스코드 첨부해 놓을 테니 참고하시기 바람니다.
main.c 파일 안에 static void MX_GPIO_Init(void) 함수 보시면 되겠습니다.

이렇게 설정을 했습니다. 간단히 설명을 해 보자면, SYNC CLK 의 Rising Edge 마다 8비트 데이터를 출력 하는 테스트 입니다.
8비트 병렬 통신을 구현할 생각이고, STM 칩으로 8비트 데이터를 보내고 SYNC 출력을 1번 내보내는 겁니다.

8번 출력(0x01->0x02->0x04->0x08->0x10->0x20->0x40->0x80) 을 반복해서 내보내도록 했습니다.

다음은 main.c 의 main()함수의 주요 동작 코드입니다.

  for (i=0;i<8 8="" i="" span="">
  {
par_data[i] = (1&lt;&lt; i);
      // (0x01-&gt;0x02-&gt;0x04-&gt;0x08-&gt;0x10-&gt;0x20-&gt;0x40-&gt;0x80) 데이터 생성
  }

  while (1)
  {
par_ReAssemble(par_data,8);
       // (0x01-&gt;0x02-&gt;0x04-&gt;0x08-&gt;0x10-&gt;0x20-&gt;0x40-&gt;0x80) 데이터 출력 + SYNC_CLK 출력
HAL_Delay(1);
  }



현재 핀을 여러용도록 사용했더니, 출력할 포트가 2개로 나뉘어 버려서 8비트 데이터를 재정렬하도록 프로그램을 만들었습니다.
재정렬 함수의 코드는 다음과 같습니다.
void par_ReAssemble(uint8_t *par_data,uint16_t cnt_data)
{
uint16_t i;
for (i=0;i
{
// DATA[7:2] : PA15,14,13,12,11,10
GPIOA-&gt;ODR = (((uint32_t)par_data[i]) &lt;&lt; 8)&amp;0xFC00;
// DATA[1:0] : PC7,6
GPIOC-&gt;ODR = (((uint32_t)par_data[i]) &lt;&lt; 6)&amp;0x00C0;
//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET);
//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_RESET);
GPIOB-&gt;BSRR = GPIO_PIN_5;
GPIOB-&gt;BSRR = (GPIO_PIN_5&lt;<16 16="" div="">
}
}

위의 함수에서 GPIOA-&gt;ODR 이 보이시죠?
이 레지스터가 각각 16비트폭으로서, 병렬 포트를 출력하도록 하는 레지스터입니다.
쉬프트 연산과 마스크 연산을 해서 병렬포트 출력 레지스터에 값을 쓰면 해단 핀들로 0또는 1이 출력 됩니다.

1비트 출력은 2가지 방법이 있습니다.
1. HAL 드라이버에서 제공하는 함수를 사용.
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET);
2. 직접 레지스터에 쓰기.
GPIOB-&gt;BSRR = GPIO_PIN_5;
GPIOB-&gt;BSRR = (GPIO_PIN_5&lt;<16 16="" div="">

HAL_GPIO_WritePin 함수는 누구나 인식하기 쉬워서 보면 아시겠고,
BSRR 레지스터는 32비트 구조인데, 1을 해당 비트에 써주면 하위 16비트는 SET, 상위 16비트는 RESET 기능을 합니다.

위에서 2가지 방법이 있다고 했는데, 사실은 HAL.. 함수에서 BSRR 레지스터를 사용하고 있어서 본래는 1가지 방법입니다.
그런데 제가 왜 레지스터에 집접 썼는가 하면 HAL.. 함수가 너무 느려서 입니다. 
테스트를 해 본 결과, 레지스터를 사용한 방법보다 2배나 느리더군요.

다음은 같은 동작을 수행했을 때, 왼쪽이 HAL 함수, 오른쪽이 레지스터에 직접 쓴 방법을 사용한 결과 입니다.

다음은 8비트로 1바이트를 보냈을 때, 직접 속도를 계산해 봤습니다. 


나중에 설명을 하려고 했는데, 먼저 해 버렸네요.
이게 제가 알려드리고자 한 핵심이고 앞으로 설명할 나머지는 크게 중요하진 않습니다.

사용자의 편의성이냐? 속도냐? 둘 중 하나를 선택하시면 됩니다.

그런데.. 저 파형이 링잉이 발생하는게 거슬리네요. 파형이 원래 그런것인지 오실로 스코프가 문제인지.. 궁금하네요. 내일 오실로 스코프 바꿔서 테스트 해 봐야겠습니다.


다음은 HAL 함수를 사용해서 프로그램을 돌려 본 결과 입니다.
검증을 위해 4채널 오실로 스코프를 이용해서 1로 예상되는 포인트만 찍었습니다. 9개의 신호를 한번에 찍을 수가 없어서 3개의 프로브를 나눠서 측정을 했습니다.

[ SYNC_CLK 와 DATA 0,1,2 ]

[ SYNC_CLK 와 DATA 2,3,4 ]

[ SYNC_CLK 와 DATA 5,6,7 ]


다행이 예상대로 잘 나왔네요.

그럼 이만 마치겠습니다.

소스 코드 첨부 합니다.

2016년 8월 10일 수요일

리눅스 보드 소개 [나노파이 네오]

요새 이렇게 싸게 나와도 되는 겁니까? ^^

리눅스 보드가 $7.99 밖에 안하군요.

주소 링크는 여기요.!