当前位置:   article > 正文

HT32F52352学习笔记之五

ht32f52352

经过一小段时间的奋战,终于是把串口通信的相关代码编写并调试完成了。可以实现接收中断、发送数据、经过重定向的printf、puts、getchar、scanf都可以通过串口的方式实现输出输入。另外,由于使用的是HT32F52352的最小系统板,在发送数据时可不外接CH340模块,但是要实现接收数据一定一定要外接CH340模块,我也不知道为什么会这样,真的服了,被这个不需要外接CH340模块就能发送数据给电脑给迷惑了,导致用电脑发数据给芯片时一直进不了中断函数,不过能用就行了。另外,在重定向时还需要注意一定要把printf.c里的signed int printf(const char *f, ...)、signed int puts(const char *pString)以及ht32_retarget.c里的int fputc (int ch, FILE *f)、int fgetc (FILE *f)注释掉,不然编译器会报错Error: L6200E: Symbol printf multiply defined (by printfa.o and printf.o).注释掉就不会出现这样的错误了。

另外,根据数据手册上的说明,USART的引脚是需要进行复用初始化的。和STM32F103不一样的是HT32F52352不需要对Rx、Tx的GPIO引脚进行配置,只需要复位初始化即可使用。而且可以当作USART1、USART0 的Rx、Tx引脚不止四个,但是一共只有两个串口。

主要的代码:

(1)USART初始化

  1. #include "usart.h"
  2. static void USART_CKCU_Config()
  3. {
  4. CKCU_PeripClockConfig_TypeDef CCLOCK;
  5. CCLOCK.Bit.AFIO = 1;
  6. COM_CLK(CCLOCK) = 1;
  7. CKCU_PeripClockConfig(CCLOCK, ENABLE);
  8. }
  9. static void USART_AFIO_Config()
  10. {
  11. AFIO_GPxConfig(COM_TX_GPIO_ID, COM_TX_AFIO_PIN, AFIO_FUN_USART_UART);
  12. AFIO_GPxConfig(COM_RX_GPIO_ID, COM_RX_AFIO_PIN, AFIO_FUN_USART_UART);
  13. }
  14. static void USARTx_Config()
  15. {
  16. USART_InitTypeDef USART_InitStructure;
  17. /*USART初始化
  18. *波特率:115200
  19. *字节长度:8位
  20. *停止位:1位
  21. *校验位:无
  22. *模式:正常模式
  23. **/
  24. USART_InitStructure.USART_BaudRate = 115200;
  25. USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;
  26. USART_InitStructure.USART_StopBits = USART_STOPBITS_1;
  27. USART_InitStructure.USART_Parity = USART_PARITY_NO;
  28. USART_InitStructure.USART_Mode = USART_MODE_NORMAL;
  29. USART_Init(COM_PORT , &USART_InitStructure);
  30. /* 设置USART中断标志 */
  31. USART_IntConfig(COM_PORT, USART_INT_RXDR, ENABLE);
  32. /* 使能USART接收、发送 */
  33. USART_TxCmd(COM_PORT, ENABLE);
  34. USART_RxCmd(COM_PORT, ENABLE);
  35. /* 初始化中断 */
  36. NVIC_EnableIRQ(COM_IRQn);
  37. }
  38. void USARTx_Init()
  39. {
  40. USART_CKCU_Config();
  41. USART_AFIO_Config();
  42. USARTx_Config();
  43. }
  44. // 发送一个字节
  45. void Usart_Sendbyte(HT_USART_TypeDef* USARTx, u8 Data)
  46. {
  47. USART_SendData(COM_PORT, Data);
  48. // 等待发送数据寄存器清空
  49. while (USART_GetFlagStatus(COM_PORT, USART_FLAG_TXDE) == RESET);
  50. }
  51. //发送每个元素数据长度为8位的数组
  52. void Usart_SendArray(HT_USART_TypeDef* USARTx, u8 *array,u8 num)
  53. {
  54. u8 i;
  55. for( i = 0;i < num;i++)
  56. {
  57. Usart_Sendbyte(USARTx,*array);
  58. array++;
  59. }
  60. }
  61. // 发送字符串
  62. void Usart_SendStr(HT_USART_TypeDef* USARTx, uint8_t *str)
  63. {
  64. uint8_t i;
  65. for(i = 0;str[i] != '\0';i++)
  66. {
  67. Usart_Sendbyte(USARTx,str[i]);
  68. }
  69. }
  70. // 重定向c库函数printf到串口,重定向后可使用printf函数
  71. int fputc(int ch, FILE *f)
  72. {
  73. /* 发送一个字节数据到串口 */
  74. USART_SendData(COM_PORT, (uint8_t) ch);
  75. /* 等待发送完毕 */
  76. while (USART_GetFlagStatus(COM_PORT, USART_FLAG_TXDE) == RESET);
  77. return (ch);
  78. }
  79. // 重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
  80. int fgetc(FILE *f)
  81. {
  82. /* 等待串口输入数据 */
  83. while (USART_GetFlagStatus(COM_PORT, USART_FLAG_RXDNE) == RESET);
  84. return (int)USART_ReceiveData(COM_PORT);
  85. }

