• __attribute__((weak))

• 해당 심볼을 weak symbol로 만든다.

• 링커가 링크를 수행 시 다른곳에 같은 이름으로 만든 strong symbol이 존재하면 weak symbol 대신 strong symbol을 사용한다.


출처: http://jake.dothome.co.kr/attr1/

참고: GCC Weak Function Attributes

# STM32F429I-DISCOVERY

# STM32F429ZIT6 (144Pin / 180Mhz)

# FreeRTOS (RTOS)

# KEY (PA0)

# 2017.09.08 Callback 함구 구현


KEY_EXTI_TEST.zip


• CubeMX에서 외부 인터럽트를 설정하고 Key 입력에 따라 LED를 켜고 끄도록 한다.


• 회로도


• 아래 데이터시트를 보는 것과 같이 PA0은 EXTI0 인터럽트와 매칭된다.


• 아래 사진과 같이 핀 설정을 한다.



• LED GPIO_Output, SWCLK, SWDIO 설정


• Peripherals 설정


• 클럭 설정


• Configuration → NVIC 버튼을 클릭하고, 외부 인터럽트 함수를 체크해준다.

# Premption Priority, Sub Priority는 추후 기술하겠음


• GPIO 버튼을 클릭하고, GPIO mode, Pull-up/Pull-down을 설정한다.

필자의 경우 Rising edge에 동작하도록 하였다.



• 인터럽트 핸들러

Cube에서 코드를 생성하면 "stm32f4xx_it.c" 파일에 인터럽트 핸들러가 추가 된다.



HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); 이 함수를 따라가 보면 실제 인터럽트 처리가 구현되어 있고,

마지막에 Callback 함수를 호출 하고 있다.



HAL_GPIO_EXTI_Callback(GPIO_Pin); 함수를 따라가 보자.

이 함수를 직접 수정하지 말고,  HAL_GPIO_EXTI_Callback 함수를 사용자 파일에 구현 하라고 되어있다.



필자는 "stm32f4xx_it.c" 파일에 Callback 함수를 복사하였다. 


• 코드 입력

Callback 함수를 복사 후 아래 코드를 입력한다.

__weak attribute는 삭제한다.


HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13 | GPIO_PIN_14);



• 외부 인터럽트와 핀설정은 gpio.c 파일에서 확인할 수 있다.



#인터럽트 우선 순위에 대한 내용은 추후 기술 하겠음.


끝.









CMSIS

Cortex Microcontroller Software Interface Standard의 약자. 즉 다양한 칩 벤더가 Cortex 시리즈의 IP를 라이센스해가면서 하드웨어 독립적인 표준화된 소프트웨어 인터페이스가 필요하게 됨.  이것은 다음을 포함한다. 스펙은 ARM에 사용자 등록을 하면 받을 수 있다. https://silver.arm.com/browse/CMSIS


출처: http://openmicrolab.com/tag/cmsis/

# QT 4.7.4

# Ubuntu 16

 

• 필수 패키지 설치

sudo apt-get install build-essential mesa-common-dev libglu1-mesa-dev


• 다운로드 사이트

http://download.qt.io/archive/qt/



• 권한 설정

$ chmod a+x qt-opensource-linux-x86-5.5.1.run


Qt 설치

$ ./qt-opensource-linux-x86-5.5.1.run




• 설치 경로 설정


 컴포넌트 설치





• 설치 완료


• 프로젝트 설정

New File or Project








• 컴파일 설정










끝.


출처: https://www.ics.com/blog/getting-started-qt-and-qt-creator-linux

출처: http://forum.falinux.com/zbxe/index.php?document_srl=781083&mid=graphic

# QT 4.7.4

# Ubuntu 16


Qt 다운로드

→ 공유 디렉토리에서 Qt를 복사해 온다.

 

• 압축 해제

$ tar xzvf qt-everywhere-opensource-src-4.7.4.tar.gz

$ cd qt-everywhere-opensource-src-4.7.4

 

qmake.conf 수정

→ 크로스 컴파일러를 수정해 준다.

$ vi mkspecs/qws/linux-arm-g++/qmake.conf


configure

