카테고리 없음
[STM32F10x] CMSIS와 SPI 초기화 설정 및 데이터 송신법
벅스바니
2010. 2. 12. 16:52
STMicro의 STM32F 제품군은 스펙상으로나 가격면으로 사용하기 딱 적당합니다만,문제는 개발하기가 뭣 같습니다.
세부 스펙을 보시면 전원이나 기능적으로 많이 배려를 해놓은 듯하나,뭔가빠진 듯한 설명에, 어플리케이션 노트를 봐도 정작 S/W부분은 설명이 안되어있고H/W만 디립다 그려서 설명해놓고, 더군다나 ARM에서 제창하는 CMSIS (Cortex Microcontroller Software Interface Standard)라는 소프트웨어 라이브러리 덕분(?)에 기존에 복잡한 하드웨어 스펙을 두고 다시한번 라이브러리를 공부해야한다는 불평이 쏟아져나오고 있습니다.
CMSIS에 대해 한마디 하자면, 인터럽트에 대해 겨우 눈을 깬 ARM사가 다시 MCU에서 CMSIS라는 것을 들고 나와서삽질을 한다는 것입니다.
간단한 비교를 하자면, CMSIS는 WinAPI도 알아야 하는 MFC라고 하면 맞을지요.
어떤 면에서는 그것보다 조금 많이 심하다고 봐야지요.
왜냐면 CMSIS를 이용하려면, 기본적으로 페리 스펙을 알고 있어야하니까요.
그럴바에 간단하게 레지스터를 건드리는 게 낫겠지요.
USB나 Ethernet 같은 프로토콜 스택이 필요한 경우는 이해가 됩니다만,
UART,SPI .. 등등의 간단한 페리조차 CMSIS의 테두리 안에 묶어 놓는것은 절대 비효율이라고 하겠습니다.
CorTex가 많이 퍼지게되면 이식성(Portability)를 높힐 수 있다는 얘기지만, 과연.....
오히려 native레벨로 코딩된 타 코어의 제품을 CMSIS로 옮기는데 엄청난 고생이 각오될 것입니다.
그냥 레지스터만 스펙보고 고치며 될 것을 말이지요..
어쨌거나 그 "CMSIS" 때문에 저도 SPI 구동부분도 혼란을 많이 초래했습니다.
물론 ST의 당황스런 스펙 설명이 더 일조를 했지만요.
그래도 KEIL이 CMSIS를 적용하지 않은 소스를 내놓고 있어서 다행이었습니다.
아래 소스는 KEIL사이트에 올라와 있는 SD관련 소스코드를 참고한 것입니다.
마스터 모드이며, NSS는 사용하지 않았습니다.
가장 중요한 부분을 아래 노랗게 칠해놓았습니다.
이 부분만 되면, SPI신호는 제대로 나옵니다.
일단 저는 SPI 출력만 사용하기 때문에 출력 부분만을 확인하였습니다.
void spi_port_init(void)
{
/* Enable clock for SPI, GPIOA and AFIO. */
RCC->APB2ENR |= 0x00001005;
/* Reset SPI remap (use PA4..PA7). */
AFIO->MAPR &= 0xFFFFFFFE;
/* SPI1_NSS is GPIO, output set to high. */
GPIOA->BSRR = 0x00000010;
/* SPI1_SCK, SPI1_MISO, SPI1_MOSI are SPI pins. */
GPIOA->CRL &= ~0xFFF00000;
GPIOA->CRL |= 0xB8B00000;
}
void spi_init(void)
{
/* <<SPI_CR1>>
BIDIMODE[15] =0
BIDIOE [14] =0
CRCEN [13] =0
CRCNEXT [12] =0
DFF [11] =0 (8bit)
RXONLY [10] =0
SSM [ 9] =1
SSI [ 8] =1
LSBFIRST[ 7] =1
SPE [ 6] =1
BR [5:3]=111 (1/256)
MSTR [ 2] =1 (Master)
CPOL [ 1] =0
CPHA [ 0] =0
*/
SPI1->CR1=0x03FC;
SPI1->CR2=0x0000;
}
unsigned char spi_send(unsigned char dt)
{
while(!(SPI1->SR&SPI_SR_TXE));
SPI1->DR=dt;
while (!(SPI1->SR & SPI_SR_RXNE));
return (SPI1->DR);
}