예제 프로그램을 위의 링크된 사이트에서 다운 받을 수 있는데, 회원을 가입해야 했던 것 같습니다.
STM32F476G Discovery 보드의 예제인데, TIM2 의 CH1을 DMA 트리거 소스로 프로그램 되어 있습니다.
하지만 STM32F411,STM32F446 에서는 TIM2/CH1 을 DMA 소스로 했을 때 트리거 신호가 나오지 않는 문제가 발생했습니다.
아무리 해도 안되서 TIM1/CH1 을 트리거 소스로 사용하니 트리거 신호가 동작했습니다.
원인은 모르겠으나, TIM1 과 TIM2 의 큰 차이는 Repetition Count 가 있고 없고의 차이인데 확실히 트리거 신호가 안나오는 이유는 모르겠지만, TIM1/CH1 은 동작합니다. (원인을 알고 계시면 알려 주시면 감사하겠습니다)
다음은, STM32CubeMX 툴로 프로젝트를 만드는 과정을 그림으로 올려 보겠습니다.
먼저 Pinout 탭에서 사용할 기능을 설정합니다.
NuCleo 보드에서 클럭을 8MHz Bypass 틀락과 32.768 KHz 크리스탈을 사용하므로 RCC를 그에 맞게 설정하고,
트리거 소스로 사용할 TIM1 의 Clock Source 를 Internal Clock, 출력 채널을 PWM Generation CH1 으로 설정합니다.
이 때, GPIO 출력으로 사용할 포트는 CubeMX 툴에 표시되지 않습니다.
실제 Nucleo 보드의 출력핀은 다음과 같습니다.
다음은 큐브 툴에서 Clock을 설정합니다. 입력 클럭 8MHz,32.768 KHz 클럭을 소스로 시스템 클럭은 STM32F446 의 최대 클럭인 180MHz 로 설정을 했습니다. 180MHz 를 쓰고 엔터키만 치만 나머지를 자동으로 맞춰주니 골치아파할 필요가 없습니다.
다음은 TIM1 주기와 듀티 및 DMA 설정을 위해서 CubeMX 툴의 configuration 탭을 선택하고 TIM1 을 클릭합니다.
parameter Setting 에서 제 경험상 가장 빠른 출력 주기인 7로 주기를 설정하고, High 로 유지할 펄스는 2로 설정합니다.
주기를 더 빠르게 하면 트리거 출력이 나오다 없어지거나 처음부터 안나옵니다.
다음은 DMA Setting 입니다.
수정할 부분은 Direction 을 Memory to Peripheral 로 고치고, 저는 Data Width를 Byte로 해서 출력 하려고 Byte로 설정했습니다.
이렇게 하고 나서 Keil compiller 프로젝트 형식으로 소스 코드를 만들기 위해 project/Setting 메뉴에서 Toolchain / IDE 옵션을 MDK-ARM V5 로 선택합니다.
그런 다음, project/Generate Code 를 클릭하면 Keil 프로젝트가 만들어 집니다.
main.c 의 main() 함수에 추가한 내용은 아래 붉은색 네모의 내용이 다 입니다.
그런데 가장 중요한 부분은 stm32f4xx_it.c 에 있는 DMA IRQHandler 함수에 TIM1 을 멈추게 하는 코드를 넣어야 한다는 점입니다.
저는 예제를 받아서 수정을 한 것이 아니고, 참고로 해서 CubeMX 툴에서 다시 만들었기 때문에 main.c 파일만 보고 수정된 부분을 비교해서 수정을 했기 때문에 stm32f4xx_it.c 파일을 수정해야 한다는 생각을 못하고 프로그램을 실행하니 아무리 해도 동작이 안되었습니다. 원인은 이 코드를 수정하지 않아서 트리거 클락이 끝없이 나가는 것이 문제였습니다.
그리고 앞뒤고 트리거 클럭은 더미 클럭이 나가니, GPIO를 사용할 경우 주의하시기 바랍니다. SPI로 동작 시킬 경우에는 데이터에 /CS 데이터를 실어서 출력하면 더미데이터를 신경 안 쓰고 사용할 수 있을 것 같습니다.
이렇게 추가를 하면, host API 폴더에 있는 MBR31xx IC를 콘트롤 할 수 있는 함수들을 사용할 수 있는데, I2C 콤포넌트 이름이 틀리다고 에러가 날 것 입니다.
이 API 함수가 PSOC4와 연동해서 동작하도록 되어 있는데, PSOC5 와 이름만 틀리고 완전히 동일하게 쓰이니까, I2C 함수 이름만 맞게 바꿔 주면 에러가 없어집니다.
컴파일해서 프로그램을 넣으면, 동작이 안되네요.
디버그로 추적해서 보니까, 원인은 예제 프로젝트가 MBR3116 IC 로 되어있고,
제가 사용한 IC는 MBR3108 이어서 ID 비교 시에 오류가 나서 동작이 안됐습니다.
Host_API 폴더안의 CY8CMBR3xxx_Device.h 파일에서 다음과 같이 디바이스 이름을 수정해 주면 정상 동작합니다.
제가 첨부한 PSOC5 프로그램은 예제와는 약간 다릅니다.
인터럽트 방식을 사용하지 않았고, Proximity 센싱 대신에 버튼을 3개 센싱하는 프로그램 입니다.
LED 3개를 host에서 I2C로 제어 합니다.
아쉬운 것이, Proximity Sense 와 Guard Sense 를 테스트 못해봤는데..
PSOC 과는 다르게 버튼을 공통으로 Proximity Sense 와 사용할 수 없었던 점을 미리 알지 못했네요.
Proximity Sense 와 Guard Sense 는 핀이 정해져 있는 것이 좀 다르네요.
또 한가지 아쉬운 점은, 16원짜리 PWM회로 없는 부저를 1개 달았으면 터치키가 눌릴 때 마다 소리가 나서 눌렸다는 정보를 전달해 줄 수 있었는데, 뭐 하는 기능인지 최초 설계시에 잘 몰랐습니다. ㅜㅜ
이 칩을 사용하기 전에 PSOC5 나 PSOC4 에서 CAPSENSE 기능을 사용해 봤었는데,
PSOC에서 CAPSENSE 기능을 사용시에는 너무 반응속도가 늦었습니다. 버튼이 많아질 수록 반응 속도가 더 늦어 져서 거의 사용하기 싫을 정도(?) 였었는데.. 이유는 CAPSENSE 읽는 함수를 여러 번 실행해야 응답이 1번 오는데, 버튼이 더 많아질 수록 더 많이 CAPSENSE 읽는 함수를 실행해야 해서 그렇게 느려졌습니다.
제가 혹시 잘 못 사용하는 것은 아닌지, PSOC에서 CAPSENSE 읽는 속도를 개선하는 방법을 알고 계시는 분이 계시면 좀 알려 주십시요.
결론은, 이 칩(MBR31xxx)를 사용하면 그냥 I2C로 일반 택트 스위치 읽듯이 주기적으로 값을 읽으면 됩니다. 그리고 읽은 정보를 보고 LED 상태를 바꾸고 싶으면 I2C로 LED 상태 변경 명령을 보내면 됩니다. 속도도 전혀 느려지지 않습니다.
정말로, 앞으로 터치 센서를 사용할 경우에는 이 칩만 쓰고 싶습니다. ^^
아~~, 또 한가지 .. PSOC4,5 에서 CAPSENSE 를 연결할 경우 PSOC과 CAPSENSE PCB PAD 와는 거리가 짧아야 하고 센싱 입력 ADC 선을 메쉬 쉴드와 쿠퍼로 감싸줘야 합니다.
그래서 CPU 와 터치 센서와의 위치에 대해서 엄청난 고민을 해서 아트웍과 위치 선정에 어려움이 많았고, 거리도 멀게 배치할 수도 없었는데 이 칩(MBR31xx)가 모든 고민을 해결해 줬습니다.
거리가 멀어도 됩니다. I2C 통신 거리가 보통 1m 정도는 나오니까, PCB 어디에도 터치를 연결할 수 있겠습니다.
또 한가지 장점이 있네요. PSOC에서 CAPSENSE를 사용하려면 IDAC 가 1개 들어갑니다. 만약에 DAC를 사용해야 할 때, CAPSENSE 때문에 DAC가 부족하면 PSOC 중에서 DAC가 1개 더 많은 종류를 선택해야 하는데, 이 경우에 MBR31xx 보다 가격이 더 올라갑니다.
이런 경우 당해 보셨나요? 저는 당해 봤습니다. ^^
아.. 이번에도 참 좋은 IC를 알게 되고 사용해 봤습니다. 앞으로도 많이 사용하게 될 것 같습니다. 이 칩 간만에 본 명품입니다. ^^