【问题标题】:Nucleo STM32f103RB/F4 DiscoveryNucleo STM32f103RB/F4 发现
【发布时间】:2017-09-01 23:21:30
【问题描述】:

有没有人在 Nucleo 上通过 VCP 使用双工通信/或发现带有 RX TX 中断的单 USART。

希望有示例代码回显(发送)收到的内容。

【问题讨论】:

    标签: c stm32 microcontroller stm32f4discovery nucleo


    【解决方案1】:

    STM32CubeF4STM32CubeF1 包中肯定有一些例子。

    另请参阅此示例,其中微控制器使用 UART RX 中断将接收到的字节回显给发送者:

    #include "stm32f4xx.h"
    
    UART_HandleTypeDef huart2;
    
    /* Single byte to store input */
    uint8_t byte;
    
    void SystemClock_Config(void);
    
    /* UART2 Interrupt Service Routine */
    void USART2_IRQHandler(void)
    {
      HAL_UART_IRQHandler(&huart2);
    }
    
    /* This callback is called by the HAL_UART_IRQHandler when the given number of bytes are received */
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
      if (huart->Instance == USART2)
      {
        /* Transmit one byte with 100 ms timeout */
        HAL_UART_Transmit(&huart2, &byte, 1, 100);
    
        /* Receive one byte in interrupt mode */ 
        HAL_UART_Receive_IT(&huart2, &byte, 1);
      }
    }
    
    void uart_gpio_init()
    {
      GPIO_InitTypeDef GPIO_InitStruct;
    
      __GPIOA_CLK_ENABLE();
    
      /**USART2 GPIO Configuration
      PA2     ------> USART2_TX
      PA3     ------> USART2_RX
      */
      GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
      GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }
    
    void uart_init()
    {
      __USART2_CLK_ENABLE();
    
      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;
      HAL_UART_Init(&huart2);
    
      /* Peripheral interrupt init*/
      HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(USART2_IRQn);
    }
    
    int main(void)
    {
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      uart_gpio_init();
      uart_init();
    
      HAL_UART_Receive_IT(&huart2, &byte, 1);
    
      while(1)
      {
    
      }
    }
    
    1. 初始化 UART 的 GPIO 引脚。

      一个。启用相应 GPIO 端口的时钟。

      b.将 UART 引脚配置为备用功能模式。

    2. 初始化 UART 外设。

      一个。启用相应 UART 外设的时钟。

      b.配置波特率、字长、停止位和奇偶校验位、流量控制等。

      c。在 NVIC 中启用 UART IRQ 并设置优先级。

    3. 在 UART ISR (USART2_IRQHandler) 中调用 HAL_UART_IRQHandler(UART_HandleTypeDef* huart);

    4. 当接收过程完成时,HAL_UART_IRQHandler 将调用HAL_UART_RxCpltCallback。在此回调中,您可以传输接收到的字节。

    5. 使用单个 HAL_UART_Receive_IT(&huart2, &byte, 1); 调用启动回显循环。

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 2021-05-21
      • 1970-01-01
      • 2021-03-11
      • 2019-01-20
      • 2021-02-22
      • 2021-09-24
      • 2021-06-21
      • 2022-12-18
      相关资源
      最近更新 更多