본문 바로가기

개발/embed

[CubeIDE] stm32 Uart 살리기 LoopBack, sample source

반응형

이전 

[CubeIDE] stm32 프로젝트 만들기  https://bahk33.tistory.com/45

 

[CubeIDE] stm32 프로젝트 만들기

1. 프로젝트 생성때 맨 처음 해야 할일 2가지 - SWD 설정 - 클럭 소스 및 동작 클럭을 설정 2. 프로젝트 만들기 - File => New => STM32 Project - Target Selection 에서 MCU/MPU Selector 탭에서 Part Number 에 CubeIDE 를

bahk33.tistory.com

에 이어 Uart 살리고, LoopBack 을 한다.

 

1. PinOut View 에서

  - PA9 : USART1_TX,   PA10: USART1_RX,  PA2:Usart2_Tx, PA3:Usart2_Rx  로 설정 하고,

2 Categories - Connectivity - USART1/ USART2  둘다 같이 설정 한

 - Mode : Asynchronous

 - Configuration - GPIO Settings - Parameter Settings - Baud Rate : 9600 Bits/s

 - Configuration - GPIO Settings - NVIC Interrupt Table - USART1 global interrupt 를 체크 한다

 

 

3. 다 했으면, 왼쪽 프로젝트명( 여기서는 AAClock_stm ) 에서 마우스 오른쪽 버튼 눌러 Buil Project 한다.

4. main.c

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

 

이 있는 부분 위에 내가 만들 함수 정의 한다.

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

TIM_HandleTypeDef htim1;

UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;

void Serial_Init(void);   // serial port 초기화
void Serial_get1(void); // serial port1 에서 읽기
void Serial_get2(void); // serial port2 에서 읽기

unsigned char rBuf[100];  // 읽는 거 저장 할 곳

 

4. main.c  에 초기화 할것 , 부를 함수 정의

void MyTaskInit(){
    Serial_Init();
}

void MyTask(){
  Serial_get1();  // 처리 함수
  Serial_get2();
}

 

5. main.c  의 main() 에 할일 정의

int main(void)
{
  HAL_Init();
  SystemClock_Config();

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

  /* Infinite loop */
  while (1)
  {
  MyTask();
  }
}

 

5. main.c 그외 함수들 검토 ( 첨부 참조)

- SystemClock_Config(void),

- MX_USART1_UART_Init(void)     // Uart1 초기화 함수

- MX_USART2_UART_Init(void)

 

6. MySerial.c 만들기

- Project 에서 마우스 오른쪽 버튼 눌러

- New -Source File - 하여 ~Core/Src Folder 에 MySerial.c - [Finish]

 - 아래 내용 입력

/*
 * MySerial.c
 *
 *  Created on: 2023. 7. 13.
 *      Author: b
 */

#include "main.h"

#define RXBUFSIZE   1024

typedef struct {
  uint32_t head, tail;
  volatile uint32_t nBytes; // 이것은 int 안에서 , 밖에서 다 바뀌므로 , volatile 로 해 줘야..  그런데... 안해도 되는거 같은..
  uint8_t buf[RXBUFSIZE], d;
} QUart, *pQUart;

QUart q1uart;
QUart q2uart;

extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;

// printf 문을 쓰기 위해 설정 : __weak 로 설정된  __io_putchar 함수 재 정의
int __io_putchar(int ch)
{
  if(HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 10) != HAL_OK) return -1;
  return ch;
}

void InitUartQueue(pQUart pQueue) {    // 큐 초기화
  pQueue->nBytes = pQueue->head = pQueue->tail = 0;
}

void Serial_Init(void) {
  InitUartQueue(&q1uart);   // 큐 초기화
  InitUartQueue(&q2uart);
  HAL_UART_Receive_IT(&huart1, &q1uart.d, 1); // 이거 한번 먼저 해줘야    , 1개 들어오면 인터럽트 발생 시켜라
  HAL_UART_Receive_IT(&huart2, &q2uart.d, 1);
}

static void MinusByte1(pQUart pQueue) {   // 큐에서 1바이트 뺐다고 기록
  pQueue->tail = (pQueue->tail == (RXBUFSIZE - 1)) ? 0 : (pQueue->tail + 1);
  pQueue->nBytes--;
}

uint8_t toUpper(uint8_t d){  if (d>0x60 || d<0x7B) d &= ~0x20; return d;}   // 대문자로 바꾸기    0x77 -> 0x57

void Serial_get2() {   // parsing packet
  uint8_t d;

  while (q2uart.nBytes) {  // 계속 빼줌
    d = q2uart.buf[q2uart.tail];
    HAL_UART_Transmit(&huart2, &d, 1, 10);  //    printf("-%c", d);
    MinusByte1(&q2uart);

//  여기서 받은 스트링 처리 하면 된다.
  }
}


void Serial_get1() {   // parsing packet
  uint8_t d;

  while (q1uart.nBytes) {  // 계속 빼줌
    d = q1uart.buf[q1uart.tail];
    d = toUpper(d);
    HAL_UART_Transmit(&huart1, &d, 1, 10);   //    printf("-%c", d);
    MinusByte1(&q1uart);
//  여기서 받은 스트링 처리 하면 된다.
  }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {  // 이거  안네 print 문 넣지 말것.. 동작 잘 안됨.
  pQUart pQ;

  if (huart->Instance == USART1) {
    pQ = &q1uart;

    if (pQ->nBytes < RXBUFSIZE)   // 넘으면 버림.  빨리 0빼줘야 함.
    {
      pQ->buf[pQ->head] = pQ->d;  // 1 byte 넣기..
      pQ->head = (pQ->head == (RXBUFSIZE - 1)) ? 0 : (pQ->head + 1);
      pQ->nBytes++;
    }
    HAL_UART_Receive_IT(huart, &(pQ->d), 1);   // 1 byte receive
    }
    else if (huart->Instance == USART2) {
      pQ = &q2uart;

      if (pQ->nBytes < RXBUFSIZE)   // 넘으면 버림.  빨리 빼줘야 함.
      {
        pQ->buf[pQ->head] = pQ->d;  // 1 byte 넣기..
        pQ->head = (pQ->head == (RXBUFSIZE - 1)) ? 0 : (pQ->head + 1);
        pQ->nBytes++;
      }
      HAL_UART_Receive_IT(huart, &(pQ->d), 1);   // 1 byte receive
    }
}



 

7. Project - Build Project 하면 된다.

8. Down Load 하여 Uart 1 이 loopBack ( 받은거 되돌려 주기 , 소문자는 대문자로 바꿔서 ) 이 된다.

9. 설명이 좀 모자라지만, 첨부 소스 보시고 해보셔요.

stm32_uart.zip
0.67MB

 

반응형