'Technical Tips!!'에 해당되는 글 15건

  1. uCOS-III 을 STM32F407 Discovery board에 올려보자.
  2. MDK ARM Error: L6411E: No compatible library exists with a definition of startup symbol __main. 2
  3. SWD ST-LINK JTAG Interface 예고
  4. EWARM CMSIS intrinsics.h 컴파일 에러
  5. STM32 JTAG ST-LINK GPIO_Remap_SWJ 동작 안 할때

uCOS-III 을 STM32F407 Discovery board에 올려보자.

uCOS-III 을 STM32F407 Discovery board에 올려보자.


준비물
1. Discovery STM32F407 보드
2. 컴파일러, EWARM 은 6.5이상, MDK는 4.6 이상



1. OS을 다운 받고... V 3.03.01 사용.


LoginSTMicroelectronics STM32F4xx
μC/OS-IIIµC/OS-III V3.03.01STM3240G-Eval
Atollic TrueSTUDIO V3.x
IAR (EWARM) V6.x
Keil MDK V4.x
2013/01/23


2. 시간 낭비 없게 정확한 컴파일러 버젼으로 동일하게 컴파일.



3. STM3240G-Eval은 25Mhz 사용하고 Discovery는 8Mhz사용하니 이 부분 수정.


  3.1  bsp.c 에서 아래 define값을 25에서 8로 수정

       //#define  BSP_BIT_RCC_PLLCFGR_PLLM               25u 

       #define  BSP_BIT_RCC_PLLCFGR_PLLM               8u


  3.2 bsp.c 에서 led관련 port을 discovery에 맞게 수정


  3.3 stm32f4xx.h 에서 8Mhz에 맞게 수정

      //#define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */

     #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */



4. 기타 

   이상한게 IAR쪽 os_cpu_c.c 에만 FPU관련 Register 처리 루틴이 들어 있다는거.

   GNU, MDK는 이 부분이 코드에 없음.

  

    FPU관련 Register가 S0~S31까지 총 32개라서 Task Switching시 마다 stack에 push,pop 동작에 로드가 걸릴듯 했지만

    uCOS-III 에서는 영리하게 Task 생성시 해당 Task내에서 FPU사용 여부를 Check하여 FPU Register push,pop 동작을

    Task마다 선택적으로 동작 하도록 설정 되어 있음.


#define  OS_OPT_TASK_NONE               (OS_OPT)(0x0000u)  /* No option selected                                 */

#define  OS_OPT_TASK_STK_CHK          (OS_OPT)(0x0001u)  /* Enable stack checking for the task                 */

#define  OS_OPT_TASK_STK_CLR          (OS_OPT)(0x0002u)  /* Clear the stack when the task is create            */

#define  OS_OPT_TASK_SAVE_FP  (OS_OPT)(0x0004u)  /* Save the contents of any loating-point registers  */

#define  OS_OPT_TASK_NO_TLS                  (OS_OPT)(0x0008u)  /* Specifies the task DOES NOT require TLS support    */



   



MDK ARM Error: L6411E: No compatible library exists with a definition of startup symbol __main.

분명 나와 같이 늦은 시간까지 삽질 할 사람이 있을 거라 생각 하고....



MDK ARM 에서 다음과 같은 컴파일 에러 발생시....

Error: L6411E: No compatible library exists with a definition of startup symbol __main.

다른 PC에서는 잘되고...


내 PC에서만 안되네???


왜????


두리번 두리번 깔고, 지우고, 깔고, 지우고 해봐야 소용 없고...


ADS1.2 컴파일러와 쫑나는 문제 입니다.


PC 환경 변수에서 ADS관련 환경 변수를 삭제 하고 컴파일 하면 이상 없습니다.


나중에 ADS컴파일러 쓸때는 다시 등록 해야 겠네요...


요증 ADS랑 MDK ARM이랑 같이 깔고 사용 하는 사람이 얼마나 되려나....



ARMCONF

C:\Program Files\ARM\ADSv1_2\BIN


ARMDLL

C:\Program Files\ARM\ADSv1_2\BIN


ARMHOME

C:\Program Files\ARM\ADSv1_2


ARMINC

C:\Program Files\ARM\ADSv1_2\INCLUDE


ARMLIB

C:\Program Files\ARM\ADSv1_2\LIB



SWD ST-LINK JTAG Interface 예고

예전 JTAG들은 보통 PIN이 20PIN정도 되죠.


연결 회로를 구성하면 20PIN 컨넥터 보드에 넣어야 하는데 2.54mm 로 박아 넣으면 공간 잡아 먹기 일쑤고, MCU 핀들도


많이 잡아 먹고요.


