반응형

rak3172 모듈과 Nucleo 보드를 연결하여 수신 게이트웨이 구현.

 

1. 구성

■수신기

RAK3172_IO ==== Nucleo STM32F446RE ==== PC(UART)

 

■송신기

RAK3172_IO(USB) ==== PC(UART)

 

송신기에서 SEND Message전송 시 수신기에서 디버깅 메시지 출력

 

예1)

송신기

AT+PSEND=02011001011103

수신기

 

 

예2)

송신기

AT+PSEND=0201100201021003


수신기

 

예3)

송신기

AT+PSEND=020110030102031203



수신기

 

 

 

2. 테스트 코드

- 환경 STM32CubeIDE 1.8.0

 

/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * @file           : main.c
 * @brief          : Main program body
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2026 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */


int _write(int fd, char *ptr, int len)
{
  HAL_UART_Transmit(&huart2, (unsigned char*)ptr, len, HAL_MAX_DELAY);
  return len;
}



/*
uint8_t rx_byte;
uint8_t rx_buf[128];
uint16_t rx_idx = 0;

void AT_Send(char *cmd)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)cmd, strlen(cmd), HAL_MAX_DELAY);
}

void AT_Receive(void)
{
    if (HAL_UART_Receive(&huart1, &rx_byte, 1, 10) == HAL_OK)
    {
        if (rx_idx < sizeof(rx_buf) - 1)
        {
            rx_buf[rx_idx++] = rx_byte;
            rx_buf[rx_idx] = 0;  // 문자?�� 종료
        }
    }
}*/

#define state_AT 0
#define state_AT_OK 1
#define state_VER 2
#define state_VER_OK 3
#define state_NWM 4
#define state_NWM_OK 5
#define state_P2P 6
#define state_P2P_OK 7
#define state_PRECV 8
#define state_PRECV_OK 9
#define state_PSEND 10
#define state_PSEND_OK 11
#define state_IDLE_PRE 12
#define state_IDLE 100

#define state_Respon_PSEND 13
#define state_Respon_PSEND_OK 14


#define rx_size 256
uint8_t rx_char;
uint8_t rx_line[rx_size];
uint8_t rx_idx = 0;

volatile uint8_t data_ready = 0;

volatile uint8_t done_state =0;
volatile uint8_t state =0;

volatile uint8_t at_ok = 0;
volatile uint8_t at_error = 0;

#define LINE_SIZE   256
#define DATA_SIZE   256

uint8_t line_buf[LINE_SIZE];
uint8_t line_idx = 0;

uint8_t data_buf[DATA_SIZE];

typedef struct {
  int rssi;
  int snr;
  char payload[64];
} rxp2p_t;

rxp2p_t rxp2p;

#define rx_SIZE   256
uint8_t rx_buf[rx_SIZE];

void Process_Line(char *line)
{
  strncpy((char *)data_buf, line, LINE_SIZE - 1);
  data_buf[LINE_SIZE - 1] = '\0';
  data_ready = 1;
  done_state=1;
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  static uint8_t prev1_char = 0;

  if (huart->Instance == USART1)
    {
      /* LF 기준 라인 종료 (CR 있으면 제거) */
      if (rx_char == '\n')
{

  if (line_idx > 0 && prev1_char == '\r'){
      line_buf[line_idx - 1] = '\0';
  }
  else
    line_buf[line_idx] = '\0';

  Process_Line((char *)line_buf);

  line_idx = 0;
}
      else
{
  line_buf[line_idx++] = rx_char;

  if (line_idx >= LINE_SIZE - 1)
    line_idx = 0;
}

      prev1_char = rx_char;

      HAL_UART_Receive_IT(&huart1, &rx_char, 1);
    }


  //if (huart->Instance != USART1) return;


  /*
    // '\n'은 무시
    if (rx_char == '\n')
    {
        HAL_UART_Receive_IT(&huart1, &rx_char, 1);
        return;
    }

    // 한 줄 끝
    if (rx_char == '\r')
    {
        line_buf[line_idx] = 0;

        // OK 라인이 아니면 데이터로 저장
        if (!(line_idx == 2 &&
              line_buf[0] == 'O' &&
              line_buf[1] == 'K'))
        {
            memcpy(&data_buf[data_idx], line_buf, line_idx);
            data_idx += line_idx;
            data_buf[data_idx++] = '\n';
        }
        else
        {
            at_ok = 1;          // OK 감지
            line_ready = 1;     // 명령 완료
        }

        line_idx = 0;
    }
    else
    {
        line_buf[line_idx++] = rx_char;
    }

    // 보호
    if (line_idx >= LINE_SIZE - 1) line_idx = 0;
    if (data_idx >= DATA_SIZE - 1) data_idx = 0;

    HAL_UART_Receive_IT(&huart1, &rx_char, 1);
   */
}

void rak_send_cmd(char *cmd)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)cmd, strlen(cmd), 100);
  HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, 100);
}


uint8_t buff_VER[30];
//uint8_t buff_SYSV[10];
//uint8_t buff_NWM[5];
//uint8_t buff_P2P[20];
//uint8_t buff_PRECV[10];

