HAL드라이버 내에 일정시간동안 지연시켜주는 HAL_Delay 함수가 있습니다.

/**
  * @brief This function provides minimum delay (in milliseconds) based
  *        on variable incremented.
  * @note In the default implementation , SysTick timer is the source of time base.
  *       It is used to generate interrupts at regular time intervals where uwTick
  *       is incremented.
  * @note This function is declared as __weak to be overwritten in case of other
  *       implementations in user file.
  * @param Delay specifies the delay time length, in milliseconds.
  * @retval None
  */
__weak void HAL_Delay(uint32_t Delay)

지연 시간은 (Delay + 1)ms입니다.

 

즉 HAL_Delay(0);을 호출하면 1ms의 딜레이가 발생됩니다. 

 

함수 내부를 보면

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
}

 함수가 호출된 시점부터 wait동안 while에 묶여있도록 코드가 작성되어있습니다.

 

default로 HAL 드라이버는 1ms마다 1Tick씩 증가하도록 코딩되어 있습니다.

 

또 mininum wait로 1ms(uwTickFreq)가 추가되도록 되어있어 Delay에 0을 넣으면 1ms의 딜레이가 발생되는 것 입니다.

 

HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */

typedef enum
{
  HAL_TICK_FREQ_10HZ         = 100U,
  HAL_TICK_FREQ_100HZ        = 10U,
  HAL_TICK_FREQ_1KHZ         = 1U,
  HAL_TICK_FREQ_DEFAULT      = HAL_TICK_FREQ_1KHZ
} HAL_TickFreqTypeDef;

 

1넣었을 때 1ms 딜레이가 걸리게 하고 싶다!

1000 넣었을 때 1초 딜레이가 걸리게 하고 싶다!

 

하시는 분은 HAL_Delay 함수를 아래처럼 따로 작성하시면 됩니다.

 

/* main.c */
void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  while ((HAL_GetTick() - tickstart) < Delay)
  {
  }
}
​

 

하지만 HAL_Delay 함수를 사용하게 되면

그 위치에서 멈춰있기 때문에 저는 잘 사용하지 않습니다.

반응형

안녕하세요.

 

20.05.18일 기준 TrueStudio는 9.3.0 까지 Release되었습니다.

 

결론부터 말씀드리자면 새로 개발하는 사람들은 STM32CubeIDE로 넘어가시길 추천드립니다.

 

STM32CubeIDE는 TrueStudio와 STM32CubeMX를 결합한 개발툴로 Eclipse기반입니다.

 

ST사의 TrueStudio 홈페이지로 가면 TrueStudio가 아닌 STM32CubeIDE를 추천하고 있습니다.

 

For new designs we recommend using STM32CubeIDE instead of Atollic TrueSTUDIO. There will be no new releases of TrueSTUDIO.

 

더 이상 TrueStudio의 새 버전을 내지 않는다고 선언했습니다.

 

만약 기존 프로젝트가 TrueStudio로 되어있다면 그대로 개발을 계속 하고,

새 프로젝트를 진행하게 될 때 CubeIDE로 넘어가시면 될 것 같습니다.

 

 

 

 

 

CubeIDE, TrueStudio, CubeMX 아이콘

 

 

 

STM32CubeIDE 화면, TrueStudio와 동일하다.

 

 

STM32CubeIDE에서 .ioc 파일을 실행한 화면, IDE내에 CubeMX가 도킹이 된 상태로 실행이된다.

 

반응형

사용 MCU: STM32F103VCT

사용 IDE: TrueSTUDIO 9.3.0

 

STM32F HAL드라이브에서 HAL_ADCEx_Calibration_Start라는 함수가 있습니다.

