[通用型号] HT32单片机串口通信

[复制链接]
643|0
 楼主| mmbs 发表于 2022-6-18 19:27 | 显示全部楼层 |阅读模式
本帖最后由 eltonchang2001 于 2022-7-11 12:02 编辑

1、添加printf函数支持

这里主要根据正点原子的串口通信实验的printf函数移植而来,printf主要是重定义fputc函数,使其把数据直接通过串口发送出来。

由于HT32与STM32存在不同之处,因此需要查阅官方的芯片手册根据USART状态寄存器的发送完成标志位更改适合HT32单片机的串口发送的判断函数。下面是HT32单片机的USART状态寄存器,其中第九位是发送完成标志位。

2、更改串口中断处理函数

官方的串口中断处理函数个人感觉不太好用,因此我也根据正点原子的串口接收函数改成了原子的风格,而且个人感觉要好用一点。

(二)实验例程1、printf函数
  1. #pragma import(use_no_semihosting)            
  2. //标准库需要的支持函数                 
  3. struct FILE
  4. {
  5.     int handle;
  6. };

  7. FILE __stdout;
  8. //定义_sys_exit()以避免使用半主机模式   
  9. void _sys_exit(int x)
  10. {
  11.     x = x;
  12. }
  13. //重定义fputc函数
  14. int fputc(int ch, FILE f)
  15. {
  16.     while((COM1_PORT->SR&0X0100)==0);//循环发送,直到发送完毕   
  17.     COM1_PORT->DR = (u8) ch;
  18.     return ch;
  19. }

2、串口初始化函数
  1. /*实现函数*
  2. 函数说明:配置usart串口
  3. */
  4. void USART_Configuration(void)
  5. {
  6.     USART_InitTypeDef USART_InitStructure;

  7.     CKCU_PeripClockConfig_TypeDef CKCUClock= {{0}};
  8.     CKCUClock.Bit.AFIO = 1;
  9.     COM1_CLK(CKCUClock)  = 1;  //开启时钟
  10.     CKCU_PeripClockConfig(CKCUClock, ENABLE);

  11.     AFIO_GPxConfig(USART_GPIO_GROUP, USART_TX_PIN, AFIO_FUN_USART_UART);
  12.     AFIO_GPxConfig(USART_GPIO_GROUP, USART_RX_PIN, AFIO_FUN_USART_UART);

  13.     /
  14.     波特率: 115200
  15.     长度:   8bits
  16.     停止位: 1位
  17.     校验位: 无
  18.     模式:   正常模式
  19.     /
  20.     USART_InitStructure.USART_BaudRate = 115200;
  21.     USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;
  22.     USART_InitStructure.USART_StopBits = USART_STOPBITS_1;
  23.     USART_InitStructure.USART_Parity = USART_PARITY_NO;
  24.     USART_InitStructure.USART_Mode = USART_MODE_NORMAL;
  25.     USART_Init(COM1_PORT, &USART_InitStructure);

  26.     //中断设置   
  27.     NVIC_EnableIRQ(COM1_IRQn);

  28.     //使用中断方式接受数据
  29.     USART_IntConfig(COM1_PORT, USART_INT_RXDR , ENABLE);

  30.     // 使能 COM1_PORT  发送和接收
  31.     USART_TxCmd(COM1_PORT, ENABLE);
  32.     USART_RxCmd(COM1_PORT, ENABLE);
  33. }

3、main函数#
  1. #include "ht32.h"
  2. #include "usart.h"

  3. int main(void)
  4. {
  5.     USART_Configuration();//串口初始化
  6.     while (1)
  7.     {
  8.         Usart_SendStr(COM1_PORT,"Hello World!\r\n");//循环发送字符串
  9.         u16 t,len;
  10.         if(USART_RX_STA&0x8000)
  11.         {
  12.             len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
  13.             printf("\r\n您发送的消息为:\r\n");
  14.             for(t=0;t<len;t++)
  15.             {
  16.                 USART_SendData(COM1_PORT, USART_RX_BUF[t]);//向串口1发送数据
  17.                 while(USART_GetFlagStatus(COM1_PORT, USART_FLAG_TXDE)==RESET);//等待发送结束
  18.             }
  19.             printf("\r\n");
  20.             USART_RX_STA=0;
  21.         }
  22.     }
  23. }




您需要登录后才可以回帖 登录 | 注册

本版积分规则

197

主题

6946

帖子

3

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