日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

使用stm32cubemx開(kāi)發(fā)四:串口標(biāo)準(zhǔn)化輸出

 奔跑的瓦力 2019-01-28

 硬件平臺(tái):stm32F407Zet6

軟件平臺(tái):stm32cubeMX 4.7+MDK5.14

電路連接:PA9,PA10

第一步、通過(guò)Stm32CubeMX圖形界面創(chuàng)建Keil工程

需要配置的地方是



在這里可以修改串口工作的一下參數(shù),軟件就可以生成配置好的工程,不需要親自去配置這些了。

第二步。打開(kāi)工程,編寫(xiě)代碼,驗(yàn)證

  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 */

這段程序?yàn)榱丝梢允褂胮rintf()函數(shù),對(duì)字符輸出函數(shù)進(jìn)行了重定向,這樣我們就可以在程序中使用printf函數(shù)進(jìn)行輸出了,這里使用的是查詢(xún)發(fā)送方式,有超時(shí)控制的。接下來(lái)來(lái)看中斷方式的。

  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. tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_PE);
  11. tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE);
  12. /* UART parity error interrupt occurred ------------------------------------*/
  13. if((tmp1 != RESET) && (tmp2 != RESET))
  14. {
  15. __HAL_UART_CLEAR_PEFLAG(huart);
  16. huart->ErrorCode |= HAL_UART_ERROR_PE;
  17. }
  18. tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_FE);
  19. tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
  20. /* UART frame error interrupt occurred -------------------------------------*/
  21. if((tmp1 != RESET) && (tmp2 != RESET))
  22. {
  23. __HAL_UART_CLEAR_FEFLAG(huart);
  24. huart->ErrorCode |= HAL_UART_ERROR_FE;
  25. }
  26. tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_NE);
  27. tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
  28. /* UART noise error interrupt occurred -------------------------------------*/
  29. if((tmp1 != RESET) && (tmp2 != RESET))
  30. {
  31. __HAL_UART_CLEAR_NEFLAG(huart);
  32. huart->ErrorCode |= HAL_UART_ERROR_NE;
  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. huart->ErrorCode |= HAL_UART_ERROR_ORE;
  41. }
  42. tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);
  43. tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);
  44. /* UART in mode Receiver ---------------------------------------------------*/
  45. if((tmp1 != RESET) && (tmp2 != RESET))
  46. {
  47. UART_Receive_IT(huart);
  48. }
  49. tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TXE);
  50. tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE);
  51. /* UART in mode Transmitter ------------------------------------------------*/
  52. if((tmp1 != RESET) && (tmp2 != RESET))
  53. {
  54. UART_Transmit_IT(huart);
  55. }
  56. tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TC);
  57. tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC);
  58. /* UART in mode Transmitter end --------------------------------------------*/
  59. if((tmp1 != RESET) && (tmp2 != RESET))
  60. {
  61. UART_EndTransmit_IT(huart);
  62. }
  63. if(huart->ErrorCode != HAL_UART_ERROR_NONE)
  64. {
  65. /* Set the UART state ready to be able to start again the process */
  66. huart->State = HAL_UART_STATE_READY;
  67. HAL_UART_ErrorCallback(huart);
  68. }
  69. }
這個(gè)函數(shù)中查詢(xún)了所有可能發(fā)生的中斷。用到的中斷是發(fā)送完成中斷,就找到了UART_EndTransmit_IT(huart);再跳進(jìn)去看看,

  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. /* Check if a receive process is ongoing or not */
  12. if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
  13. {
  14. huart->State = HAL_UART_STATE_BUSY_RX;
  15. }
  16. else
  17. {
  18. /* Disable the UART Parity Error Interrupt */
  19. __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
  20. /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
  21. __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
  22. huart->State = HAL_UART_STATE_READY;
  23. }
  24. HAL_UART_TxCpltCallback(huart);
  25. return HAL_OK;
  26. }
這個(gè)函數(shù)在確定中斷發(fā)生了之后調(diào)用了,HAL_UART_TxCpltCallback(huart);從函數(shù)名上可以看出,這是個(gè)回調(diào)函數(shù),就是留給上層來(lái)實(shí)現(xiàn)的函數(shù),由這個(gè)函數(shù)的實(shí)現(xiàn)不同,來(lái)實(shí)現(xiàn)不同的功能。這里來(lái)實(shí)現(xiàn)這個(gè)函數(shù),讓它在中斷發(fā)生的時(shí)候吧USART1Ready置為SET;代碼修改如下

  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. PUTCHAR_PROTOTYPE
  10. {
  11. HAL_UART_Transmit_IT(&huart1 , (uint8_t *)&ch, 1);
  12. while (USART1Ready != SET)
  13. {
  14. }
  15. USART1Ready = RESET;
  16. return ch;
  17. }
  18. /* USER CODE END PV */
這是重定向函數(shù)的修改,啟動(dòng)發(fā)送之后,等待發(fā)送完成。重新實(shí)現(xiàn)的回調(diào)函數(shù)如下圖所示:

  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. }

這樣就可以了,下載驗(yàn)證。





    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多