/**
  * @brief  Perform an ADC automatic self-calibration
  *         Calibration prerequisite: ADC must be disabled (execute this
  *         function before HAL_ADC_Start() or after HAL_ADC_Stop() ).
  *         During calibration process, ADC is enabled. ADC is let enabled at
  *         the completion of this function.
  * @param  hadc: ADC handle
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc);

 

이 함수를 꼭 써야하는가 ? 의문이 들어서 Calibration을 하고 안 하고의 차이점을 확인하기 위해 직접 실험 해 보았습니다.

 

STM32F103VCT6가 달려있는 보드를 사용했고 ADC한 회로는 아래와 같이 가변저항으로 실험 했고 확인하기 좋게

한쪽으로 끝까지 돌려 PC5_SBT에 3.3V가 들어가도록 하였습니다. 

 

이론적으로 ADC결과는 4095(12bit ADC)가 나와야합니다.

가변저항 회로도

 

실험한 코드는 아래와 같습니다.

 

/* 100ms마다 ADC결과 전송 */
void adc_task()
{
    static uint32_t time = 0;
    uint16_t value;
    
    if (HAL_GetTick() - time < 100) {
    	return;
    }
    
    time = HAL_GetTick();
    
    /* ADC 시작 */
    HAL_ADC_Start(&hadc1);
    
    /* ADC가 완료될 때까지 대기 */
    while(HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK);
    
    /* ADC 값 가져오기 */
    value = HAL_ADC_GetValue(&hadc1);
    
    /* ADC 중지 */
    HAL_ADC_Stop(&hadc1);

    printf("%d\r\n", value);
}


int main(void)
{
  ...
  
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  
  ...
  
  /* ADC Calibration ? 실험 포인트 */
  while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK);
  
  while(1)
  {
  	adc_task();
  
  }
}

 

결과 확인

결과는 제가 확인하기 편하게 Electron으로 GUI툴을 작성하여 Serial값을 수신하여 값과 차트로 표현하도록 하였습니다.

 

1. while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK); 를 주석처리 하고 ADC 결과 값 확인

Calibration 없이 3.3V ADC 결과

이론적이라면 ADC값이 최대값인 4095가 나와야하는데 4030~40대가 나오네요.

 

 

2. while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK); 호출한 후 ADC 결과 값 확인

Calibration 후 3.3V ADC 결과

 

중간에 하나씩 튀는 값이 있지만 이론값대로 4095가 나오는 것을 볼 수 있습니다.

 

 

아래는 위 두 실험을 한 차트에 표현했을 때 차트입니다. 차이가 있는것을 볼 수 있습니다.

(Calibration 후 ADC가 flat하니 보기 좋은데 최대 전압이라 그렇지 전압을 조금 내리면 노이즈 정도는 비슷합니다.)

 

반응형

HAL Driver 중에 GPIO에 대해서 소개하겠습니다.

 

 

stm32f1xx_hal_gpio.c

 

 

  • void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

      CubeMX로 생성한 코드는 아래와 같이 GPIOx 페리페럴을 초기화한다.

 

      GPIO Mode

          GPIO_MODE_INPUT: 입력모드

          GPIO_MODE_OUTPUT_PP: 출력 (Push Pull) 모드

          GPIO_MODE_OUTPUT_OD: 출력 (Open Drain) 모드

          GPIO_MODE_AF_PP: 대체 기능(Alternate Function), (Push Pull)모드

          GPIO_MODE_AF_OD: 대체 기능(Alternate Function), (Open Drain)모드

 

          GPIO_MODE_ANALOG: 아날로그 모드

 

          GPIO_MODE_IT_RISING: 외부 인터럽트(External Interrupt)모드, Rising Edge

          GPIO_MODE_IT_FALLING: 외부 인터럽트(External Interrupt)모드, Falling Edge

          GPIO_MODE_IT_RISING_FALLING: 외부 인터럽트(External Interrupt)모드, Rising & Falling Edge

          

          GPIO_MODE_EVT_RISING: 외부 이벤트(External Event)모드, Rising Edge

          GPIO_MODE_EVT_FALLING: 외부 이벤트(External Event)모드, Falling Edge

          GPIO_MODE_EVT_RISING_FALLING: 외부 이벤트(External Event)모드, Rising & Falling Edge

            * Event모드는 인터럽트 발생시키지 않고 저전력모드에서 Wake-up하는데 사용된다.

          

      GPIO Pull

          GPIO_NOPULL

          GPIO_PULLUP

          GPIO_PULLDOWN

 

      GPIO Speed

          GPIO_SPEED_FREQ_LOW

          GPIO_SPEED_FREQ_MEDIUM

          GPIO_SPEED_FREQ_HIGH

/* GPIO 초기화 */
void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIOD APB2 Clock ENABLE */
    __HAL_RCC_GPIOD_CLK_ENABLE();
    
    /* Configure GPIO pins : PD13 PDPin */
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
    
    /* 외부 인터럽트(EXTI) 설정 */
    HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}

 

  • void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)

      GPIO 설정을 초기화 한다

 

  • void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

      GPIOx의 Pin의 상태를 설정한다.

      GPIO_PinState에는 GPIO_PIN_RESET(0) 과 GPIO_PIN_SET(1) 이 있다.     