void rak_send(void){

  //if(done_state) return;

  switch (state){
    case state_AT:
      {
done_state=0;
rak_send_cmd("AT");
state = state_AT_OK;
break;
      }
    case state_AT_OK:
      {
if(done_state == 1 && at_ok ==0 &&data_buf[0] == 'O' && data_buf[1] == 'K'){
    at_ok=1;
    printf("at_ok\r\n");
    done_state =0;
    state=state_VER;
}
break;
      }
    case state_VER:
      {
at_ok=0;
done_state=0;
rak_send_cmd("AT+VER=?");
state = state_VER_OK;
break;
      }
    case state_VER_OK:
      {

if(done_state ==1){

    if(data_buf[0] != 'O' && data_buf[1] !='K'){
uint8_t len = strlen((char *)data_buf);

if (len >= sizeof(buff_VER))
  len = sizeof(buff_VER) - 1;

memcpy(buff_VER, data_buf, len);
buff_VER[len] = 0;
printf("buff_ver = [%s]\r\n",buff_VER);
    }

    if(at_ok ==0 && data_buf[0] == 'O' && data_buf[1] == 'K'){
at_ok=1;
printf("at ver ok\r\n");
    }
    done_state =0;
    state = state_NWM;
}


break;
      }

    case state_NWM:
      {
at_ok=0;
done_state=0;
rak_send_cmd("AT+NWM=0");
state = state_NWM_OK;
break;
      }
    case state_NWM_OK:
      {
if(done_state == 1){
    if(at_ok ==0 && data_buf[0] == 'O' && data_buf[1] == 'K'){
at_ok=1;
printf("at nwm ok\r\n");

    }
    else {
printf("at nwm error : %s\r\n",data_buf);

    }
    done_state =0;
    state = state_P2P;
}
break;
      }
    case state_P2P:
      {
at_ok=0;
done_state=0;
rak_send_cmd("AT+P2P=920000000:7:0:0:20:14");
state=state_P2P_OK;
break;
      }
    case state_P2P_OK:
      {
if(done_state == 1){
    if(at_ok ==0 && data_buf[0] == 'O' && data_buf[1] == 'K'){
at_ok=1;
printf("at p2p ok\r\n");


    }
    else {
printf("at p2p error : %s\r\n",data_buf);

    }
    done_state =0;
    state = state_PRECV;
}
break;
      }
    case state_PRECV:
      {
at_ok=0;
done_state=0;
rak_send_cmd("AT+PRECV=65533");
state =state_PRECV_OK;
break;
      }
    case state_PRECV_OK:
      {
if(done_state == 1){
    if(at_ok ==0 && data_buf[0] == 'O' && data_buf[1] == 'K'){
at_ok=1;
printf("at precv ok\r\n");

    }
    else {
printf("at precv error : %s\r\n",data_buf);

    }
    done_state =0;
    state = state_IDLE_PRE;
}
break;
      }
    case state_PSEND:
      {
at_ok=0;
done_state=0;
rak_send_cmd("AT+PSEND=1234567890");
state=state_PSEND_OK;
break;
      }
    case state_PSEND_OK:
      {
if(done_state == 1){
    if(at_ok ==0 && data_buf[0] == 'O' && data_buf[1] == 'K'){
at_ok=1;
printf("at psend ok\r\n");
    }
    done_state =0;
    state=state_IDLE_PRE;
}
      }
    case state_IDLE_PRE:
      {
at_ok=0;
done_state=0;
state=state_IDLE;
break;
      }

    case state_Respon_PSEND:
      {

break;
      }
    case state_Respon_PSEND_OK:
      {
break;
      }

    default:
      {
//idle
if(done_state == 1){
    done_state =0;
}
break;
      }
  }
}

#define STX  0x02
#define ETX  0x03
#define MAX_DATA_LEN 32

typedef struct
{
    uint8_t number;
    uint8_t cmd;
    uint8_t len;
    uint8_t data[MAX_DATA_LEN];
    uint8_t crc;
} p2p_frame_t;

static uint8_t hex2byte(char h, char l)
{
    uint8_t hi = (h >= 'A') ? (h - 'A' + 10) : (h - '0');
    uint8_t lo = (l >= 'A') ? (l - 'A' + 10) : (l - '0');
    return (hi << 4) | lo;
}

static int hexstr_to_bytes(const char *hex, uint8_t *out, int maxlen)
{
    int len = 0;
    while (*hex && *(hex + 1) && len < maxlen)
    {
        out[len++] = hex2byte(hex[0], hex[1]);
        hex += 2;
    }
    return len;
}

static uint8_t calc_crc(uint8_t *buf, uint8_t len)
{
    uint8_t crc = 0;
    for (uint8_t i = 0; i < len; i++)
        crc ^= buf[i];
    return crc;
}

static int parse_p2p_frame(uint8_t *buf, int buf_len, p2p_frame_t *out)
{
    if (buf_len < 7) return -1;
    if (buf[0] != STX) return -2;
    if (buf[buf_len - 1] != ETX) return -3;

    out->number = buf[1];
    out->cmd    = buf[2];
    out->len    = buf[3];

    if (out->len > MAX_DATA_LEN) return -4;
    if (buf_len != (out->len + 6)) return -5;

    memcpy(out->data, &buf[4], out->len);
    out->crc = buf[4 + out->len];

    uint8_t crc = calc_crc(&buf[1], 3 + out->len);
    if (crc != out->crc) return -6;

    return 0;
}
/* USER CODE END 0 */

