STM32 및 BleuiO를 사용하여 BLE 프로젝트 만들기

1. 머리말


STM32Cube 프로젝트를 BleuiO 암호화 개와 통신할 수 있는 USB CDC 호스트로 설정하는 빠른 방법을 보여주는 간단한 예다.
BleuiO 암호화 개가 핵인판 USB 포트에 연결되면 STM32가 이를 인식합니다.그리고 UART에서 3개의 다른 입력을 받고 입력에 따라 BleuiO 암호화 개에게 3개의 사전 프로그래밍 명령 중 하나를 보냅니다.
이 예에서 사용되는 명령은 다음과 같습니다.

  • ATI(개 정보 암호화)

  • AT+ADVSTART(광고 시작)

  • AT+ADVSTOP(광고 중지)
  • 이 예에서는 STM32H743ZI MCU의 STM32 코어 144 개발판(STM32H743ZI 마이크로-mbed 코어 144 시리즈 ARM® Cortex® - M7 MCU 32비트 내장형 평가판 지원)을 사용했습니다.
    다른 설정을 사용하려면 USB 호스트를 지원하는지 확인하고 GPIO 설정이 다를 수 있으니 다시 설정해야 할 수도 있습니다.국제올림픽위원회 문건.

    2. 코드 정보


    당신은 아이템을 얻을 수 있습니다HERE
    새 STM32 프로젝트를 기반으로 합니다.IOC 문서:
    연결에서 USB OTG FS 모드가 호스트 전용 모드로 변경되고 NVIC 설정에서 모든 글로벌 중단이 활성화됩니다.

    중간부품 아래에서 USB 호스트 - FS IP 클래스가 통신 호스트 클래스(가상 포트 Com)로 설정됩니다.

    이 기능은 호스트에서 로더가 언제 완료되고 BleuiO 펌웨어가 언제 실행되는지 식별할 수 있도록 usb 호스트의 USBH 사용자 프로세스 기능에 추가되었습니다.c'(USB 호스트 -> 적용 폴더 아래에 있음):
    static void USBH_UserProcess  (USBH_HandleTypeDef *phost, uint8_t id)
    {
      /* USER CODE BEGIN CALL_BACK_1 */
      switch(id)
      {
      case HOST_USER_SELECT_CONFIGURATION:
      break;
    
      case HOST_USER_DISCONNECTION:
      Appli_state = APPLICATION_DISCONNECT;
      isBleuIOReady = false;
    
      // Turn on Red LED, turn off Green and Yellow LED
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
      break;
    
      case HOST_USER_CLASS_ACTIVE:
      Appli_state = APPLICATION_READY;
      // Check if BleuIO firmware is running
      // (idProduct:0x6001 = bootloader, idProduct:0x6002 = bleuio fw)
      if(phost->device.DevDesc.idProduct == 0x6002)
      {
          isBleuIOReady = true;
          // Sends message to uart that BleuIO is connected and ready
          HAL_UART_Transmit(&huart3, (uint8_t*)BLEUIO_READY, strlen(BLEUIO_READY), HAL_MAX_DELAY);
    
          // Turn on Green LED, turn off Yellow and Red LED
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
          HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET);
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
    
          // Start receiving from usb
          USBH_CDC_Receive(&hUsbHostFS, CDC_RX_Buffer, RX_BUFF_SIZE);
      }
      break;
    
      case HOST_USER_CONNECTION:
      Appli_state = APPLICATION_START;
      isBleuIOReady = false;
      // Turn on Yellow LED, turn off Green and Red LED
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
      break;
    
      default:
      break;
      }
      /* USER CODE END CALL_BACK_1 */
    }
    
    Nucleo 보드의 녹색, 빨간색, 노란색 LED도 연결 상태에 따라 설정됩니다.

    Red = Disconnnected.

    Yellow = Connecting.

    Green = Connected.


    이메일에서 암호화된 개의 상태에 액세스할 수 있도록 외부 변수 bool ISBLEUOREADY를 설정합니다.c.
    BleuiO 암호화 개의 연결이 확인되면 USBH CDC 수신 기능이 실행되어 USB CDC로부터 데이터를 받습니다.
    USBH CDC ReceiveCallback을 구현해야 합니다.
    void USBH_CDC_ReceiveCallback(USBH_HandleTypeDef *phost)
    {
        if(phost == &hUsbHostFS)
        {
            // Handles the data recived from the USB CDC host, here just printing it out to UART
            rx_size = USBH_CDC_GetLastReceivedDataSize(phost);
            HAL_UART_Transmit(&huart3, CDC_RX_Buffer, rx_size, HAL_MAX_DELAY);
    
            // Reset buffer and restart the callback function to receive more data
            memset(CDC_RX_Buffer,0,RX_BUFF_SIZE);
            USBH_CDC_Receive(phost, CDC_RX_Buffer, RX_BUFF_SIZE);
        }
    
        return;
    }
    
    이 예에서는 수신된 데이터가 UART에 다시 표시되기만 합니다.
    USBH CDC 전송 기능을 사용하여 암호화된 개에게 데이터를 전송합니다.
    이 예에서 UART는 다른 명령을 보내는 데 사용할 명령을 입력합니다.
    이를 위해, 우리는main에서 접근할 수 있는 포장 함수를 만들었습니다.c:
    /**
      * @brief Simple function that takes a string and transmit it to the dongle
      * @retval None
      */
    void writeToDongle(uint8_t * cmd)
    {
        USBH_CDC_Transmit(&hUsbHostFS, cmd, strlen((char *)cmd));
    }
    
    전반적으로 말하면.c HAL UART RxCpltCallback은 UART에서 입력한 내용과 간단한 UART 입력 프로세서를 수신하는 데 사용됩니다.
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
    {
        if(UartHandle == &huart3)
        {
            RX_value = (int)aRxBuffer[0];
            uartStatus = UART_RX_NONE;
    
            switch(RX_value)
            {
                case UART_RX_0:
                {
                    uartStatus = UART_RX_0;
                    break;
                }
                case UART_RX_1:
                {
                    uartStatus = UART_RX_1;
                    break;
                }
                case UART_RX_2:
                {
                    uartStatus = UART_RX_2;
                    break;
                }
                default:
                {
                    uartStatus = UART_RX_NONE;
                    break;
                }
            }
            // Resets uart recieve interrupt mode
            HAL_UART_Receive_IT(&huart3, (uint8_t *)aRxBuffer, RXBUFFERSIZE);
        }
    }
    
    
    /**
      * @brief Simple uart input handler
      * @retval None
      */
    void handleUartInput(UARTCommandTypeDef cmd)
    {
        switch(cmd)
        {
            case UART_RX_0:
            {
                // 0
                uart_buf_len = sprintf(uart_tx_buf, "\r\n(0 pressed)\r\n");
                HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
                if(isBleuIOReady)
                {
                    writeToDongle((uint8_t*)DONGLE_CMD_ATI);
                } else
                {
                    uart_buf_len = sprintf(uart_tx_buf, BLEUIO_NOT_READY_MSG);
                    HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
                }
                uartStatus = UART_RX_NONE;
                break;
            }
            case UART_RX_1:
            {
                // 1
                uart_buf_len = sprintf(uart_tx_buf, "\r\n(1 pressed)\r\n");
                HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
                if(isBleuIOReady)
                {
                    writeToDongle((uint8_t*)DONGLE_CMD_AT_ADVSTART);
                } else
                {
                    uart_buf_len = sprintf(uart_tx_buf, BLEUIO_NOT_READY_MSG);
                    HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
                }
                uartStatus = UART_RX_NONE;
                break;
            }
            case UART_RX_2:
            {
                // 2
                uart_buf_len = sprintf(uart_tx_buf, "\r\n(2 pressed)\r\n");
                HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
                if(isBleuIOReady)
                {
                    writeToDongle((uint8_t*)DONGLE_CMD_AT_ADVSTOP);
                } else
                {
                    uart_buf_len = sprintf(uart_tx_buf, BLEUIO_NOT_READY_MSG);
                    HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
                }
                uartStatus = UART_RX_NONE;
                break;
            }
            case UART_RX_NONE:
            {
                break;
            }
            default:
            {
                uartStatus = UART_RX_NONE;
                break;
            }
        }
    }
    
    handleUartInput () 는 입력 0, 1, 2를 처리하고 입력마다 특정한 암호화 개 명령에 비추습니다.그리고 처리 프로그램은 주 순환에 넣습니다.
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
        MX_USB_HOST_Process();
        /* USER CODE BEGIN 3 */
        // Simple handler for uart input
        handleUartInput(uartStatus);
      }
      /* USER CODE END 3 */
    

    3. 예제 항목 사용


    3.1 필요한 것

  • BleuIO donglehttps://www.bleuio.com/)
  • STM32 마이크로컨트롤러와 USB 포트가 있는 회로 기판(핵자-144 개발판: 핵자-H743ZI2, 개발 본례에 사용.https://www.st.com/en/evaluation-tools/nucleo-h743zi.html
    암호화 개를 핵인판에 연결하려면 USB a - Micro USB B 케이블과 USB a 어댑터를 사용할 수 있습니다.
  • STM32CubeIDE(https://www.st.com/en/development-tools/stm32cubeide.html)
  • 4. 프로젝트 설정 방법


    4.1 GitHub에서 프로젝트 다운로드


    항목 가져오기HERE
    프로젝트를 복제하거나 zip 파일로 다운로드하여 STM32CubeIDE 작업공간으로 압축을 풉니다.

    4.2 기존 프로젝트로 가져오기

  • STM32CubeIDE에서 파일 > 가져오기를 선택합니다.
  • 그런 다음 일반 > 기존 항목을 선택하여 작업공간으로 이동한 다음 다음을 클릭합니다.
  • 루트 선택:에서 작업공간이 선택되었는지 확인
  • 항목'stm32 bleuio 예시'를 보고 선택하고'완성'을 눌러야 합니다.

  • 5. 샘플 실행

  • STMCubeIDE에서 망치 아이콘을 클릭하여 프로젝트를 구성합니다.
  • TeraTerm, Putty 또는 CoolTerm 등 직렬 터미널 에뮬레이터를 사용하여 "STMicroelectronics STLink 가상 COM 포트"를 엽니다.
  • Serial port Setup:

    Baudrate: 115200

    Data Bits: 8

    Parity: None

    Stop Bits: 1

    Flow Control: None

  • STMCubeIDE에서 녹색 재생 단추를 누르면 깜박이고 보드에서 실행됩니다.처음 클릭하면 구성 실행 창이 나타납니다.너는 원형을 유지하고 런을 눌러도 된다.
  • BleuiO 암호화 개를 연결합니다.
  • 메시지가 [BleuiO Dongle Ready]로 표시될 때까지 기다립니다.

  • 0 장치 정보 획득:
  • 1 광고 시작:
    2. 광고 중지:
    암호화 개 응답은 UART에 인쇄됩니다.

    6. 링크

  • Go to BleuIO Manual
  • Go to BleuIO Blog
  • 좋은 웹페이지 즐겨찾기