/* HAL_GPIO_WritePin 예시 */
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); // GPIO OUTPUT LOW
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);   // GPIO OUTPUT HIGH

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 0); // GPIO OUTPUT LOW
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 1); // GPIO OUTPUT HIGH

 

  • GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

      GPIOx의 GPIO_Pin의 상태를 가져온다. 이때 GPIO Pin의 mode는 GPIO_MODE_INPUT 이어야 한다.

GPIO_PinState state;

state = HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_5); // GPIOE5 의 상태를 읽는다

 

  • void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

      GPIO의 상태를 반전(Toggle)시킨다.

HAL_GPIO_TogglePin(GPIOE, GPIO_Pin_5); // GPIOE5 핀의 출력 상태를 반전시킨다.

 

  • HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

      GPIO Pin의 설정을 고정시킨다.

반응형

안녕하세요.

 

https://make.e4ds.com/main/main.asp 에서 "완전 정복 퀘스트 챌린지" 라는 이벤트를 진행하더라고요

 

퀘스트 1(개발환경 구현)을 통과하면 STM32MP1을 무상으로 제공합니다.

 

퀘스트 파이널까지 통과한 참가자에는 겔럭시 S20, 겔럭시 시계, 버즈 의 경품도 제공하더라고요

 

저는 퀘스트 1을 하고 연휴동안 개인 사정으로 외부에 있어 더이상 참여하지 못합니다 ㅠ

 

그래도 퀘스트는 개인적으로 따라가려고 합니다.

 

무튼 퀘스트 1을 깨고 STM32MP157C-DK2를 수령했고, 개봉기록을 남깁니다.

 

 

STM32MP157C-DK2 박스

 

박스를 열면 제일 처음 나오는게 보드에 대한 설명!

보드 스펙 설명 종이

위 종이 아래에는 USB-C타입 케이블 ! 양쪽이 동일한 타입이에요.. 이건 어디에 쓰는걸까? 디바이스간에 USB 통신을 이런식으로 하나??

양쪽이 USB-C타입인 케이블

케이블과 정전기 방지 스폰지를 제거하면 LCD가 반겨줍니다 ! 

STM32MP157C-DK2 보드에 달린 LCD

 

 

LCD를 통채로 들어올리면 파란색 보드와 같이 올라옵니다!

 

아랫면을 보니 16G micro-sd 카드도 하나 달려오네요. 아두이노와 결합해서 쓸 수 있는 커넥터도 보이네요

 

 

옆면에는 라즈베리파이와 같은 40핀짜리 헤더핀도 보이네요

 

 

 

 

처음에 전원을 마이크로 5핀 커넥터로 전원을 인가하나? 싶어서 꽃아봤는데 빨간불은 들어오는데

켜지지는 않더라고요 !! 알고보니까 이 보드의 전원 커넥터는 USB-C타입 커넥터!!

 

 

아래 사진처럼 랜포트 달려있는 쪽에 커넥터에 전원 커넥터를 연결해야지 LCD에 뭔가가 나타납니다!!

반대쪽에 연결하면 동작 안하더라고요

 

약간의 부팅 시간이 지나면 짠 !  화면이 나타납니다

 

아래는 구동 영상입니다

기본으로 카메라, 비디오 재생, 3D GPU, 블루투스, WIFI, 손글씨 인식과 같은 예제들이 들어있어요.

엄청난 성능인거 같습니다.

 

 

 

과연 이 보드로 무엇을 할 수 있을지 기대되네요 

반응형

'MCU > STM32MP1' 카테고리의 다른 글

[STM32MP157C-DK2] 환경개발 구축  (0) 2020.04.20
STM32MP157C-DK2 소개  (1) 2020.04.20

 

STM32MP157C-DK2는 우분투 환경에서 개발을 진행합니다.

 

그래서 Window 10 Hyper-V 가상환경에서 Ubuntu18.04.4를 설치하여 진행합니다.

아래 링크를 참조하여 개발환경 구축을 참고합니다.

* Starter Package

https://wiki.st.com/stm32mpu/index.php/STM32MP15_Discovery_kits_-_Starter_Package

 

* Developer Package

https://wiki.st.com/stm32mpu/index.php/STM32MP1_Developer_Package

 

* STM32 MPU Wiki

https://wiki.st.com/stm32mpu/wiki/Getting_started/STM32MP1_boards/STM32MP157C-DK2/Develop_on_Arm%C2%AE_Cortex%C2%AE-A7/Modify,_rebuild_and_reload_the_Linux%C2%AE_kernel

 

 

STM32CubeProgrammer tool 설치

 

1. (없는 사람만 진행) JAVA JRE 설치

$ sudo apt-get install openjdk-8-jre

 

2.  https://www.st.com/en/development-tools/stm32cubeprog.html에서 STM32CubeProgrammer 다운로드

 

3. 압축을 풀고 다음을 입력하여 설치

$ ./SetupSTM32CubeProgrammer-2.4.0.linux

 

4. binary PATH 등록

$ export PATH=<my STM32CubeProgrammer install directory>/bin:$PATH

 

Developer Package 설치    

 

1. STM32MP1 Developer Package SDK 설치
     en.SDK-x86_64-stm32mp1-openstlinux-20-02-19.tar.xz에서 SDK를 다운로드

 

2. 압축 해제

$ tar xvf en.SDK-x86_64-stm32mp1-openstlinux-20-02-19.tar.xz

 

3. 파일 권한 변경

$ sudo chmod +x stm32mp1-openstlinux-20-02-19/sdk/st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-2.6-openstlinux-20-02-19.sh

 

4. 설치 스크립트 실행 

$ ./stm32mp1-openstlinux-20-02-19/sdk/st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-2.6-openstlinux-20-02-19.sh -d <working directory absolute path>/Developer-Package/SDK

필자의 <working directory absolute path>는 /home/jeon/STM 이다.

 

SDK 설치가 성공적으로 완료된 화면

 

5. SDK 환경 설정 스크립트 - SDK 시작

      ** SDK 환경 설정 스크립트는 크로스 컴파일 하는 터미널마다 한번씩 실행되어야 합니다.

$ source <SDK installation directory>/environment-setup-cortexa7hf-neon-vfpv4-ostl-linux-gnueabi

위 스크립트가 성공적으로 적용되었으면 아래와 같은 커맨드를 입력하였을 경우 아래 그림처럼 나타난다.

$ echo $ARCH

$ echo $CROSS_COMPILE

$ $CC --version

$ echo $OECORE_SDK_VERSION

성공적으로 SDK가 실행된 화면

 

Linux Kernel 설치

1. Developer-package 폴더에 Kernel source 다운로드

            en.SOURCES-kernel-stm32mp1-openstlinux-20-02-19.tar.xz    

 

2. 압축 해제

$ tar xvf en.SOURCES-kernel-stm32mp1-openstlinux-20-02-19.tar.xz

$ cd stm32mp1-openstlinux-20-02-19/sources/arm-ostl-linux-gnueabi/linux-stm32mp-4.19-r0/

$ tar xvf linux-4.19.94.tar.xz

 

3. ST 패치 적용

$ cd linux-4.19.94/

$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done

 

4. fragment 적용

$ make ARCH=arm multi_v7_defconfig "fragment*.config"

$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done

$ yes '' | make ARCH=arm oldconfig

* 이때 각종 프로그램이 설치되어있지 않다고 메세지가 나타날 수 있다. apt-get install로 설치해주자.

 

* make가 없다고 메시지가 나타날 수 있다. sudo apt-get install make를 입력하여 설치하자.

make가 설치되어있지 않아 나타나는 메세지

* gcc가 없다고 메세지가 나타날 수 있다. sudo apt-get install gcc를 입력하여 설치.

gcc가 설치되어있지 않아 나타나는 메세지

 

* bison이 없다고 메세지가 나타날 수 있다. sudo apt-get install bison을 입력하여 설치하자.

bison이 설치되어있지 않아 나타나는 메세지

* flex가 없다고 메세지가 나타날 수 있다. sudo apt-get install flex를 입력하여 설치하자.

flex가 설치되어있지 않아 나타나는 메세지

 

 

yes '' make ARCH=arm oldconfig 를 입력 후 화면 / 리눅스 커널 소스 코드 준비 완료

5. 커널 이미지 빌드 (10분이상 소요)

$ make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040

 

* 아래 gcc unrecognized argument와 같은 에러를 만나면 source 커맨드를 다시 진행한다.

