구글 크롬을 실행하고, 다음의 사이트로 갑니다.


여기서 platform -> Development Boards 로 가서, Boards 를 클릭해 주면 이 사이트에서 컴파일할 수 있는 보드들의 목록이 나옵니다.





저는 STM32F411 MCU로 된 NUCLEO-F411 을 갖고 있는데, 미리 지원하는 보드를 알아보고 국내 판매 사이트에서 1개 사셔도 괜찮겠습니다. 어떤 것은 1만원 정도밖에 안하네요.
게중에 NECLEO-F103RB는 아두이노를 이식할 수도 있으니 재밌는 작업을 많이 할 수 있겠네요.
제가 사용하는 보드가 여기 있네요. NECLEO-F411RE



$12.74 밖에 안한답니다.



다시 home 으로 이동해서 developer Resource 를 클릭한 다음 Compiler를 클릭합니다.



그러면, 회원 가입하는 화면이 나옵니다. 여기 가입해야만 컴파일러를 쓰실 수 있습니다. ^^



log in 하면, 크롬 웹에서 바로 컴파일러가 실행 되는데, 저는 이전에 Platform을 선택했나 봅니다. 이전에 테스트 한 프로젝트가 서버에 기록되어 있군요. 혹시 Platform 을 선택하지 않았거나 추가할 경우는 오른쪽 위의 그림을 클릭 해 주시면 됩니다. Platform을 선택하지 않았으면 자동으로 선택 창이 뜰 것 같은데.. 이전의 상황이 기억이 안나는군요.



다음은 위에서 클릭하면 뜬다고 설명했던 platform 선택 및 추가 하는 창입니다.



플랫폼 선택하고 나서, 새로운 프로그램을 하나 만들어 봅시다. 왼쪽 위에 new를 누르면 창이 하나 뜸니다.



해당하는 보드의 플랫폼을 선택하고 탬플릿을 눌러 보면 다양한 예제들이 나옵니다. 제가 Cube 툴과 Keil 툴로 개고생해서 만들었던 예제들이 다 들어 있네요. ㅠㅠ SDIO 로 구현한 u-SD-Card 예제는 없네요.



Blinky LED test for the ST Nucleo boards 플랫폼을 선택해서 프로그램을 하나 만들어 봅니다.



OK 를 누르면 다음과 같은 창이 뜨고, 컴파일 버튼을 눌러 봅니다.



컴파일 버튼을 누르면 프로그램이 컴파일되고 난 결과물인 Nucleo_blink_led_NUCLEO_F411RE.bin 파일이 자동으로 다운로드 폴더에 저장 됩니다.



이 파일을 폴더 열기로 열어서, bin 파일을 ST-LINK 디버거에 의해 자동으로 생성된 USB DISK인 NODE_F411RE(J:) 에 드래그-앤-드롭 해 주면 자동으로 프로그램이 STM32F411 MCU에 다운로드된 후, 프로그램이 실행됩니다.


Nucleo 보드의 녹색 LED가 깜박깜박 하고 있군요. ^^


이번에는 SPI 통신을 테스트 해 봤습니다.


원래는 WIFI 모듈을 연결하여 테스트를 진행하려고 했는데, 
회사에서 WIFI 모듈은 잠깐 미뤄두고 급한 일을 먼저 처리하라고 해서..
IC를 연결하지 않고 SPI Write만 동작시키고, 파형만 오실로 스코프로 찍어 봤습니다.


Nucleo 보드의 SPI 용 핀 할당은 다음과 같습니다.



STM32F411 의 SPI용  핀할당 내용입니다.
SPI_CS 는 일반 GPIO로 제어했습니다.



아무 설정도 안하고 기본 SPI 스피드는 42MHz 입니다. Cube 툴에 표시 되네요.



다음은 SPI_CS 를 일반 GPIO 출력으로 설정하는 코드 예제입니다.
PA8 핀을 사용했습니다. 설정은 내부 풀업,출력,Fast Speed,초기값 HIGH  입니다.



기본 SPI_CLK 스피드인 42MHz 로 출력을 테스트 해 보니, 오실로 스코프가 파형을 못 쫒아가서 파형이 엉망으로 나오네요.