/**
 * @brief  The application entry point.
 * @retval int
 */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */


  printf("hello\r\n");
  /*
  HAL_StatusTypeDef RcvStat;
  uint8_t cmd_AT[10]="AT\r";
  uint8_t rx_buff[10];

  HAL_UART_Transmit(&huart1, cmd_AT, strlen((char*)cmd_AT), HAL_MAX_DELAY);
   */

  //AT_Send("AT\r\n");

  HAL_UART_Receive_IT(&huart1, &rx_char, 1);
  //HAL_UART_Transmit(&huart1, (uint8_t *)"AT\r\n", 4, 100);
  //rak_send_cmd("AT+VER=?");



  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
    {
      rak_send();

      if (data_ready)
         {
           //printf("DATA = [%s]\r\n", data_buf);
           data_ready = 0;

           if(state == state_IDLE){
               char *p = (char *)data_buf;

               if (strncmp(p, "+EVT:RXP2P:", 11) == 0)
         {
           char *rssi_p = strchr(p + 11, ':');
           if (!rssi_p) break;

           char *snr_p = strchr(rssi_p + 1, ':');
           if (!snr_p) break;

           rxp2p.rssi = atoi(p + 11);
           rxp2p.snr  = atoi(rssi_p + 1);

           strncpy(rxp2p.payload, snr_p + 1, sizeof(rxp2p.payload) - 1);
           rxp2p.payload[sizeof(rxp2p.payload) - 1] = '\0';

           uint8_t raw[64];
           int raw_len = hexstr_to_bytes(rxp2p.payload, raw, sizeof(raw));

           p2p_frame_t frame;

           if (parse_p2p_frame(raw, raw_len, &frame) == 0)
           {
               printf("P2P RX OK RSSI=%d SNR=%d NUM=%d CMD=0x%02X LEN=%d\r\n",
                      rxp2p.rssi,
                      rxp2p.snr,
                      frame.number,
                      frame.cmd,
                      frame.len);

               switch (frame.cmd) //command parser
               {
                   case 0x01:
                       printf("CMD 0x01 DATA[0]=0x%02X\r\n", frame.data[0]);
                       break;

                   case 0x10:
                       printf("CMD 0x10\r\n");
                       switch (frame.len)
                           {
                               case 0:
                                   printf("LED STATUS REQ\r\n");
                                   break;

                               case 1:
                                   printf("LED SET: %d\r\n", frame.data[0]);
                                   break;

                               case 2:
                                   printf("LED SET: %d BR=%d\r\n",
                                          frame.data[0],
                                          frame.data[1]);
                                   break;

                               case 3:
                                   printf("LED SET: %d BR=%d TIME=%d\r\n",
                                          frame.data[0],
                                          frame.data[1],
                                          frame.data[2]);
                                   break;

                               default:
                                   printf("CMD 0x10 invalid LEN=%d\r\n", frame.len);
                                   break;
                           }
                       break;

                   default:
                       printf("Unknown CMD\r\n");
                       break;
               }
           }
           else
           {
               printf("P2P Frame Error\r\n");
           }
         }
           }
         }

      /*
      AT_Receive();
         if (strstr((char *)rx_buf, "OK"))
         {
             printf("AT OK\r\n");
             rx_idx = 0;
             memset(rx_buf, 0, sizeof(rx_buf));
         }
       */

      //rak_send_once();

      /*
      if (line_ready)
      {

  line_ready = 0;

 // printf("RX: %s\r\n", rx_line);
  printf("debug : data_buff : %s\r\n",data_buf);
  printf("debug : line_buff : %s\r\n",line_buf);
  line_idx = 0;
  done_state = 0;


      }*/


      /* USER CODE END WHILE */

      /* USER CODE BEGIN 3 */
    }
  /* USER CODE END 3 */
}

/**
 * @brief System Clock Configuration
 * @retval None
 */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
   */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
   * in the RCC_OscInitTypeDef structure.
   */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 180;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

  /** Activate the Over-Drive mode
   */
  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
    {
      Error_Handler();
    }

  /** Initializes the CPU, AHB and APB buses clocks
   */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
      |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
    {
      Error_Handler();
    }
}

/**
 * @brief USART1 Initialization Function
 * @param None
 * @retval None
 */
static void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
    {
      Error_Handler();
    }
  /* USER CODE BEGIN USART1_Init 2 */

  /* USER CODE END USART1_Init 2 */

}

/**
 * @brief USART2 Initialization Function
 * @param None
 * @retval None
 */
static void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
    {
      Error_Handler();
    }
  /* USER CODE BEGIN USART2_Init 2 */

  /* USER CODE END USART2_Init 2 */

}

/**
 * @brief GPIO Initialization Function
 * @param None
 * @retval None
 */