요즘은 Cortex계열은 SWD라고 해서 총 GPIO에서 2PIN 가지고 지지고 볶고 다 해결 합니다.(3.3V, GND빼고)


보드에 Debug uart 뽑듯이 4PIN만 커넥터만 배놓으면 JTAG Interface 완료


그럼 현존하는 JTAG은 대부분 20PIN 인데, 여기에 SWD을 연결 하는 방법을 알아 보죠.


결론은 


20PIN JTAG           ST M3 PIN

1번                      보드 전원(보통 3.3V)

4번                      보드 GND

7번                      PA13

9번                      PA14



참고 자료는 아래 다 있습니다.


아래는 ST-LINK JTAG 핀맵입니다.

20PIN JTAG핀맵은 대부분 비슷 하겠죠







아래는 M3내부 블럭 입니다.

SWD관련해서는 SWDIO, SWCLK 2개의 라인으로 동작 하는걸 볼수 있습니다.




아래는 STM UM입니다. PA13, PA14가 SWD로 할당되어 있는걸 알 수 있습니다.





아래는 Discovery 보드 입니다.

소형 저가 EVK에 JTAG이 붙어 있는 형태이죠.

내용을 보면, 점퍼 설정으로 JTAG을 EVK MCU가 아닌 CN3을 통해 외부 Device들을 SWD로 디버깅 할 수 있게 해놨습니다.




마지막으로 IDE환경이든, JTAG 설정 모드이든 간에 

Interface 부분은 "SWD"로 설정 합니다.




ST-LINK 자료는 아래


ST-LINK-V2.pdf



나중에 시간되면 SWO 정체도 한번.... 알아 보죠.


EWARM CMSIS intrinsics.h 컴파일 에러

ST예제 컴파일시 에러



Error[Pe147]: declaration is incompatible with "__interwork __softfp unsigned long __get_PSP(void)" (declared at line 52 of "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\arm\inc\c\intrinsics.h") 


C:\work\STM32_Lib\STM32_USB-FS-Device_Lib_V3.3.0\STM32_USB-FS-Device_Lib_V3.3.0\Libraries\CMSIS\CM3\CoreSupport\core_cm3.h 1084 



EWARM 최근 버젼에서 에러가 나옵니다.


CMSIS관련 어셈블러쪽을 IAR에서는 내부적으로 따로 제공하는데 이 부분이 서로 충돌 합니다.


CMSIS - Cortex Microcontroller Software Interface Standard Image



CMSIS 관련 자료는 다음 링크

http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php



해결 방법은 

1. core_cm3.c/h 을 rename 하시고, 

2. 컴파일러 옵션에서 아래와 같이 CMSIS 란에서 "Use CMSIS" 체크 박스 체크 해주시고,

3. 컴파일러에서 core_cm3.c 파일을 빼줍니다.


이게 좀 아리송 한게 체크 박스을 뒀다는건 외부 core_cm3.c/h도 사용 할 수 있게 한다는 건데...

뭘 하던간에 내부 "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\arm\inc\c\intrinsics.h" 파일을 

default로 물고 들어오니.... declaration is incompatible 에러가 나옵니다.

intrinsics.h을 안물고 들어가게 하는 옵션이 있을것 같은데...흑






위에 "Use CMSIS"을 체크 하면

IAR 컴파일러의 다음 Path을 참고 합니다.


C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\arm\CMSIS\Include  


이 폴더 안에는 "core_cm3.h" 가 독립적으로 들어 있고요.


"core_cm3.h" 에서는   


#include <intrinsics.h>                     /* IAR Intrinsics   */  


다시 이 파일은 


C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\arm\inc\c


여기 들어가 있습니다.








STM32 JTAG ST-LINK GPIO_Remap_SWJ 동작 안 할때

STM32 계열에서 간혹 JTAG 쓸 일이 옵니다.


Bootloader 개발하거나,


정말 난해한 app을 trace해서 디버깅 하거나.. 등등


안쓰던 JTAG을 붙였더니, 부팅 처음 한번은 되고 그 이후에는 안되고...


또는 IDE에서 Debugging Session이 종료가 안되거나... 뭐...


되는것도 아니고, 안되는것도 아닌 애매한 상황...




STM은 JTAG 핀들이 Dedicate핀이 아니고 GPIO랑 공유하는 개념이라서 보통 핀이 빡빡하게 잡혀 있으면 JTAG핀도


GPIO로 사용할 일이 있습니다. 그래서 APP에서 아래와 같이 해놓고, 


한참 있다 갑자기 JTAG 붙일려면 안붙습니다. T.T


요거 한줄 실행 되고 나면 이후 JTAG 인터페이스는 먹통이 됩니다~


GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);


조심들 하세요~!!