$ ./configure -embedded arm -opensource -qt-zlib -qt-gif -no-iconv -no-libtiff -qt-libpng -no-libmng -qt-libjpeg -no-qt3support -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -qt-freetype -qvfb -little-endian -no-neon -no-nis -no-cups


• 옵션 설명

URL http://radekp.github.io/qtmoko/api/buildsystem/over-configure-options-qt-embedded-1.html


$ make

또는 $ make -j<cpu 코어 숫자 + 1>

 

$ sudo make install


• 환경 설정

$ sudo vi /etc/profile

export PATH=$PATH:/usr/local/Trolltech/QtEmbedded-4.7.4-arm/bin

 

$ export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.4-arm/

$ export PATH=$QTDIR/bin:$PATH


• example


• 컴파일 



• 컴파일 에러 발생


• 컴파일 에러 해결방안

$ sudo apt-get install qt4-qmake libqt4-dev


끝.


출처: http://gentooboy.tistory.com/10

출처: http://forum.falinux.com/zbxe/index.php?document_srl=781083&mid=graphic

출처: http://korone.net/bbs/board.php?bo_table=qt_qna&wr_id=17866

# STM32F769BIT6 (208Pin / 216Mhz)

# FreeRTOS (RTOS)

# GPIO (LED)

# CubeMX 4.21.0 / STM32F7 1.7.0



LL 드라이버를 사용하여 Key 입력에 따라 LED를 제어하는 방법을 기술하였습니다.

CubeMX에서 GPIO Pin 설정, Clock, 설정, FreeRTOS 포팅하고, LL 드라이버를 프로젝트에 추가하여 GPIO를 제어하는 방법을 기술하였습니다.

ST에서 Templates_LL를 제공하고 있으나, 이 내용은 추후 기술하겠습니다. (CubeMX HAL + LL Driver)

 

ST에서 처음으로 나온 드라이버는 SPL(Standard Peripheral Libraries) 입니다. 하지만 현재는 HAL and LL drivers 넘어가는 추세인 것 같습니다.

CubeMX에서 프로젝트를 생성하고, HAL 드라이버를 기본으로 사용하다 보면 불편한 점이 많습니다. 가장 큰 단점은 최적화(Optimizer)가 많이 안되어 있습니다.

회사 프로젝트는 일단 STD 라이브러리(SPL) 사용하여 프로젝트를 진행중이고, 추후 HAL 드라이버를 적용할 예정입니다.

 

HAL, SPL, LL 드라이버 비교 내용은 ST 홈페이지에서 확인 가능합니다.

en.stm32_embedded_software_offering.pdf”


# 개요

KEY1 = PD12 / KEY2 = PD13

LED1= PG13 / LED2 = PG14


# CubeMX Pin 설정

1. PG13, PG14 GPIO_Output

2. PD12, PD13 GPIO_Input

3. SWDIO, SWCLK

4. RCC_OSC


# Clock 설정


# FreeRTOS 


# GPIO Pin 설정 (Key 회로에 Pull Up이 되어 있으므로, no pull-up no pull-down 으로 설정한다.)


# Project Settings (All used Libraries into the project folder를 선택한다)




# Code

freertos.c 파일에 아래 헤더파일을 추가합니다.

#include "stm32f7xx_ll_gpio.h"


#define C_KEY1 GPIO_PIN_12

#define C_KEY2 GPIO_PIN_13


#define C_LED1 GPIO_PIN_13

#define C_LED2 GPIO_PIN_14


freertos.c → StartDefaultTask() 함수에 아래 코드를 입력합니다.

/* StartDefaultTask function */

void StartDefaultTask(void const * argument)

{

/* USER CODE BEGIN StartDefaultTask */

/* Infinite loop */

uint32_t u32Input = 0x0;

uint32_t u32Output = 0x0;

for(;;)

{

u32Input = LL_GPIO_ReadInputPort(GPIOD);

if(u32Input & C_KEY1)

{

u32Output |= C_LED1;

}

else

{

u32Output &= ~C_LED1;

}

if(u32Input & C_KEY2)

{

u32Output |= C_LED2;

}

else

{

u32Output &= ~C_LED2;

}

LL_GPIO_WriteOutputPort(GPIOG, u32Output);

osDelay(250);

}

/* USER CODE END StartDefaultTask */

}