static void MX_GPIO_Init(void)
{
  /* USER CODE BEGIN MX_GPIO_Init_1 */
  /* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* USER CODE BEGIN MX_GPIO_Init_2 */
  /* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
 * @brief  This function is executed in case of error occurrence.
 * @retval None
 */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
    {
    }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
 * @brief  Reports the name of the source file and the source line number
 *         where the assert_param error has occurred.
 * @param  file: pointer to the source file name
 * @param  line: assert_param error line source number
 * @retval None
 */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

반응형

'Project > Lora_RAK3172' 카테고리의 다른 글

RAK3172 AT Command  (0) 2026.01.15
Lora_RAK3172 Module_IO_board  (0) 2026.01.15
반응형

RAK3172 AT Command list

 

제조사에서 공유하는 RUI3 AT Command Manual에서 참조.

RUI3 AT Command Manual | LoRaWAN API & UART Communication

 

RUI3 AT Command Manual | LoRaWAN API & UART Communication

Master RUI3 AT commands to configure LoRaWAN and LoRa P2P on RAK modules. Enhance connectivity, manage settings, and optimize performance.

docs.rakwireless.com

 

기본적으로 P2P 모드 사용 시 아래 커맨드를 활용하였다.

 

1. AT

 

2. AT+VER

 

3. AT+NWM

 

 

4. AT+P2P

 

 

 

5. AT+PRECV

 

 

 

6. AT+PSEND

 

반응형

'Project > Lora_RAK3172' 카테고리의 다른 글

Nucleo_STM32F446RE_RAK3172 수신기  (0) 2026.01.15
Lora_RAK3172 Module_IO_board  (0) 2026.01.15
반응형

Lora Module RAK3172 를 활용한 통신 보드

 

1. 회로 설계

 

 1-1) 전원부

 

1-2) USB to TTL

 

1-3) lora 모듈 및 점퍼 구성

> USB로 연결하거나 MCU에 점퍼를 이용하여 선택적 사용하도록 설계함.

 

2. PCB Artwork

4Layer

 

2-1) TOP view

 

2-2) IN2 view

 

 

2-3) IN3 view

> 해당 copper는 3.3v 전원부 설계

 

2-4) Bottom view

 

3. JLC pcb PCB 발주.

 

gerber_RAK3172_IO_V1.0_251221.zip
0.11MB

 

4. 수삽

 

 

> CP2105 옆 TVS ic가 너무 작아 수삽이 힘들었다.

 

RAK3172_IO_V1.0_251221.pcb
0.52MB
RAK3172_IO_V1.0_251221.sch
0.09MB

반응형

'Project > Lora_RAK3172' 카테고리의 다른 글

Nucleo_STM32F446RE_RAK3172 수신기  (0) 2026.01.15
RAK3172 AT Command  (0) 2026.01.15
반응형

 

1. 계층 회로도

 

2. 회로 그리기

 

 

3. PCB ArtWork

 

4. 3D 뷰어

 

5. 거버 및 드릴 파일 생성

 

6.  거버파일 확인

 

7. JLCPCB PCB 주문

 

반응형
반응형

BME 280은 Bosch에서 Lib를 제공

 

 

1. cubeMX

 

 

2. Source Code

 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include <stdlib.h>
#include <string.h>
#include "./BME280/bme280.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;

UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_USART3_UART_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

int _write(int fd, char *ptr, int len)
{
HAL_UART_Transmit(&huart2, (unsigned char*)ptr, len, HAL_MAX_DELAY);
return len;
}


float temperature;
float humidity;
float pressure;

struct bme280_dev dev;
struct bme280_data comp_data;
int8_t rslt;

char line1[16];
char line2[16];

int8_t user_i2c_read(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
  if(HAL_I2C_Master_Transmit(&hi2c1, (id << 1), &reg_addr, 1, 10) != HAL_OK) return -1;
  if(HAL_I2C_Master_Receive(&hi2c1, (id << 1) | 0x01, data, len, 10) != HAL_OK) return -1;

  return 0;
}

void user_delay_ms(uint32_t period)
{
  HAL_Delay(period);
}

int8_t user_i2c_write(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
  int8_t *buf;
  buf = malloc(len +1);
  buf[0] = reg_addr;
  memcpy(buf +1, data, len);

  if(HAL_I2C_Master_Transmit(&hi2c1, (id << 1), (uint8_t*)buf, len + 1, HAL_MAX_DELAY) != HAL_OK) return -1;

  free(buf);
  return 0;
}


/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("hello\r\n");


  /* BME280 초기화 */
  dev.dev_id = BME280_I2C_ADDR_PRIM;
  dev.intf = BME280_I2C_INTF;
  dev.read = user_i2c_read;
  dev.write = user_i2c_write;
  dev.delay_ms = user_delay_ms;

  rslt = bme280_init(&dev);

  /* BME280 설정 */
  dev.settings.osr_h = BME280_OVERSAMPLING_1X;
  dev.settings.osr_p = BME280_OVERSAMPLING_16X;
  dev.settings.osr_t = BME280_OVERSAMPLING_2X;
  dev.settings.filter = BME280_FILTER_COEFF_16;
  rslt = bme280_set_sensor_settings(BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL, &dev);


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      rslt = bme280_set_sensor_mode(BME280_FORCED_MODE, &dev);
          dev.delay_ms(40);
          /* 데이터 취득 */
          rslt = bme280_get_sensor_data(BME280_ALL, &comp_data, &dev);
          if(rslt == BME280_OK)
          {
            temperature = comp_data.temperature / 100.0;      /* °C  */
            humidity = comp_data.humidity / 1024.0;           /* %   */
            pressure = comp_data.pressure / 10000.0;          /* hPa */
          }

          printf("Temp : %03.1f \r\n",temperature);
          printf("humidity : %03.1f \r\n",humidity);
          printf("pressure : %03.1f \r\n",pressure);
          HAL_Delay(10000);

  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief I2C1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_I2C1_Init(void)
{

  /* USER CODE BEGIN I2C1_Init 0 */

  /* USER CODE END I2C1_Init 0 */

  /* USER CODE BEGIN I2C1_Init 1 */

  /* USER CODE END I2C1_Init 1 */
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C1_Init 2 */

  /* USER CODE END I2C1_Init 2 */

}

