board_android-IoT/STM32F 2025. 3. 19. 16:58

 

[Cortex-M3] 타이머(TIMER) 사용하기

https://embejied.tistory.com/86

 

[Cortex-M3] 타이머(TIMER) 사용하기

STM32F100RB 칩 안에는 AVR처럼 여러개의 타이머가 있다. 각 타이머는 16bit로 동작하는것 같다. 먼저 타이머의 기능을 살펴보면 여러가지 모드가 있는데 가장 기본적인 Counter Mode(Upcounting & Downcounting)

embejied.tistory.com

 

posted by cskimair
:
board_android-IoT/STM32F 2025. 3. 18. 14:33

 

A76XX + ESP32 ,  example

https://github.com/Xinyuan-LilyGO/LilyGO-T-A76XX

 

GitHub - Xinyuan-LilyGO/LilyGO-T-A76XX: LilyGo A7670X A7608X SIM7670G series

LilyGo A7670X A7608X SIM7670G series. Contribute to Xinyuan-LilyGO/LilyGO-T-A76XX development by creating an account on GitHub.

github.com

 

 

https://www.waveshare.com/wiki/A7670E_Cat-1_HAT

 

 

 

Test with minicom

1. Connect the A7600X Cat-1

Test with minicom

1. Connect the A7600X Cat-1/GSM/GPRS HAT to Jetson Nano.
2. Open a terminal and install the minicom tool.

sudo apt-get install minicom 

3. Open a minicom and test with AT commands.

sudo minicom -D /dev/ttyTHS1 -b 115200


To exit the minicom, you can press Ctrl+a and then press X. To configure, you can pres Ctrl+A and then Z.

 

 

 

 

https://periar.tistory.com/230

라즈베리파이4 모든 UART 활성화하기

 

라즈베리파이4 모든 UART 활성화하기

라즈베리파이4 에는 모두 6개의 uart 포트가 존재한다. www.raspberrypi.org/documentation/configuration/uart.md UART configuration - Raspberry Pi Documentation documentation > configuration > uart UART configuration There are two types of UA

periar.tistory.com

 

 

 

 

https://www.waveshare.com/a7670e-cat-1-hat.htm

 

 

 

posted by cskimair
:
board_android-IoT/STM32F 2025. 3. 18. 14:21

 

LTE Cat 1은 4G LTE 기술의 일종으로, 장치 간 통신을 위한 사물인터넷(IoT) 애플리케이션에 사용됩니다. LTE Cat 1은 2008년에 표준화되었으며, 중간 속도의 LTE 표준으로 분류됩니다. 

 
 
LTE Cat 1의 특징 
 
 
  • 1G Cat 4이라고도 불림
  • M2M(Machine-to-Machine) IoT 애플리케이션에 적합
  • 보다 다양한 기능을 갖춘 IoT 애플리케이션에 사용
  • 고속 데이터 속도를 요구하는 IoT 애플리케이션에 사용
LTE Cat 1의 최고 전송 속도 최고 다운로드 속도: 10Mbps, 최고 업로드 속도: 5Mbps, 사용 대역폭: 20MHz, 실시간성: 지원, 이동성: 지원. 
 
 
LTE Cat 1과 관련된 기타 정보
  • LTE Cat 1은 Long Term Evolution Category 1의 약자로, 4G LTE 기술의 한 변형입니다 
     

 

  •  
  • LTE는 HSDPA에서 한층 업그레이드된 휴대전화 고속 무선 데이터 패킷통신규격입니다 
     
  •  
  • LTE Cat 1은 3.9세대 무선통신규격인 HSPA+와 함께 사용됩니다 
     

 

posted by cskimair
:
board_android-IoT/STM32F 2025. 3. 7. 14:06

STM32F437VITx에서 TIM2를 0.1ms(100µs) 간격으로 인터럽트 발생시키는 설정 방법

STM32F437VITx의 TIM2는 32비트 범용 타이머로 동작하며, 기본 클록 소스를 사용하여 0.1ms 간격으로 인터럽트를 발생시키도록 설정할 수 있습니다.


1. CubeMX 설정 방법

CubeMX에서 TIM2를 설정하여 0.1ms(100µs) 간격으로 인터럽트 발생하도록 설정하는 방법입니다.

① TIM2 타이머 설정

  1. STM32CubeMX에서 TIM2 활성화
    • Mode: Internal Clock
    • Clock Source: Internal Clock
    • Prescaler: SystemCoreClock에 따라 설정
    • Counter Mode: Up
    • ARR (Auto-reload register): 999 (1ms 기준에서 10배 빠르게)
    • Prescaler 설정을 통해 원하는 주기로 맞춤

② 계산: 0.1ms(100µs) 인터럽트 발생

① TIM2 클록 확인

