[STM32F4] 【STM32F469I试用】入门(四):串口使用

[复制链接]
3068|2
 楼主| jinyi7016 发表于 2015-12-30 23:13 | 显示全部楼层 |阅读模式
本帖最后由 jinyi7016 于 2015-12-30 23:22 编辑

HAL库,感觉比之前的库复杂好多啊。
本来几句就能实现的,要有好我嵌套。
可能是为了系统的稳定与通用性吧。
还有好多的校验,感觉要用keil优化掉的。
好了,开始用串口了。这是开发中常常用到的一个基础的外设。
相比于STM32F103来说,串口的设置也是差不多的。
main函数开始 ,初始化 HAL,时钟后,就主要是对串口的配置了。
捕获.PNG

这里的串口使用的是 串口6
  1. #define USARTx                           USART6
它复用的IO口是:PC6与PC7。
这可以在main.h中找到定义。
捕获.PNG

之后是对UartHandle结构进行赋值。

捕获.PNG

而对于  HAL_UART_DeInit 与 HAL_UART_Init 函数的参数都是UartHandle类型的指针。
所以这两个函数中用到的与串口有关的参数都是UartHandle结构体进行传递的。
而主要的配置函数是 HAL_UART_Init函数。
它对串口的GPIO、时钟进行配置。

还有一点是,HAL库的中断函数也复杂了很多。
初看stm32f4xx_it.c函数中:
  1. void USARTx_IRQHandler(void)
  2. {
  3.   HAL_UART_IRQHandler(&UartHandle);
  4. }

以为很简单,但看了这个函数的内容,又很复杂,对比于3.5版本的STM32F103的库,感觉还是103的库要好,也可能 是那个库用习惯了。

  1. void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
  2. {
  3.   uint32_t tmp1 = 0, tmp2 = 0;

  4.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_PE);
  5.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE);  
  6.   /* UART parity error interrupt occurred ------------------------------------*/
  7.   if((tmp1 != RESET) && (tmp2 != RESET))
  8.   {
  9.     __HAL_UART_CLEAR_PEFLAG(huart);
  10.    
  11.     huart->ErrorCode |= HAL_UART_ERROR_PE;
  12.   }
  13.   
  14.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_FE);
  15.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
  16.   /* UART frame error interrupt occurred -------------------------------------*/
  17.   if((tmp1 != RESET) && (tmp2 != RESET))
  18.   {
  19.     __HAL_UART_CLEAR_FEFLAG(huart);
  20.    
  21.     huart->ErrorCode |= HAL_UART_ERROR_FE;
  22.   }
  23.   
  24.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_NE);
  25.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
  26.   /* UART noise error interrupt occurred -------------------------------------*/
  27.   if((tmp1 != RESET) && (tmp2 != RESET))
  28.   {
  29.     __HAL_UART_CLEAR_NEFLAG(huart);
  30.    
  31.     huart->ErrorCode |= HAL_UART_ERROR_NE;
  32.   }
  33.   
  34.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE);
  35.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
  36.   /* UART Over-Run interrupt occurred ----------------------------------------*/
  37.   if((tmp1 != RESET) && (tmp2 != RESET))
  38.   {
  39.     __HAL_UART_CLEAR_OREFLAG(huart);
  40.    
  41.     huart->ErrorCode |= HAL_UART_ERROR_ORE;
  42.   }
  43.   
  44.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);
  45.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);
  46.   /* UART in mode Receiver ---------------------------------------------------*/
  47.   if((tmp1 != RESET) && (tmp2 != RESET))
  48.   {
  49.     UART_Receive_IT(huart);
  50.   }
  51.   
  52.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TXE);
  53.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE);
  54.   /* UART in mode Transmitter ------------------------------------------------*/
  55.   if((tmp1 != RESET) && (tmp2 != RESET))
  56.   {
  57.     UART_Transmit_IT(huart);
  58.   }
  59.   
  60.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TC);
  61.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC);
  62.   /* UART in mode Transmitter end --------------------------------------------*/
  63.   if((tmp1 != RESET) && (tmp2 != RESET))
  64.   {
  65.     UART_EndTransmit_IT(huart);
  66.   }

  67.   if(huart->ErrorCode != HAL_UART_ERROR_NONE)
  68.   {
  69.     /* Set the UART state ready to be able to start again the process */
  70.     huart->State = HAL_UART_STATE_READY;
  71.    
  72.     HAL_UART_ErrorCallback(huart);
  73.   }  
  74. }



gejigeji521 发表于 2015-12-30 23:22 | 显示全部楼层
HAL库函数就是缺教程而已,其他什么都好。
wahahaheihei 发表于 2015-12-30 23:34 | 显示全部楼层
对于  HAL_UART_DeInit 与 HAL_UART_Init 函数的参数都是UartHandle类型的指针。
所以这两个函数中用到的与串口有关的参数都是UartHandle结构体进行传递的。
而主要的配置函数是 HAL_UART_Init函数。
它对串口的GPIO、时钟进行配置。
原来这样,之前不懂这个什么意思。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

1414

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部