首页 资讯 应用技术 高压 设计 行业 低压电器 电路图 关于

单片机与DSP

旗下栏目: 可编程逻辑 嵌入式技术 单片机与DSP 光电技术

stm32cubemx开发四:串口标准化输出

单片机与DSP | 发布时间:2017-07-28 | 人气: | #评论# |本文关键字:STM32,串口
摘要:硬件平台:stm32F407Zet6 软件平台:stm32cubeMX 4.7+MDK5.14 电路连接:PA9,PA10 第一步、通过Stm32CubeMX图形界面创建Keil工程 需要配置的地方是 在这里可以修改串口工作的一下参数,软件就可以生

硬件平台:stm32F407Zet6

软件平台:stm32cubeMX 4.7+MDK5.14

电路连接:PA9,PA10

第一步、通过Stm32CubeMX图形界面创建Keil工程

需要配置的地方是



在这里可以修改串口工作的一下参数,软件就可以生成配置好的工程,不需要亲自去配置这些了。

第二步。打开工程,编写代码,验证


[cpp] view plain copy

  1. /* USER CODE BEGIN PV */  

  2. #include "stdio.h"  

  3. #ifdef __GNUC__  

  4. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  

  5. #else  

  6. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  

  7. #endif /* __GNUC__ */  

  8. PUTCHAR_PROTOTYPE  

  9. {  

  10.     HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);  

  11.     return ch;  

  12. }  

  13. /* USER CODE END PV */  

这段程序为了可以使用printf()函数,对字符输出函数进行了重定向,这样我们就可以在程序中使用printf函数进行输出了,这里使用的是查询发送方式,有超时控制的。接下来来看中断方式的。



[cpp] view plain copy

  1. /** 

  2.   * @brief  This function handles UART interrupt request. 

  3.   * @param  huart: pointer to a UART_HandleTypeDef structure that contains 

  4.   *                the configuration information for the specified UART module. 

  5.   * @retval None 

  6.   */  

  7. void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)  

  8. {  

  9.   uint32_t tmp1 = 0, tmp2 = 0;  

  10.   

  11.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_PE);  

  12.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE);    

  13.   /* UART parity error interrupt occurred ------------------------------------*/  

  14.   if((tmp1 != RESET) && (tmp2 != RESET))  

  15.   {   

  16.     __HAL_UART_CLEAR_PEFLAG(huart);  

  17.       

  18.     huart->ErrorCode |= HAL_UART_ERROR_PE;  

  19.   }  

  20.     

  21.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_FE);  

  22.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);  

  23.   /* UART frame error interrupt occurred -------------------------------------*/  

  24.   if((tmp1 != RESET) && (tmp2 != RESET))  

  25.   {   

  26.     __HAL_UART_CLEAR_FEFLAG(huart);  

  27.       

  28.     huart->ErrorCode |= HAL_UART_ERROR_FE;  

  29.   }  

  30.     

  31.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_NE);  

  32.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);  

  33.   /* UART noise error interrupt occurred -------------------------------------*/  

  34.   if((tmp1 != RESET) && (tmp2 != RESET))  

  35.   {   

  36.     __HAL_UART_CLEAR_NEFLAG(huart);  

  37.       

  38.     huart->ErrorCode |= HAL_UART_ERROR_NE;  

  39.   }  

  40.     

  41.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE);  

  42.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);  

  43.   /* UART Over-Run interrupt occurred ----------------------------------------*/  

  44.   if((tmp1 != RESET) && (tmp2 != RESET))  

  45.   {   

  46.     __HAL_UART_CLEAR_OREFLAG(huart);  

  47.       

  48.     huart->ErrorCode |= HAL_UART_ERROR_ORE;  

  49.   }  

  50.     

  51.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);  

  52.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);  

  53.   /* UART in mode Receiver ---------------------------------------------------*/  

  54.   if((tmp1 != RESET) && (tmp2 != RESET))  

  55.   {   

  56.     UART_Receive_IT(huart);  

  57.   }  

  58.     

  59.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TXE);  

  60.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE);  

  61.   /* UART in mode Transmitter ------------------------------------------------*/  

  62.   if((tmp1 != RESET) && (tmp2 != RESET))  

  63.   {  

  64.     UART_Transmit_IT(huart);  

  65.   }  

  66.     

  67.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TC);  

  68.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC);  

  69.   /* UART in mode Transmitter end --------------------------------------------*/  

  70.   if((tmp1 != RESET) && (tmp2 != RESET))  

  71.   {  

  72.     UART_EndTransmit_IT(huart);  

  73.   }  

  74.   

  75.   if(huart->ErrorCode != HAL_UART_ERROR_NONE)  

  76.   {  

  77.     /* Set the UART state ready to be able to start again the process */  

  78.     huart->State = HAL_UART_STATE_READY;  

  79.       

  80.     HAL_UART_ErrorCallback(huart);  

  81.   }    

  82. }  