/**
  * @brief USART2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */

  /* USER CODE END USART2_Init 2 */

}

/**
  * @brief USART3 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART3_UART_Init(void)
{

  /* USER CODE BEGIN USART3_Init 0 */

  /* USER CODE END USART3_Init 0 */

  /* USER CODE BEGIN USART3_Init 1 */

  /* USER CODE END USART3_Init 1 */
  huart3.Instance = USART3;
  huart3.Init.BaudRate = 115200;
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
  huart3.Init.StopBits = UART_STOPBITS_1;
  huart3.Init.Parity = UART_PARITY_NONE;
  huart3.Init.Mode = UART_MODE_TX_RX;
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART3_Init 2 */

  /* USER CODE END USART3_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

 

3. 결과

NUCLEO-F446RE_BME280.zip
8.54MB

 

 

참고 Link :

https://blog.naver.com/eziya76/221486711330

 

[STM32 HAL] I2C#Protocol + BME280

Reference: Mastering STM32 by Carmine Noviello ** 자료 해석에 오류가 있을 수 있습니다 ** 지난...

blog.naver.com

https://github.com/eziya/STM32_HAL_BME280

 

GitHub - eziya/STM32_HAL_BME280: Bosch BME280 library for STM32 HAL

Bosch BME280 library for STM32 HAL. Contribute to eziya/STM32_HAL_BME280 development by creating an account on GitHub.

github.com

 

반응형
반응형

1. image convert
> lcd-image-converter 를 통한 Image convert

> 설정은 RGB565, 16bit로 100x100 pixel로 맞추어  변환.

 

 

변환하여 Image.h 에 추가

 

 

 

image.h
0.15MB

 

 

2. source code

 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "ST7735.h"
#include "GFX_FUNCTIONS.h"
#include "image.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */

  ST7735_Init(1);
  fillScreen(BLACK);
  //ST7735_WriteString(0, 0, "IP : 192.168.1.100", Font_7x10, RED,BLACK);
//  testAll();

  //Weather Logo
  ST7735_FillRectangle(10, 13, 100, 100, WHITE);
  ST7735_WriteString(22, 55, "WEATHER", Font_11x18, BLACK,WHITE);
  /*
  //SUNNY
  ST7735_DrawImage(10, 13, 100, 100, image_data_sun);
  ST7735_WriteString(40, 118, "SUNNY", Font_7x10, RED,BLACK);

  // RAINY
  ST7735_DrawImage(10, 13, 100, 100, image_data_Rain);
  ST7735_WriteString(40, 118, "RAINY", Font_7x10, RED,BLACK);
*/

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
/*
  ST7735_SetRotation(0);
  ST7735_WriteString(0, 0, "HELLO", Font_11x18, RED,BLACK);
  HAL_Delay(1000);
  fillScreen(BLACK);

  ST7735_SetRotation(1);
  ST7735_WriteString(0, 0, "WORLD", Font_11x18, GREEN,BLACK);
  HAL_Delay(1000);
  fillScreen(BLACK);

  ST7735_SetRotation(2);
  ST7735_WriteString(0, 0, "FROM", Font_11x18, BLUE,BLACK);
  HAL_Delay(1000);
  fillScreen(BLACK);

  ST7735_SetRotation(3);
  ST7735_WriteString(0, 0, "ControllersTech", Font_16x26, YELLOW,BLACK);
  HAL_Delay(1000);
  fillScreen(BLACK);*/
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 180;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Activate the Over-Drive mode
  */
  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief SPI1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA9 */
  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PB6 */
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

반응형

'Project > Nucleo-F446RE' 카테고리의 다른 글

Nucleo-F446RE I2C BME280 온습도 센서  (0) 2023.09.07
Nucleo-F446RE USART2 Printf  (0) 2023.07.14
Nucleo-F446RE 1.8 RGB_TFT LCD_spi(128x160)  (0) 2023.07.14
반응형

1. CubeMX

 1) Pin Config

 2) USART2 

2. main.c

 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi1;

UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
static void MX_USART2_UART_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//Use printf
int _write(int fd, char *ptr, int len)
{
HAL_UART_Transmit(&huart2, (unsigned char*)ptr, len, HAL_MAX_DELAY);
return len;
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("hello\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 180;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Activate the Over-Drive mode
  */
  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief SPI1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

/**
  * @brief USART2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */

  /* USER CODE END USART2_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA9 */
  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PB6 */
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

 

3. Result 

반응형
반응형

1. CubeMX 설정

1) spi 1 설정

 2) RCC 설정

 3) GPIO 설정

 4) Clock 설정

 

