• __attribute__((weak))
• 해당 심볼을 weak symbol로 만든다.
• 링커가 링크를 수행 시 다른곳에 같은 이름으로 만든 strong symbol이 존재하면 weak symbol 대신 strong symbol을 사용한다.
• __attribute__((weak))
• 해당 심볼을 weak symbol로 만든다.
• 링커가 링크를 수행 시 다른곳에 같은 이름으로 만든 strong symbol이 존재하면 weak symbol 대신 strong symbol을 사용한다.
# STM32F429I-DISCOVERY
# STM32F429ZIT6 (144Pin / 180Mhz)
# FreeRTOS (RTOS)
# KEY (PA0)
# 2017.09.08 Callback 함구 구현
• 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 파일에서 확인할 수 있다.
#인터럽트 우선 순위에 대한 내용은 추후 기술 하겠음.
끝.
# 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등으로 다시 연결하면 됩니다.
완료.
# 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을 클릭합니다.
끝.
FreeRTOS V7.x 를 V9.0으로 업그레이드 하는 도중에 컴파일 에러가 발생하였다.
캐스팅 연산을 컴파일러가 인식하지 못하는 듯 하다.
아래와 같이 수정해 주면 된다.
출처
:http://www.freertos.org/FreeRTOS_Support_Forum_Archive/August_2016/freertos_Portmacro.h_compile_error_in_9.0.0_adb740d7j.html
ST-Link, No MCU device found Session aborted!
또는
STLink USB Communication error
오류 메시지가 발생.
CubeMX로 코드 생성 후 CPU에 다운로드를 하면 메시지가 발생하였다.
* 오류가 발생한 이유는 CubeMX에서 SWDIO, SWCLK Pin 설정을 해주지 않아서 였다.
• 아래와 같이 핀설정을 해준다.
→ PA13 [SYS_JTMS-SWDIO] / PA14 [SYS_JECK-SWCLK]
• Peripherals → SYS → Debug "Serial Wire"를 선택한다.
• 복구 방법은 아래 URL을 참고한다.
http://theniceguy.tistory.com/18
끝.
Can not connect to target!
Please select "Connect Under Reset" mode from Target -> Settings menu and try again.
If you're trying to connect to a low frequency application, please select a lower SWD Frequency mode from Target -> Setting menu.
↓