→ "stm32f7xx_ll_gpio.h" 헤더파일은 프로젝트 폴더 Driver → STM32F7xx_HAL_Driver → Inc에서 확인 할 수 있습니다.

해당 함수는 매크로로 정의되어 있으며,  GPIO PORT의 입력 레지스터(IDR)를 읽고, 출력 레지스터(ODR)에 데이터를 쓰고 있습니다.


# RM0410 Reference manual




끝.




# STM32F427

# Flash Loader Demonstrator

# 2017.08.31 plainy님의 글 추가


필자의 경우 Flash Loader Demonstrator 프로그램을 사용하였으나, 간단히 해결이 가능하다고 함.

plainy님의 글


Flash loader로 Erase까지 진행하지 않으셔도 됩니다.

전원인가시 Boot0핀만 high로 잡아놓으면 System memory에서 멈춰 있습니다.

그 후부터는 ST-Link Utility나 IAR등으로 다시 연결하면 됩니다.

https://www.plainy.co.kr/ 





완료.


LED_Toggle.zip



# STM32F429I-DISCOVERY 

# STM32F429ZIT6 (144Pin / 180Mhz)

# FreeRTOS (RTOS)

# GPIO (LED)

# 2017.06.13 Clock 설정 부분 수정하였음. 25Mhz → 8Mhz


• CubeMX에서 간단한 GPIO Pin 설정, Clock, 설정, FreeRTOS 포팅하는 방법을 기술하였습니다.

• CubeMX를 통해서 FreeRTOS를 쉽게 포팅하고, LED를 제어하는 방법을 기술하였습니다.

 

• New Project → STM32F4 → STM32F429/439 → LQFP 144 → STM32F429ZITx  

• 또는 New Project → STMicroelectronics → Discovery → STM32F4 → STM32F429I-DISC1 선택

필자는 개발보드를 선택하지 않고 STM32F429ZITx  선택하여 기술하였습니다.


• LED는 PORTG 13, 14번에 연결되어 있습니다.


• PG13, PG14를 클릭하고, GPIO_Output 를 클릭합니다.


• Debug Pin 설정

PA13, PA14 Pin를 JTCK-SWCLK, JTMS-SWDIO 설정하지 않을 경우 디버그를 하지 못하게 됩니다.


• Configuration → Peripherals  SYS → Debug → Serial Wire로 선택합니다.


• Pin 색이 초록색으로 변경되는 것을 확인합니다.


• Clock Pin 설정

회로도에는 PH0, PH1 Pin에 연결되어 있습니다.



• PH0 "RCC_OSC_IN", PH1 "RCC_OSC_OUT"으로 선택합니다.


• Configuration → Peripherals  RCC High Speed Clock (HSE) → Crystal/Ceramic Resonator으로 선택합니다.


Pin 설정을 완료한 화면입니다.


• Clock를 설정합니다. 해당 CPU는 최대 180Mhz으로 동작합니다.

• Input Frequency을 입력합니다. * DISCO Board는 Crystal 8Mhz를 사용함.

HSE, PLLCLK를 선택하고, HCLK (Mhz)를 180을 입력합니다. 또는 원하는 속도롤 변경합니다. PLL Source Mux를 자동으로 설정됩니다.



• FreeRTOS 포팅

FreeRTOS 포팅 방법은 Configuration → FREERTOS를 체크하는 것으로 끝입니다.


• GPIO 설정

GPIO 버튼을 클릭합니다.


PG13, PG14 Pin을 아래와 같이 설정합니다.


• Generate Code 

Project → Generate Code 버튼을 클릭합니다.


• Project Settings

Project Name, Location 설정합니다.

# 설정에 대한 설명은 추 후 기술하기로 하겠습니다.


# 설정에 대한 설명은 추 후 기술하기로 하겠습니다.


• Main Project Settings

코드 생성 후 초기 화면입니다.


• 코드 입력

freertos.c → StartDefaultTask() 함수에 아래 코드를 입력합니다.


#include "stm32f4xx_hal.h"

HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);

osDelay(500);

HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_14);

osDelay(500);



• Compile 

F7 또는 Project → Make를 클릭합니다.


• Download and Debug

Ctrl + D 또는 Project → Download and Debug / Debug without Downloading을 클릭합니다.


• 실행

F5 또는 Debug → Go를 클릭합니다.