2. Pin 연결

 

 -> LCD의 Pin은 GND, VDD, SCL, SDA, RST, DC, CS, BLK으로 구성

- GND/ VDD는 3.3V로 연결

- SCL은 PA5의 SPI1_SCK

- SDA는 PA7의 SPI1_MOSI

- RST는 PA9

- DC는 PC7

- CS는 PB6

으로 연결하였다.

 

 

3. Source Code Lib 

> 해당 Lib를 Inc에 복사

GFX_FUNCTIONS.h
0.00MB
ST7735.h
0.00MB
fonts.h
0.00MB

> 해당 Lib src에 복사

GFX_FUNCTIONS.c
0.01MB
ST7735.c
0.01MB
fonts.c
0.04MB

 

> ST7735.h파일에서 해당 Port설정하여 Pin을 변경할 수 있다.


/****** PIN DEFINES ******/
#define CS_PORT GPIOB
#define CS_PIN  GPIO_PIN_6
#define DC_PORT GPIOA
#define DC_PIN  GPIO_PIN_9
#define RST_PORT GPIOC
#define RST_PIN  GPIO_PIN_7

 

 

4. Main.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "ST7735.h"
#include "GFX_FUNCTIONS.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */

  ST7735_Init(1);
  fillScreen(BLACK);
  ST7735_WriteString(0, 0, "Hello", Font_11x18, RED,BLACK);
//  testAll();


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
/*
  ST7735_SetRotation(0);
  ST7735_WriteString(0, 0, "HELLO", Font_11x18, RED,BLACK);
  HAL_Delay(1000);
  fillScreen(BLACK);

  ST7735_SetRotation(1);
  ST7735_WriteString(0, 0, "WORLD", Font_11x18, GREEN,BLACK);
  HAL_Delay(1000);
  fillScreen(BLACK);

  ST7735_SetRotation(2);
  ST7735_WriteString(0, 0, "FROM", Font_11x18, BLUE,BLACK);
  HAL_Delay(1000);
  fillScreen(BLACK);

  ST7735_SetRotation(3);
  ST7735_WriteString(0, 0, "ControllersTech", Font_16x26, YELLOW,BLACK);
  HAL_Delay(1000);
  fillScreen(BLACK);*/
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 180;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Activate the Over-Drive mode
  */
  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief SPI1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA9 */
  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PB6 */
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

 

5. 참고 Link

https://www.youtube.com/watch?v=93xUUvEUbQI&t=348s

반응형
반응형

1. RSS 기상청 정보 접근방법

  1) 기상청 홈페이지

 

 

2) 우측 하단의 RSS 진입 시 

 

  3) 원하는 지역 입력 후 RSS 버튼 클릭 시 접속 링크 확인

  4) 해당 link 접속 시 xml 데이터 확인

  5) postman을 이용한 데이터 호출 명령 확인

 

 -> GET link주소 입력 후 code snippet에 해당 요청 type을 변경 시 다음과 같이 호출 명령어 확인이 가능

 

GET /wid/queryDFSRSS.jsp?zone=4311370000 HTTP/1.1
Host: www.kma.go.kr

 

 

2. Wifi360 module AT command

 

AT

1. WiFi Station mode 설정

AT+CWMODE_CUR=1 //Station mode 로 설정한다. AT+CWMODE_DEF 의 경우 flash 에
저장된다.

 

==> OK

 

2. Single Connection mode 설정

AT+CIPMUX=0

 

==> OK

 

3. DHCP enable 설정

AT+CWDHCP_CUR=1,1 //Station mode 에서 DHCP enable

 

==> OK

 

4. 연결가능한 WiFi AP List 확인

AT+CWLAP

 

==> +CWLAP:(3,"ssid",-57,"mac address",1,1) //encryption method, ssid, rssi, mac address, channel, wps

 

5. WiFi AP 에 연결

AT+CWJAP_CUR="ssid","password"

 

==> WIFI CONNECTED
WIFI GOT IP
OK

 

6. WizFi360 device 의 IP address 확인

AT+CIPSTA_CUR?

 

==> +CIPSTA_CUR:ip:"192.168.10.13"
+CIPSTA_CUR:gateway:"192.168.10.1"
+CIPSTA_CUR:network:"255.255.255.0"
OK

 

7. WizFi360 이 연결되어 있는 AP 와 같은 AP 에 연결된 PC 에서 TCP Server Open.
- Ex) IP : 192.168.10.100 Port : 5000

 

8. WizFi360 connects to the TCP Server as a TCP Client

AT+CIPSTART="TCP","192.168.10.100",5000 //protocol, server IP, port

 

==> CONNECT
OK

 

9. WizFi360 sends data to the TCP Server

AT+CIPSEND=10 //data length(10 byte) 설정

 

==> OK
> //WizFi360 에서 serial data 의 수신을 시작하기위해 >를 return 한다.

 

1234567890 //data 를 입력한다.

 

==> Recv 10 bytes
SEND OK

 

10. When WizFi360 received data from TCP Server, it will prompt message below:

 

==> +IPD,10:1234567890

 

11. End the TCP Connection

AT+CIPCLOSE

 

==> CLOSED
OK

 