(2)中断函数:

  1. void COM_IRQHandler(void)
  2. {
  3. u8 data;
  4. if( USART_GetFlagStatus(COM_PORT, USART_FLAG_RXDR) )
  5. {
  6. data = USART_ReceiveData(COM_PORT);
  7. printf("data = %c\n",data);
  8. }
  9. }

对硬件方面(如引脚、模式选择等的封装):

  1. #ifndef _USART_H
  2. #define _USART_H
  3. #include "ht32f5xxxx_01.h"
  4. #include <stdio.h>
  5. #define DEBUG_USART0 (0)
  6. #define DEBUG_USART1 (1)
  7. #if DEBUG_USART0
  8. //串口0 USART - 0
  9. #define COM_CLK(CK) (CK.Bit.USART0)
  10. #define COM_PORT (HT_USART0)
  11. #define COM_IRQn (USART0_IRQn)
  12. #define COM_IRQHandler (USART0_IRQHandler)
  13. #define COM_TX_GPIO_ID (GPIO_PA)
  14. #define COM_TX_AFIO_PIN (AFIO_PIN_2)
  15. #define COM_TX_AFIO_MODE (AFIO_FUN_USART_UART)
  16. #define COM_RX_GPIO_ID (GPIO_PA)
  17. #define COM_RX_AFIO_PIN (AFIO_PIN_3)
  18. #define COM_RX_AFIO_MODE (AFIO_FUN_USART_UART)
  19. #elif DEBUG_USART1
  20. //串口1 USART - 1
  21. #define COM_CLK(CK) (CK.Bit.USART1)
  22. #define COM_PORT (HT_USART1)
  23. #define COM_IRQn (USART1_IRQn)
  24. #define COM_IRQHandler (USART1_IRQHandler)
  25. #define COM_TX_GPIO_ID (GPIO_PA)
  26. #define COM_TX_AFIO_PIN (AFIO_PIN_4)
  27. #define COM_TX_AFIO_MODE (AFIO_FUN_USART_UART)
  28. #define COM_RX_GPIO_ID (GPIO_PA)
  29. #define COM_RX_AFIO_PIN (AFIO_PIN_5)
  30. #define COM_RX_AFIO_MODE (AFIO_FUN_USART_UART)
  31. #endif
  32. void USARTx_Init(void);
  33. void Usart_Sendbyte(HT_USART_TypeDef* USARTx, u8 Data);
  34. void Usart_SendArray(HT_USART_TypeDef* USARTx, u8 *array,u8 num);
  35. void Usart_SendStr(HT_USART_TypeDef* USARTx, uint8_t *str);
  36. #endif

用到的库函数:

(1)USART初始化结构体

  1. /* USART Mode ----------------------------------------------------------------------------------------------*/
  2. /** @defgroup USART_Mode Definitions of USART mode
  3. * @{
  4. */
  5. #define USART_MODE_NORMAL ((u32)0x00000000)
  6. #define USART_MODE_IRDA ((u32)0x00000001)
  7. #define USART_MODE_RS485 ((u32)0x00000002)
  8. #define USART_MODE_SYNCHRONOUS ((u32)0x00000003)
  9. /* USART Parity --------------------------------------------------------------------------------------------*/
  10. /** @defgroup USART_Parity Definitions of USART parity
  11. * @{
  12. */
  13. #define USART_PARITY_NO ((u32)0x00000000)
  14. #define USART_PARITY_EVEN ((u32)0x00001800)
  15. #define USART_PARITY_ODD ((u32)0x00000800)
  16. /* USART Stop Bits -----------------------------------------------------------------------------------------*/
  17. /** @defgroup USART_Stop_Bit Definitions of USART stop bit
  18. * @{
  19. */
  20. #define USART_STOPBITS_1 ((u32)0x00000000)
  21. #define USART_STOPBITS_2 ((u32)0x00000400)
  22. /* USART Word Length ---------------------------------------------------------------------------------------*/
  23. /** @defgroup USART_Word_Length Definitions of USART word length
  24. * @{
  25. */
  26. #define USART_WORDLENGTH_7B ((u32)0x00000000)
  27. #define USART_WORDLENGTH_8B ((u32)0x00000100)
  28. #define USART_WORDLENGTH_9B ((u32)0x00000200)
  29. /* Definition of USART Init Structure ---------------------------------------------------------------------*/
  30. typedef struct
  31. {
  32. u32 USART_BaudRate;
  33. u16 USART_WordLength;
  34. u16 USART_StopBits;
  35. u16 USART_Parity;
  36. u16 USART_Mode;
  37. } USART_InitTypeDef;

(2)USART初始化函数

  1. /*********************************************************************************************************//**
  2. * @brief Initialize the USART/UART peripheral according to the specified parameters in the USART_InitStruct.
  3. * @param USARTx: Parameter to select the UxART peripheral.
  4. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure.
  5. * @retval None
  6. ************************************************************************************************************/
  7. void USART_Init(HT_USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)

(3)USART中断标志设置函数(文末附带对USART 中断使能寄存器 – USRIER的说明)

  1. /*********************************************************************************************************//**
  2. * @brief Enable or Disable the USART/UART interrupts.
  3. * @param USARTx: Parameter to select the UxART peripheral.
  4. * @param USART_INT_x: Specify if the USART/UART interrupt source to be enabled or disabled.
  5. * This parameter can be one of the following values:
  6. * @arg USART_INT_RXDR :(u32)0x00000001
  7. * @arg USART_INT_TXDE :(u32)0x00000002
  8. * @arg USART_INT_TXC :(u32)0x00000004
  9. * @arg USART_INT_OE :(u32)0x00000008
  10. * @arg USART_INT_PE :(u32)0x00000010
  11. * @arg USART_INT_FE :(u32)0x00000020
  12. * @arg USART_INT_BI :(u32)0x00000040
  13. * @arg USART_INT_RSADD :(u32)0x00000080
  14. * @arg USART_INT_TOUT :(u32)0x00000100
  15. * @arg USART_INT_CTS :(u32)0x00000200
  16. * @param NewState: This parameter can be ENABLE or DISABLE.
  17. * @retval None
  18. ************************************************************************************************************/
  19. void USART_IntConfig(HT_USART_TypeDef* USARTx, u32 USART_INT_x, ControlStatus NewState)

(4)USART Rx/Tx使能函数

  1. #define USART_TxCmd(USARTx, NewState) USART_TxRxCmd(USARTx, USART_CMD_TX, NewState)
  2. #define USART_RxCmd(USARTx, NewState) USART_TxRxCmd(USARTx, USART_CMD_RX, NewState)
  3. /*********************************************************************************************************//**
  4. * @brief Enable or Disable the USART Tx/Rx.
  5. * @param USARTx: Parameter to select the USART peripheral.
  6. * @param TxRx: This parameter can be USART_CMD_TX or USART_CMD_RX.
  7. * @param NewState: This parameter can be ENABLE or DISABLE.
  8. * @retval None
  9. ************************************************************************************************************/
  10. void USART_TxRxCmd(HT_USART_TypeDef* USARTx,u32 TxRx, ControlStatus NewState)

(5)NVIC初始化中断函数

  1. // 就是那个找不到声明和定义的初始化中断函数
  2. NVIC_EnableIRQ(COM_IRQn);

USART 中断使能寄存器 – USRIER的说明:

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号