• Debug 종료

Ctrl + Shift + D 또는 Debug  → Stop Debugging을 클릭합니다.



끝.

크로스 컴파일러 설치

 

※ 컴파일러 및 라이브러리는 공유 디렉토리 또는 Samba 공유 디렉토리에 넣어준다.

※ 타겟 CPU: S3C6410


# Ubuntu 16


• 기본 패키지 설치

→ 크로스 컴파일러만 설치할 경우 아래와 같은 오류가 발생한다.

/usr/cross_compiler/s3c6410/libexec/gcc/arm-generic-linux-gnueabi/4.3.2/cc1: error while loading shared libraries: libmpfr.so.1: cannot open shared object file: No such file or directory

 

• 라이브러리에 필요한 라이브러리 설치

$ sudo apt-get install m4 libgmp-dev




gmp 설치

URL: http://ftp.gnu.org/pub/gnu/gmp/

$ tar xvf gmp-6.1.2.tar.bz2

$ cd gmp-4.1.3

$ ./configure

$ make

$ make check

$ make install

 

mpfr 설치

URL: http://www.mpfr.org/mpfr-current/#download

$ tar xzvf mpfr-3.1.5.tar.gz

$ cd mpfr-3.1.5

$ ./configure

$ make

$ make check

$ sudo make install

 

• 컴파일 결과물을 /usr/lib로 이동

# find / -name libmpfr.so.1 -print

/usr/local/lib/libmpfr.so.1

 

• 복사

$ sudo cp -f /usr/local/lib/libgmp* /usr/lib

$ sudo cp -f /usr/local/lib/libmpfr* /usr/lib

 

• 파일명 변경

$ sudo mv libgmp.so.10 libmpfr.so.3

$ sudo mv libmpfr.so.4 libmpfr.so.1

 

• 설치 디렉토리 생성 (컴파일러 설치 경로)

$ sudo mkdir -p /usr/cross_compiler/s3c6410

 

 • 압축 풀기 (필자는 크로스 컴파일러를 만들어서 사용하였음)

→ 해당 타겟 보드의 크로스 컴파일러를 압축을 풀어준다.

$ sudo tar xzvf s3c6410_cross_compiler.tar.gz -C /

 

 • 환경 변수 등록

$ sudo vi /etc/profile

export PATH=$PATH:/usr/cross_compiler/s3c6410/bin

 

크로스 컴파일러 만드는 방법

URL: http://forum.falinux.com/zbxe/index.php?document_srl=554217&mid=lecture_tip


임베디드 개발 환경 설치 


# Ubuntu 16

# ssh

# samba: PC ↔ Ubuntu 파일 공유(Virtual Box 공유 디렉토리를 이용한다면 생략)

# tftpboot: 타겟 보드에서 Kernel, Ramdisk, bootloader 이미지 다운로드

# nfs: 타겟보드 ↔ Ubuntu 파일 공유


1. 네트워크 설정

• 내부(Ubuntu Internet) 네트워크


• 호스트 전용(PC Ubuntu) 네트워크


• 외부(Ubuntu Target Board) 네트워크

필자는 Network Card 2개 사용하고 있어 이와 같이 설정하였음.

Network Card 1개일 경우 개발환경 설치가 끝난 후 어댑터 1를 브리지 어댑터로 설정하여 타겟보드와 연동한다.


$ ifconfig


2. 우분투 기본 설정


root 패스워드 변경

$ sudo passwd root



• 방화벽 설정

$ sudo ufw status

상태비활성

 

$ sudo ufw enable

방화벽이 활성상태이며 시스템 시작할 때 활성화 된다.


기본적인 룰을 적용.

전부 막기 sudo ufw default deny

전부 열기 sudo ufw default allow



3. 기본 패키지 설치

기본 패키지 설치

 

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install gcc build-essential binutils libsdl-dev libncurses5 libncurses5-dev bin86 vim





vi 편집기 하이라이트 설정

$ sudo vi /etc/vim/vimrc

→ 맨 아래 입력해 준다. (ctag, cscope는 다음에 다루기로 함)

set nu

syntax on

set autoindent

set cindent

set smartindent

set tabstop=4

set shiftwidth=4

highlight Comment term=bold cterm=bold ctermfg=4