STM32F437VITx에서 APB1 버스는 최대 45MHz(최대 90MHz / 2) 속도로 동작합니다.

  • TIM2는 APB1에 연결되어 있으며, 타이머 클록이 x2 배속이므로 TIM2의 기본 클록은 90MHz입니다.

② TIM2 설정값 계산

타이머 인터럽트 주기 공식:

Timer Period=(PSC+1)×(ARR+1)TIM_CLK\text{Timer Period} = \frac{(\text{PSC} + 1) \times (\text{ARR} + 1)}{\text{TIM\_CLK}}

  • 0.1ms(100µs) = ((PSC + 1) * (ARR + 1)) / 90MHz
  • 적절한 값 선택:
    • PSC = 89 (즉, 90MHz / (89+1) = 1MHz)
    • ARR = 99 (즉, 1MHz / (99+1) = 10kHz → 100µs)

③ CubeMX에서 NVIC 인터럽트 활성화

  • TIM2 global interrupt 활성화
  • 코드 자동 생성 후 stm32f4xx_it.c에서 인터럽트 서비스 루틴(ISR) 작성

2. Keil / uVision 코드 작성

CubeMX에서 생성된 코드에서 tim.c 파일과 인터럽트 핸들러에 추가합니다.

① main.c에서 TIM2 시작

#include "tim.h"

HAL_TIM_Base_Start_IT(&htim2);

② stm32f4xx_it.c에서 TIM2 인터럽트 핸들러

void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim2);
}

③ tim.c에서 인터럽트 콜백 함수 추가

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        // 0.1ms마다 실행할 코드
    }
}

3. 직접 레지스터 설정 (Keil/uVision)

CubeMX 없이 Keil/uVision에서 직접 타이머 설정할 수도 있습니다.

① RCC에서 TIM2 클록 활성화

RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2 클록 활성화

② TIM2 설정

TIM2->PSC = 89;   // 프리스케일러 (90MHz / (89+1) = 1MHz)
TIM2->ARR = 99;   // 자동 재로드 값 (1MHz / 100 = 10kHz = 0.1ms)
TIM2->DIER |= TIM_DIER_UIE; // 업데이트 인터럽트 활성화
TIM2->CR1 |= TIM_CR1_CEN;   // 타이머 시작

③ NVIC 설정 (인터럽트 활성화)

NVIC_EnableIRQ(TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn, 1);

④ 인터럽트 핸들러 구현

void TIM2_IRQHandler(void)
{
    if (TIM2->SR & TIM_SR_UIF) // 업데이트 인터럽트 플래그 확인
    {
        TIM2->SR &= ~TIM_SR_UIF; // 플래그 클리어
        // 0.1ms마다 실행할 코드
    }
}

4. 요약

  • CubeMX 사용 시
    • TIM2를 Internal Clock으로 설정
    • PSC = 89, ARR = 99 설정 (100µs 인터럽트 발생)
    • NVIC 인터럽트 활성화 후 HAL_TIM_PeriodElapsedCallback에서 코드 작성
  • Keil/uVision 직접 설정
    • RCC->APB1ENR에서 TIM2 클록 활성화
    • PSC = 89, ARR = 99으로 설정
    • TIM2->DIER |= TIM_DIER_UIE;로 인터럽트 활성화
    • TIM2_IRQHandler()에서 인터럽트 처리

이제 TIM2가 0.1ms(100µs) 간격으로 정상 동작할 것입니다. 🚀

 

 

 

posted by cskimair
:
board_android-IoT/STM32F 2025. 3. 6. 13:47

Run #1: 입력내용

C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin STM32F407VET6_437VIT6\STM32F407VET6_437VIT6.axf  --output=STM32F407VET6_437VIT6\STM32F407VET6_437VIT6.bin

 

프로젝트명\MDK-ARM\타겟폴더명:

> STM32F407VET6_437VIT6\MDK-ARM\STM32F407VET6_437VIT6

 

 

posted by cskimair
:
board_android-IoT/STM32F 2025. 2. 28. 22:50

 


//#ifdef __GNUC__
//#warning "__GNUC__ is defined ---------" 
//  // With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf  set to 'Yes') calls __io_putchar() 
//  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
//#else
//#warning "__GNUC__ is -------------- not !!!!    defined  --- keil  "   
//  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
//#endif /* __GNUC__ */
//  
  
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  // for  keil    
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}

//int _write(int file, char *ptr, int len) {
//    HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, HAL_MAX_DELAY);
//    return len;
//}
/*
// UART2 리다이렉트 (printf 사용 가능)
int _write(int file, char *ptr, int len) {
    HAL_UART_Transmit(&huart2, (uint8_t*) ptr, len, HAL_MAX_DELAY);
    return len;
}
*/

 

posted by cskimair
: