STM32_HAL库学习(1)

1、如何在使用STM32CubeMX修改配置时不修改自己的文件?

首先使用keil或其他编辑工具打开工程,在使用CubeMX修改配置以后,生成Code时不要再打开工程,在刚开始打开的那个工程中会选择是否导入修改后的文件,对源文件和头文件都选择是,但工程文件选择否。OK

2、使用JLink或STLink下载的配置可能问题?

CubeMX默认配置过工程文件中有关下载的参数,在下载不成功时,要考虑是否是Debug内参数设置不对应,或者是CubeMX默认设置了下载接口软件配置。比如说,在使用CubeMX修改工程时,每次修改工程文件都会还原成默认下载工具,需要重复修改,因此不修改工程文件则不会出现这个现象。默认有时JLink使用5线制SW,就需要在CubeMX中修改为需要的接口类型。OK

3、延时函数?

想要使用systick做延时,在HAL库中可以直接调用__weak void HAL_Delay(__IO uint32_t Delay)。该函数基准为1ms,为弱函数,也可以用户重新编写。但满足基本需要。OK

4、使用DMA发送串口数据,如何判断数据是否发送完成?

快速发送数据时,前一串数据太长,还未发送完成,又将数据放到发送缓冲区,会导致数据过快覆盖。使用判忙,则可以判断是否发送完成。在字符串方式时,使用string.h库文件,字符串最后使用\0结尾是个不错的尝试。但使用memcpy更利于HEX处理。OK

 while(HAL_UART_STATE_BUSY_TX == (HAL_UART_GetState(&huart1) & HAL_UART_STATE_BUSY_TX));//发送前判忙
 memcpy(UART1_Txbuff, "12345\r\n", 7);
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)UART1_Txbuff, 7);

5、DMA接收数据,IDLE和DMA需要自己在配置?

在CubeMX中似乎没有找到如何直接配置这两个选项。在程序中要在自定义代码范围内写以下语句:

    __HAL_UART_CLEAR_IDLEFLAG(&huart1);                             //清除中断标志
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);          //使能IDLE中断
    HAL_UART_Receive_DMA(&huart1, UART1_Rxbuff, UART1_RX_MAX);

在串口初始化时添加,如果没有第一句,启动接收DMA后会接入一次中断。在接收中断中回调以下函数。

void UART_IDLE_Callback(UART_HandleTypeDef *huart)
{
  uint16_t tmp1;

    if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)
  {
        __HAL_UART_CLEAR_IDLEFLAG(huart);//清除标志位
        HAL_UART_DMAStop(huart); //

        if(huart->Instance == USART1)
    {
      /* get rx data len */
            tmp1 = UART1_RX_MAX - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中传输的数据个数
            
            if(tmp1 != 0)
            {
                while(HAL_UART_STATE_BUSY_TX == (HAL_UART_GetState(&huart1) & HAL_UART_STATE_BUSY_TX));
                memcpy(UART1_Txbuff, UART1_Rxbuff, tmp1);
                HAL_UART_Transmit_DMA(&huart1, (uint8_t *)UART1_Txbuff, tmp1);
            }
            HAL_UART_Receive_DMA(&huart1, UART1_Rxbuff, UART1_RX_MAX);//打开DMA接收,数据存入rx_buffer数组中。    
    }
  }
}

OK

 

你可能感兴趣的:(stm32学习,判断DMA串口发送结束,HAL库使用)