set tags=./tags

set csprg=/usr/bin/cscope

set csto=0

set cst

set nocsverb

if filereadable("./cscope.out")

    cs add cscope.out

else

    cs add ./cscope.out

endif

set csverb

set fileencodings=utf8,euc-kr



4. ssh 설치

$ sudo apt-get install ssh


 • ssh 방화벽 설정

$ sudo ufw allow 22/tcp


ssh 권한 설정 경로

권한 및 설정을 변경하려면 아래 경로에서 수정해 준다. 필자는 기본 값으로 사용.

$ sudo /etc/ssh/sshd_config


 • 명령어

서비스 재 시작

$ sudo /etc/init.d/ssh restart

$ sudo service ssh restart


5. samba 설치

• 설치

$ sudo apt-get install samba 


samba 유저 추가

$ sudo smbpasswd -a ubuntu

New SMB password:

Retype new SMB password:

 

• 계정 삭제 방법

$ smbpasswd -x 아이디


환경 설정

$ sudo vi /etc/samba/smb.conf

→ 아래 경로에서 주석을 제거하거나 내용을 추가해 준다.


[homes]

comment = Home Directories

browseable = no

valid users = %S

read only = no

 

[NFS]

comment = Test Linux Server

path = /NFS

read only = no

create mask = 775

directory mask = 775




• 디렉토리 설정

$ sudo mkdir /TNFS

$ sudo mkdir /TNFS/Proj

$ sudo mkdir /TNFS/tftpboot

$ sudo mkdir /TNFS/nfs

$ sudo chmod -R 775 /TNFS

$ sudo chown ubuntu:ubuntu /TNFS

$ sudo ln -s /TNFS/Proj /Proj

$ sudo ln -s /TNFS/nfs /nfs

$ sudo ln -s /TNFS/tftpboot /tftpboot

 

samba 방화벽설정

$ sudo ufw allow 139,445/tcp

$ sudo ufw allow 137,138/udp

 

samba 재 시작.

$ sudo service smbd restart

 

 

samba 접속

\\[IP]



6. tftp 설치

• 설치

$ sudo apt-get install tftpd-hpa tftp-hpa


tftp 디렉터리 생성

$ sudo mkdir -p /NFS/tftpboot


tftp 설정

$ sudo vi /etc/default/tftpd-hpa


TFTP_USERNAME="tftp"

 TFTP_DIRECTORY="/TNFS/tftpboot"

 TFTP_ADDRESS="0.0.0.0:69"

 TFTP_OPTIONS="--secure"



tftp 공유 디렉토리 설정

$ sudo chmod -R 775 /TNFS/tftpboot/

 

• 방화벽 설정

$ sudo ufw allow 69/tcp

$ sudo ufw allow 69/udp

 

• 서비스 재 시작

$ sudo service tftpd-hpa restart



7. nfs 설치

• 설치

$ sudo apt-get install nfs-kernel-server nfs-common portmap


 • tftp 디렉터리 생성

$ sudo mkdir -p /NFS/nfs

 

 nfs 설정

$ sudo vi /etc/exports


/TNFS/nfs *(rw,async,no_root_squash,no_subtree_check,insecure)



nfs 포트설정

$ sudo ufw allow 111,2049,4000,4001,4002,4003,4004/tcp

$ sudo ufw allow 111,2049,4000,4001,4002,4003,4004/udp

 

$ vi /etc/services


# nfs

status 4000/tcp

status 4000/udp

mountd 4002/tcp

mountd 4002/udp

rquotad 4003/tcp

rquotad 4003/udp



$ sudo vi /etc/default/nfs-kernel-server

→ 아래와 같이 주석 처리한 후 아래 내용으로 변경.

#RPCMOUNTDOPTS=--manage-gids

RPCMOUNTDOPTS="-p 4002 -g"


$ sudo vi /etc/modprobe.d/options


options lockd nlm_udpport=4001 nlm_tcpport=4001


• 서비스 재 시작 

$ sudo /etc/init.d/nfs-kernel-server restart

 

 • 타겟 보드에서 테스트

# ifconfig eth0 [같은 IP 대역으로 변경]

# mount -t nfs -o nolock,tcp [IP주소]:/TNFS/nfs /tmp


완료.

+ Recent posts