这个函数中查询了所有可能发生的中断。用到的中断是发送完成中断,就找到了UART_EndTransmit_IT(huart);再跳进去看看,



[cpp] view plain copy

  1. /** 

  2.   * @brief  Wraps up transmission in non blocking mode. 

  3.   * @param  huart: pointer to a UART_HandleTypeDef structure that contains 

  4.   *                the configuration information for the specified UART module. 

  5.   * @retval HAL status 

  6.   */  

  7. static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart)  

  8. {  

  9.   /* Disable the UART Transmit Complete Interrupt */      

  10.   __HAL_UART_DISABLE_IT(huart, UART_IT_TC);  

  11.     

  12.   /* Check if a receive process is ongoing or not */  

  13.   if(huart->State == HAL_UART_STATE_BUSY_TX_RX)   

  14.   {  

  15.     huart->State = HAL_UART_STATE_BUSY_RX;  

  16.   }  

  17.   else  

  18.   {  

  19.     /* Disable the UART Parity Error Interrupt */  

  20.     __HAL_UART_DISABLE_IT(huart, UART_IT_PE);  

  21.   

  22.     /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */  

  23.     __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);  

  24.   

  25.     huart->State = HAL_UART_STATE_READY;  

  26.   }  

  27.     

  28.   HAL_UART_TxCpltCallback(huart);  

  29.     

  30.   return HAL_OK;  

  31. }  

这个函数在确定中断发生了之后调用了,HAL_UART_TxCpltCallback(huart);从函数名上可以看出,这是个回调函数,就是留给上层来实现的函数,由这个函数的实现不同,来实现不同的功能。这里来实现这个函数,让它在中断发生的时候吧USART1Ready置为SET;代码修改如下



[cpp] view plain copy

  1. /* USER CODE BEGIN PV */  

  2. #include "stdio.h"  

  3. #ifdef __GNUC__  

  4. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  

  5. #else  

  6. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  

  7. #endif /* __GNUC__ */  

  8. __IO ITStatus USART1Ready = RESET;  

  9.   

  10. PUTCHAR_PROTOTYPE  

  11. {  

  12.     HAL_UART_Transmit_IT(&huart1 , (uint8_t *)&ch, 1);  

  13.     while (USART1Ready != SET)  

  14.   {  

  15.   }  

  16.     USART1Ready = RESET;  

  17.     return ch;  

  18. }  

  19.   

  20.   

  21. /* USER CODE END PV */  

这是重定向函数的修改,启动发送之后,等待发送完成。重新实现的回调函数如下图所示:



[cpp] view plain copy

  1. /** 

  2.   * @brief  Tx Transfer completed callbacks. 

  3.   * @param  huart: pointer to a UART_HandleTypeDef structure that contains 

  4.   *                the configuration information for the specified UART module. 

  5.   * @retval None 

  6.   */  

  7. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  

  8. {  

  9.   /* NOTE: This function Should not be modified, when the callback is needed, 

  10.            the HAL_UART_TxCpltCallback could be implemented in the user file 

  11.    */   

  12.     USART1Ready = SET;  

  13. }  


这样就可以了,下载验证。


责任编辑:电气自动化网
首页 | 资讯 | 应用技术 | 高压 | 设计 | 行业 | 低压电器 | 电路图 | 关于

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。