1. MSP430과 다른 MCU비교
TI의 Main MCU로 MSP430이 많이 이용되어진다고 하지만, Atmel의 AVR or ST micronics의 STM이 많이 이용이 되어지는 것 사실인 것 같다.
실제로 최근에 IOT 일 관련때문에 다시 AVR과 STM 관련해서 MCU들을 다시 사용해봤지만 사용하기가 편한 MCU는 STM or AVR 인 것 같다.
나만의 생각일지는 모르겠지만 풍부한 예제소스와 사용하기 쉬운 인터페이스 인 것 같다.
특히 STM의 경우는 ARM 기반으로 하기때문에 너무 이상적이고 이게 MCU 라고도 생각이 들 정도였다.
일문제로 인하여 TI MSP430 사용하고 있지만, 다른 MCU에 비해 개발의 편이성에 관련된 큰 장점을 발견하지 못하고 있지만
사용을 하다보니 다른 MCU 못지않게 좋은 부분도 많이 발견되고 특히 저전력부분에 있어서는 MSP430는 좋겠다라고 생각이 든다.
하지만 개발의 편이성 부분은 다소 떨어지는 것과 MSP430간의 호환성이 떨어지는 것은 어쩔수 없는 것 같다.
1.1 MSP430의 호환성
아래의 Wiki를 보고, TI사이트를 가보면 상당히 많은 MSP430의 종류가 존재한다.
그리고, 아래 series로 갈수로 고사양의 MCU 이며, 다양한 Peripherals 지원 해주고 성능이 좋다.
하지만 아래의 Series로 갈수록 호환성은 떨어지며, TI에서 예제를 제공해주고 있지만, Github or
다른 Opensource를 많이 발견하지 못하고 있다. 나의 검색능력이 떨어져서 그런건지 모르겠다.
하여튼 내가 사용하는 msp430f5438a는 다른 MSP430과 호환이 잘되지 않아 좀 많이 고쳐줘야 한다.
컴파일러는 현재 TI Complier로 사용하고 있으며, 다른 예제소스를 가지고 한번에 빌드되는 것은 거의 보지를 못했다.
이 관련 Series의 예제를 찾아 관련 Register 부분을 수정하면 문제해결이 된다.
- MSP430x1xx series
- MSP430F2xx series
- MSP430G2xx series
- MSP430x3xx series
- MSP430x4xx series
- MSP430x5xx series
- MSP430x6xx series
1.2 MSP430F438A 의 전체 기능
MCU 치고는 상당히 좋고 다양한 많은 기능을 가지고 있다. DMA기능을 가지고 있다는 것에 사실 놀랐고,
Timer 기능과 Power Management를 위해서 내부에 LDO를 따로 구성을 하고 있다.
일단 MCU이기에 FLASH 와 RAM은 기본으로 가지고 있으며, 외부 clock을 사용 안한다면, 내부 oscillator도 가지고 있다.
http://www.ti.com/product/MSP430F5438A
상위 Datasheet에는 세부 Register 설정 및 동작내용을 표시하지 않고 있지만,
6. Detailed Description 에 세부 Datasheet들을 Link로 연결해주고 있다.
가장 중요한 부분이기에 세밀하게 잘 봐야 한다.
CCS의 View->Register를 이용하여 각 개별의 값을 읽고 사용할수도 있다.
1.3 MSP430의 CLOCK 의 구성
상위 msp430f5438a의 UCS 부분을 보면 Clock의 Source 부분과 이를 FLL를 이용하여 , (PLL처럼) Clock을 증가시켜
3종류의 Clock을 최종적으로 만들어 낸다.
- Unified Clock System (UCS) - Source Clock
우선알아둬야할 기능이며 CLOCK관련 부분이기에 가장 중요하다.
- XT1CLK: 기본 외부 external clock으로 Low or High frequency 32KHz 사용 (XTIN/XTOUT)
- VLOCLK: internal oscillator (very low power) 10KHz
- DCOCLK: Internal digitally controlled oscillator ( FLL 이용)
- XT2CLK: external crystals (XT2IN/XTOUT)
- Unified Clock System (UCS)
상위 Source를 이용하여, 아래의 Clock을 만들어내며, PLL과 유사한 FLL을 이용한다.
- MCLK(Main Clock): CPU 동작을 위한 Clock으로 DCO(Digitally Controlled Oscillator) or 외부 크리스탈에 의해 설정이 된다.
- ACLK(Auxiliary Clock): VLO(Very Low Power Oscillator)
- SMCLK(Sub-Main Clock): 개별 Device를 위한 Clock으로 내장된 DCO or 외부 크리스탈로 설정
Clock관련부분에 설정 및 동작에 대해 설명해주고 있다.
http://www.ti.com/lit/ug/slau390e/slau390e.pdf
싱크웍스의 자료
http://www.mcublog.co.kr/1806
XT1CLK을 사용하며, 32KHz를 외부공급
- 8MHz (MCLK 과 SMCLK) 설정 , ACLK 32KHz
- 15MHz (MCLK과 SMCLK) 설정, ACLK 32KHz
- 25MHz (MCLK과 SMCLK) 설정, ACLK 32KHz
1.4 MSP430 Peripheral 설정 방법
모든 PIN들은 기본적으로 GIO가 가능하며, PINMUX를 해야한다. 그러기때문에, 우선적으로 해야 할일이 PIN 설정이다.
MSP430의 PINMUX 역할이 PINxSEL 이며, 경우에 따라 추가적으로 Pull up과 Pull down 설정도 적용이 되는지는 정확히 모르겠다.
특히한 사항은 UART or I2C or SPI는 USCI Interface라는 것을 이용하여 이곳에서 설정을 변경해서 만들어주어야 한다.
- MSP430 peripherals 이용시 확인사항
예를들면
, USCI을 통한 UART or I2C or SPI 통신
- 개별 PORT의 PIN 설정을 반드시 확인. (GPIO설정시 세부설정)
- PORT의 PINxSEL 은 PINMUX와 동일 (PIN설정)
- Peripherals 의 Clock Source를 확인하고 설정
- Peripherals Reset 기능확인
- Peripherals 세부설정방법 확인
- ISR 가능여부 확인 ( 관련 TI Example 참조)
TI Example 소스도 간단히 구현을 하였기때문에 본인이 작성을 원한다면, 더 구체적으로
동작원리를 어느정도 이해를 해야겠다.
MSP430 관련 CCS Studio 설정 (RS232 - Printf 설정)
http://processors.wiki.ti.com/index.php/Printf_support_for_MSP430_CCSTUDIO_compiler
만약 Printf가 정상동작하지 않는다면, Properties의 설정을 다시 한번 확인해보고, 문제가 발생한다면, heap도 고쳐보자.
minimal->full 변경 (추후 Release 할 경우 다시 원상복귀)
기본으로 Enable CIO Function use
Timer는 현재 Source Clock을 ALCK 기준으로 사용을 하고 있으며, 이렇게 구현해야지
추후 Clock 이 변경이 되어도 별문제가 없을 것 같다.
http://www.ti.com/lit/ug/slau400e/slau400e.pdf
ADC의 경우 ISR로 구현로도 구현이 가능하며, 성능은 200-ksps 이상이 나온다고 한다.
현재 나의 경우는 ADC를 한개를 사용을 하기때문에 그리고, 빠른 사용을 위해서 ISR를 사용하고 있으며
ISR 루틴안에서 P1.x로 Clock을 만들어 Scope로 성능을 측정하고 있다.
- Repeat-Single-Channel Mode 설정
- Pulse Sample Mode 설정
- ADC12CTL0의 ADC12SHT0x ADC12CLK cycles을 줄이며 성능을 높이고 있다.
- ISR 루틴구성
- ISR 루틴에서 해당 Channel 값을 저장
http://www.ti.com/lit/ug/slau406e/slau406e.pdf
http://www.ti.com/lit/zip/slac375
2. MSP430의 Debugger 지원기능
현재 사용중인 디버거는 아래와 같으며, USB Interface 형식으로 PC와 연결된다.
-
MSP-FET430UIF
JTAG기능과 Serial을 통하여 SPI 형식으로 Target연결되어 File을 Upload 및 Download를 진행을 한다.
AVR의 ISP와 거의 유사한 방식으로 방식이지만, JTAG기능이 추가되어 CCS와 JTAG Debug가 지원이 가능하다.
MSP430의 기본내용 및 설명
https://en.wikipedia.org/wiki/TI_MSP430
3. MSP430의 Linkscirpt
MSP430에서 Linkscript와 연결하여 사용해야 할일이 어느 정도 있으며 이 부분은 Compiler의 종류에 따라 변경된다.
그리고 이부분은 정확하게 이해는 하고 있어야 한다. 현재 CCS의 Linkscript는 *.cmd File로 제공해주고 있다.
나의 경우는
lnk_msp430f5438a.cmd 이며 설정만 변경하면 생성이 된다.
3.1 ISR의 기본이해
Manual의 6.3 Interrupt Vector Addresses을 보면 대충알 수 있다.
*.cmd의 INT00 ~ INTxx 까지의 주소이며 이 주소를 보면 상위 Manual의 주소와 일치한다.
lnk_msp430f5438a.cmd 파일
........
RTC : { * ( .int41 ) } > INT41 type = VECT_INIT
PORT2 : { * ( .int42 ) } > INT42 type = VECT_INIT
USCI_B3 : { * ( .int43 ) } > INT43 type = VECT_INIT
USCI_A3 : { * ( .int44 ) } > INT44 type = VECT_INIT
USCI_B1 : { * ( .int45 ) } > INT45 type = VECT_INIT
USCI_A1 : { * ( .int46 ) } > INT46 type = VECT_INIT
PORT1 : { * ( .int47 ) } > INT47 type = VECT_INIT
TIMER1_A1 : { * ( .int48 ) } > INT48 type = VECT_INIT
TIMER1_A0 : { * ( .int49 ) } > INT49 type = VECT_INIT
DMA : { * ( .int50 ) } > INT50 type = VECT_INIT
USCI_B2 : { * ( .int51 ) } > INT51 type = VECT_INIT
USCI_A2 : { * ( .int52 ) } > INT52 type = VECT_INIT
TIMER0_A1 : { * ( .int53 ) } > INT53 type = VECT_INIT
TIMER0_A0 : { * ( .int54 ) } > INT54 type = VECT_INIT
ADC12 : { * ( .int55 ) } > INT55 type = VECT_INIT
USCI_B0 : { * ( .int56 ) } > INT56 type = VECT_INIT
USCI_A0 : { * ( .int57 ) } > INT57 type = VECT_INIT
WDT : { * ( .int58 ) } > INT58 type = VECT_INIT
TIMER0_B1 : { * ( .int59 ) } > INT59 type = VECT_INIT
TIMER0_B0 : { * ( .int60 ) } > INT60 type = VECT_INIT
UNMI : { * ( .int61 ) } > INT61 type = VECT_INIT
SYSNMI : { * ( .int62 ) } > INT62 type = VECT_INIT
.reset : {} > RESET /* MSP430 Reset vector */
아래와 같이 ADC ISR를 작성할 경우 TI Compiler와 GCC Compiler를 구분하 Programming 해야 한다.
일반적으로 GCC의 경우 __attribute__() 안에 넣고, 작성하지만 CCS or IAR의 TI Compiler는 다르다
Linkscript와 연결하고 싶다면 아래의 규칙을 따르도록하자
ADC12_VECTOR는 결국 *.cmd 파일의 INTxx와 Mapping이 된다.
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
#else
#error Compiler not supported!
#endif
{
.....
}
3.2 Flash에 환경변수 저장방법
*.cmd File을 분석해보면, Flash 부분은 .text section 과 .cinit section 영역 주로 사용자 Code만을 위한 공간이다.
하지만 infoA/B/C/D를 별도로 구분지어 기본적으로 저장을 하지 않는다.
MSP430의 환경변수를 저장할 수 있도록 구성해놓은 Memroy Map인 것 같으며 사용법을 알아두자.
- INFOA
- INFOB
- INFOC
- INFOD
아래와 같이 CCS에서 간단히 사용을 해보자. 하지만 Compiler가 변경이 되면 사용법도 약간씩 변경이 되므로 아래를 참고하자.
#pragma DATA_SECTION(sMYENV, ".infoD")
const uint8_t *sMYENV = {0x12, 0x34, 0x56, 0x78};
char * env_Addr = (char *)0x1800;
x = env_Addr[0];
x = env_Addr[1];
x = env_Addr[2];
x = env_Addr[3];
Flash 와 CMD File의 조합
http://processors.wiki.ti.com/index.php/Placing_Variables_in_Specific_Memory_Location_-_MSP430
- INFOx Memory 사용할 경우 MSP430의 Debug option 설정
다음과 같은 에러를 쉽게 볼수 있다.
- MSP430: File Loader: Verification failed: Values at address
아래와 같이 Erase Option은 Erase main Memory Only 설정이 되어 있어 Info에 Erase를 하지 못한다.
Erase Option
- Erase main memory only (기본설정)
- Erase main and Information memory 변경
이외에도 Allow Read/Write/Erase access to BSL memory 존재하지만, *cmd 파일에서
접근을 하지 않기 때문에 사용하지 않고 있다.
https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/481653
MSP430에는 EEPROM을 제공하지 않기때문에 EEPROM 사용할 경우 이를 대신할 방법
http://processors.wiki.ti.com/index.php/Emulating_EEPROM_in_MSP430_Flash
3.3 Debug를 위하여 Map 파일 분석
CCS를 이용하여 JTAG Debug를 이용한다면 많은 이용 필요없겠지만, File의 용도를 알아두기 위해서 적어둔다.
빌드 하면, Linux 처럼 *.map 파일 생성이 되며, 이를 통하여 관련 library와 symbol table 과 주소등을 관련 정보가 가능하다