$ source <SDK installation directory>/environment-setup-cortexa7hf-neon-vfpv4-ostl-linux-gnueabi

make할 때 다음과 같은 에러를 만날 수 있다.

* 아래 openssl/bio.h와 같은 에러를 만나면 libssl-dev를 설치한다.

$ sudo apt-get install libssl-dev

make할 때 다음과 같은 에러도 만날 수 있다.

 

Build가 완료된 화면

6. 커널 모듈 빌드

$ make ARCH=arm modules

커널 모듈 빌드가 완료된 화면

 

7. output build artifacts 생성

$ mkdir -p $PWD/install_artifact/

$ make ARCH=arm INSTALL_MOD_PATH="$PWD/install_artifact" modules_install

output build artifacts 완료

 

U-Boot 설치

1. Developer-package 폴더에 U-boot source 다운로드

     en.SOURCES-u-boot-stm32mp1-openstlinux-20-02-19.tar.xz 

 

2. 압축 해제 및 패치

$ tar xvf en.SOURCES-u-boot-stm32mp1-openstlinux-20-02-19.tar.xz

$ cd stm32mp1-openstlinux-20-02-19/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2018.11-r0/

$ tar xvf v2018.11.tar.gz   

$ cd u-boot-2018.11

$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done

 

3. 컴파일 환경 설정

$ make stm32mp15_basic_defconfig

정상적으로 컴파일 환경이 설정된 화면

 

4. 빌드

$ make DEVICE_TREE=stm32mp157c-dk2 all

u-boot build 완료된 화면

반응형

'MCU > STM32MP1' 카테고리의 다른 글

[STM32MP1]STM32MP157C-DK2 개봉기  (0) 2020.05.09
STM32MP157C-DK2 소개  (1) 2020.04.20

https://make.e4ds.com/ 에서 STM32MP1 완전 정복 퀘스트 챌린지를 진행한다.

 

임베디드 보드에 리눅스를 올려서 사용하는것은 처음이라 퀘스트를 수행하면서 블로그에 기록을 남기려한다.

 

퀘스트를 진행하는데 사용되는 STM32MP157C-DK1 보드에 대해 소개하자면

STM32MP157C-DK2  보드

 

  • Common features
    • STM32MP157 Arm®-based dual Cortex®-A7 32 bits + Cortex®-M4 32 bits MPU in TFBGA361 package
    • ST PMIC STPMIC1
    • 4-Gbit DDR3L, 16 bits, 533 MHz
    • 1-Gbps Ethernet (RGMII) compliant with IEEE-802.3ab
    • USB OTG HS
    • Audio codec
    • 4 user LEDs
    • 2 user and reset push-buttons, 1 wake-up button
    • 5 V / 3 A USB Type-CTM power supply input (not provided)
    • Board connectors:Ethernet RJ454 × USB Host Type-AUSB Type-CTM DRPMIPI DSISMHDMI®Stereo headset jack including analog microphone inputmicroSDTM cardGPIO expansion connector (Raspberry Pi® shields capability)ARDUINO® Uno V3 expansion connectors
    • On-board ST-LINK/V2-1 debugger/programmer with USB re-enumeration capability: Virtual COM port and debug port
    • STM32CubeMP1 and full mainline open-source Linux® STM32 MPU OpenSTLinux Distribution (such as STM32MP1Starter) software and examples
    • Support of a wide choice of Integrated Development Environments (IDEs) including IARTM, Keil®, GCC-based IDEs
  • Board-specific features
    • 4" TFT 480×800 pixels with LED backlight, MIPI DSISM interface, and capacitive touch panel
    • Wi-Fi® 802.11b/g/n
    • Bluetooth® Low Energy 4.1

 

 

스펙만 봐도 어마어마한 녀석인거 같다. 

이것으로 무엇을 할 수 있을지는 퀘스트를 진행하면서 알아가 보도록 하자.

반응형

'MCU > STM32MP1' 카테고리의 다른 글

[STM32MP1]STM32MP157C-DK2 개봉기  (0) 2020.05.09
[STM32MP157C-DK2] 환경개발 구축  (0) 2020.04.20

트루스튜디오는 이클립스 IDE 기반이기 때문에 단축키는 같다.




Ctrl + A 로 전체 선택 후 Ctrl + Shift + f



반응형

+ Recent posts