다음은 42MHz SPI CLK 확대한 그림입니다. 스코프가 못 쫒아갑니다. 오실로 스코프 회사에 연락해 보니, 측정할 클럭의 10배는 되야 보인다 하더군요. 42MHz 이면 500MHz 오실로 스코프가 필요하단 말이네요. 제가 갖고 있는 건, 200MHz 입니다.



다음은 SPI_CLK를 21MHz로 설정한 소스 코드입니다. 



이 코드로 동작시킨 21MHz SPI_CLK 과 파형입니다.



그리고 다음은 21MHz SPI_CLK 확대 파형입니다. 클럭이 잘 보이네요.



그런데 이상한 점은 42MHz 나 21MHz 나 통신 속도가 똑같다는 점입니다.
42MHz가 전송 속도는 21MHz 보다 2배는 빨라야 하는데, 10 Byte 전송 테스트시 같은 시간이 걸린다는 게 좀 의아하네요.

좀 전에, 스코프 회사에서 점검하고 갔는데.. 아무리 해도 개선이 안되네요.
금요일에 300MHz 오실로 스코프를 가지고 온다니까, 스코프가 문제인지 파형이 문제인지 확인할 수 있겠습니다.


DMA 나 인터럽트로 동작시켜야 SPI_CLK 사이의 구간이 짧아 지려나? 
현재는 회사 다음 일정이 바빠서 인터럽트나 DMA 테스트는 나중에 진행하겠고, 
테스트 후에 자료를 다시 올리겠습니다.





테스트 한 소스코드 첨부합니다.

SPI_test.zip


일단 동작이 되서 아무생각 없이 넘어 갔는데,

데이터 전송률을 계산하려다보니 SDIO 클럭을 계산하는 방법을 찾아 봤습니다.

설명이 명확하게 안나온 것인지, 제가 이해를 못 한 것인지 ... 해서 또 노가다를 뛰었습니다.

레퍼런스 메뉴얼에는 다음과 같은 블럭도가 있었습니다.



내용은 SDIO 는 PCLK2 와 SDIOCLK 2개를 사용한다는 것이고,
실제 외부에 나와있는 SDIO_CK 는 SDIOCLK 와 관계가 있고,
SDIOCLK 는 48MHz 이다.

그런데, "SDIOCLK 는 PCLK 와 관계가 없는것인가? " 라는 내용을 잘 찾을 수가 없었습니다.
관계가 있는지 없는지 확인을 해 봤습니다.



APB2CLK 을 2분주하고 SDIO_CK 를 오실로 스코프로 찍어 보니, 아무런 변화가 없었습니다.
즉 PCLK2 하고는 관계가 없다고 볼 수 있겠죠. 그렇다면 SDIOCLK 는 48MHz로 내부에서 PCLK와 상관없이 고정된 틀럭이라고 보면 될 것 같습니다.


그러면 SDIO_CK 는 어떻게 설정을 하는가를 찾아 보니, CUBE 툴에 다음과 같은 내용이 있었습니다.



SDIO_CK = SDIOCLK / [CLKDIV + 2] 라고 되어 있습니다.
현재 설정은 void MX_SDIO_SD_Init() 함수에서 CLKDIV 가 0으로 되어 있으니 SDIO_CK = SDIOCLK(48MHz) / [0 + 2] = 24MHz 입니다.
실제로 오실로 스코프로 봤습니다.



계산상으로 21MHz 이니까, 거의 24MHz 가 나오네요. 대략 맞네요.

그럼 CLKDIV를  2로 해서 4분주를 하면 12MHz 정도 나올 것으로 예상하고 오실로 스코프로 측정을 해 봤습니다.





SDIO_CK 가 계산상으로는 10MHz 로 대략 12MHz 정도로 일치한다고 봅니다. 눈으로 보고 측정을 하니 오차가 좀 있네요.


따라서 결론은,
1. SDIO_CK 는 SDIOCLK 하고만 관계가 있고, 
2. SDIOCLK는 48MHz로 고정된 독립된 클락이다.
3. SDIO_CK 의 속도를 조정하는 공식은 SDIO_CK = SDIOCLK / [CLKDIV + 2] 이다.


+ Recent posts