참고 Manual : Wizfi360 quick start guide v1.1.3

wizfi360qs_v113k.pdf
0.73MB

 

 

3. 기상청 RSS 요청

 

AT+CIPSTART="TCP","www.kma.go.kr",80<CR><LF>

 

AT+CIPSEND=94<CR><LF>

 

GET /wid/queryDFSRSS.jsp?zone=4311370000 HTTP/1.1<CR><LF>Host: www.kma.go.kr<CR><LF>Connection: close<CR><LF><CR><LF>

 

 

// 실제 동작
AT+CIPSTART="TCP","www.kma.go.kr",80
CONNECT

OK
AT+CIPSEND=93
AT+CIPSEND=93

OK
> GET /wid/queryDFSRSS.jsp?zone=4311370000 HTTP/1.1
Host: www.kma.go.kr
Connection: close


Recv 93 bytes

SEND OK

+IPD,275:HTTP/1.1 200 200
Date: Sun, 16 Apr 2023 13:35:05 GMT
Content-Type: text/xml;charset=UTF-8
Content-Length: 7588
Connection: close
Strict-Transport-Security: max-age=15724800; includeSubDomains
Set-Cookie: JSESSIONID=065C8D1970749F399C6393CB4A70BBD4; Path=/; HttpOnly


+IPD,1024:<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>湲곗긽泥??숇꽕?덈낫 ?뱀꽌鍮꾩뒪 - 異⑹껌遺곷룄 泥?<?쒗씎?뺢뎄 ?댁쿇.?좊큺???꾪몴?덈낫</title>
<link>http://www.kma.go.kr/weather/main.jsp</link>
<description>?숇꽕?덈낫 ?뱀꽌鍮꾩뒪</description>
<language>ko</language>
<generator>?숇꽕?덈낫</generator>
<pubDate>2023??04??16??(???붿씪 20:00</pubDate>
 <item>
<author>湲곗긽泥?/author>
<category>異⑹껌遺곷룄 泥?<?쒗씎?뺢뎄 ?댁쿇.?좊큺??/category>
<title>?숇꽕?덈낫(?꾪몴) : 異⑹껌遺곷룄 泥?<?쒗씎?뺢뎄 ?댁쿇.?좊큺??[X=69,Y=107]</title><link> http://www.kma.go.kr/weather/forecast/timeseries.jsp?searchType=INTEREST&amp;dongCode=4311370000 </link>
<guid> http://www.kma.go.kr/weather/forecast/timeseries.jsp?searchType=INTEREST&amp;dongCode=4311370000 </guid>
<description>
 <header>
  <tm>202304162000</tm>
  <ts>6</ts>
  <x>69</x>
  <y>107</y>
 </header>
 <body>
  <data seq="0">
   <hour>24</hour>
   <day>0</day>
   <temp>9.0</temp>
   <tmx>-999.0</t
+IPD,1024:mx>
   <tmn>-999.0</tmn>
   <sky>1</sky>
   <pty>0</pty>
   <wfKor>留묒쓬</wfKor>
   <wfEn>Clear</wfEn>
   <pop>0</pop>
   <r12>0.0</r12>
   <s12>0.0</s12>
   <ws>0.9</ws>
   <wd>6</wd>
   <wdKor>??/wdKor>
   <wdEn>W</wdEn>
   <reh>70</reh>
   <r06>0.0</r06>
   <s06>0.0</s06>
  </data>
  <data seq="1">
   <hour>3</hour>
   <day>1</day>
   <temp>7.0</temp>
   <tmx>21.0</tmx>
   <tmn>5.0</tmn>
   <sky>1</sky>
   <pty>0</pty>
   <wfKor>留묒쓬</wfKor>
   <wfEn>Clear</wfEn>
   <pop>0</pop>
   <r12>0.0</r12>
   <s12>0.0</s12>
   <ws>1.3</ws>
   <wd>7</wd>
   <wdKor>遺곸꽌</wdKor>
   <wdEn>NW</wdEn>
   <reh>75</reh>
   <r06>0.0</r06>
   <s06>0.0</s06>
  </data>
  <data seq="2">
   <hour>6</hour>
   <day>1</day>
   <temp>5.0</temp>
   <tmx>21.0</tmx>
   <tmn>5.0</tmn>
   <sky>1</sky>
   <pty>0</pty>
   <wfKor>留묒쓬</wfKor>
   <wfEn>Clear</wfEn>
   <pop>0</pop>
   <r12>0.0</r12>
   <s12>0.0</s12>
   <ws>0.8</ws>
   <wd>5</wd>
   <wdKor>?⑥꽌</wdKor>
   <wdEn>SW</wdEn>
   <reh>80</reh>
   <r06>0.0</r06>
   <s06>0.0
+IPD,1024:</s06>
  </data>
  <data seq="3">
   <hour>9</hour>
   <day>1</day>
   <temp>11.0</temp>
   <tmx>21.0</tmx>
   <tmn>5.0</tmn>
   <sky>1</sky>
   <pty>0</pty>
   <wfKor>留묒쓬</wfKor>
   <wfEn>Clear</wfEn>
   <pop>0</pop>
   <r12>0.0</r12>
   <s12>0.0</s12>
   <ws>1.8</ws>
   <wd>5</wd>
   <wdKor>?⑥꽌</wdKor>
   <wdEn>SW</wdEn>
   <reh>60</reh>
   <r06>0.0</r06>
   <s06>0.0</s06>
  </data>
  <data seq="4">
   <hour>12</hour>
   <day>1</day>
   <temp>17.0</temp>
   <tmx>21.0</tmx>
  r12>0.0</r12>
   <s12>0.0</s12>
   <ws>1.1</ws>
   <wd>5</wd>
   <wdKor>?⑥꽌</wdKor>
   <wdEn>SW</wdEn>
   <reh>80</reh>
   <r06>0.9</r06>
   <s06>0.0</s06>
  </data>
  <data seq="15">
   <hour>21</hour>
   <day>2</day>
   <temp>16.0</temp>
   <tmx>19.0</tmx>
   <tmn>11.0</tmn>
   <sky>4</sky>
   <pty>0</pty>
   <wfKor>?먮┝</wfKor>
   <wfEn>Cloudy</wfEn>
   <pop>30</pop>
   <r12>0.0</r12>
   <s12>0.0</s12>
   <ws>0.6000000000000001</ws>
   <wd>4</wd>
   <wdKor>??/wdKor>
   <wdEn>S</wdEn>
   <reh>80</reh>
   <r06>0.0</r06>
   <s06>0.0</s06>
  </data>
  <data seq="16">
   <
+IPD,420:hour>24</hour>
   <day>2</day>
   <temp>15.0</temp>
   <tmx>19.0</tmx>
   <tmn>11.0</tmn>
   <sky>4</sky>
   <pty>0</pty>
   <wfKor>?먮┝</wfKor>
   <wfEn>Cloudy</wfEn>
   <pop>30</pop>
   <r12>0.0</r12>
   <s12>0.0</s12>
   <ws>1.2000000000000002</ws>
   <wd>2</wd>
   <wdKor>??/wdKor>
   <wdEn>E</wdEn>
   <reh>85</reh>
   <r06>0.0</r06>
   <s06>0.0</s06>
  </data>
 </body>
</description>
</item>
</channel>
</rss>CLOSED

반응형
반응형

1. CUBE MX SET

USART2 == Nucleo to PC 통신 (COM5)

USART3 == USB to Serial 장치 (COM7)

 

2. Source Code

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;

/* USER CODE BEGIN PV */
//Use printf
int _write(int fd, char *ptr, int len)
{
HAL_UART_Transmit(&huart2, (unsigned char*)ptr, len, HAL_MAX_DELAY);
return len;
}

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_USART3_UART_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

//ringbuff init
uint8_t rx_buff[1024];
uint8_t rx_buff_temp=0;
uint8_t RX_BUFF_SIZE=0;

//uart3 Rx interrupt func
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if(huart->Instance == USART3)
  {
    rx_buff[RX_BUFF_SIZE++]=rx_buff_temp;
    if(RX_BUFF_SIZE >= 1024)
      {
RX_BUFF_SIZE=0;
printf("rx_buff over Flow\r\n");
      }
    HAL_UART_Receive_IT(&huart3, &rx_buff_temp, 1);
  }
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  /* USER CODE BEGIN 2 */

  printf("hello\r\n");

  //uart3 Rx intterupt enable
  HAL_UART_Receive_IT(&huart3, &rx_buff_temp, 1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      // if uart3 \r\n Receive, Uart2 transmit (debug)
      if(RX_BUFF_SIZE != 0)
{
  for(int i =0; i<RX_BUFF_SIZE; i++)
    {
      if(rx_buff[i-1] == '\r' && rx_buff[i]=='\n')
{
  HAL_UART_Transmit(&huart2, rx_buff, RX_BUFF_SIZE, 100);
         RX_BUFF_SIZE =0;
}
    }
}
      
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief USART2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */

  /* USER CODE END USART2_Init 2 */

}

/**
  * @brief USART3 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART3_UART_Init(void)
{

  /* USER CODE BEGIN USART3_Init 0 */

  /* USER CODE END USART3_Init 0 */

  /* USER CODE BEGIN USART3_Init 1 */

  /* USER CODE END USART3_Init 1 */
  huart3.Instance = USART3;
  huart3.Init.BaudRate = 115200;
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
  huart3.Init.StopBits = UART_STOPBITS_1;
  huart3.Init.Parity = UART_PARITY_NONE;
  huart3.Init.Mode = UART_MODE_TX_RX;
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART3_Init 2 */

  /* USER CODE END USART3_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

 

 

3.동작 결과

 

COM7 에서 UART3에 Transmit -> COM5 Uart2에 Receive

 

4. 참고 링크 : https://blog.naver.com/PostView.naver?blogId=ajoo92&logNo=221540143478&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

반응형

'Project > Nucleo-F103RB' 카테고리의 다른 글

Nucleo 103rb i2c Char LCD  (0) 2021.05.25
Nucleo-F103RB Serial 통신3  (0) 2019.05.27
Nucleo-F103RB Serial 통신2  (0) 2019.05.21
Nucleo-F103RB 시리얼통신 입력으로 제어  (0) 2019.05.21
Nucleo-F103RB Serial 통신1  (0) 2019.05.21

+ Recent posts