先放出双串口的代码,很多时候我们要利用一个串口仿造写出另一个串口的时候,时而失败。我通过改了几次HT32的代码之后发现主要问题出现在宏定义这边。

usart.c文件

#include "usart.h"#include "ht32f5xxxx_gpio.h"/**************************实现函数********************************************函数说明:配置usart串口*******************************************************************************/ void USART_Configuration(void){ USART_InitTypeDef USART_InitStructure; { CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; CKCUClock.Bit.AFIO = 1; CKCUClock.Bit.PA = 1; CKCUClock.Bit.USART1 = 1; CKCU_PeripClockConfig(CKCUClock, ENABLE);}{ CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; CKCUClock.Bit.AFIO = 1; CKCUClock.Bit.PA = 1; CKCUClock.Bit.USART0 = 1; CKCU_PeripClockConfig(CKCUClock, ENABLE);} GPIO_PullResistorConfig(HT_GPIOA, GPIO_PIN_15, GPIO_PR_UP);//记得这里也要改GPIO_PullResistorConfig(HT_GPIOA, GPIO_PIN_3, GPIO_PR_UP);AFIO_GPxConfig(GPIO_PA, AFIO_PIN_14, AFIO_FUN_USART_UART);//如果要使用数据线进行串口通信功能,把PA14 15改成PA4 5AFIO_GPxConfig(GPIO_PA, AFIO_PIN_15, AFIO_FUN_USART_UART);//并且把开发板的跳线帽接到Tx端AFIO_GPxConfig(GPIO_PA, AFIO_PIN_2, AFIO_FUN_USART_UART);AFIO_GPxConfig(GPIO_PA, AFIO_PIN_3, AFIO_FUN_USART_UART);/*波特率: 115200长度: 8bits停止位: 1位校验位: 无模式: 正常模式*/USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;USART_InitStructure.USART_StopBits = USART_STOPBITS_1;USART_InitStructure.USART_Parity = USART_PARITY_NO;USART_InitStructure.USART_Mode = USART_MODE_NORMAL;USART_Init(HT_USART1, &USART_InitStructure);USART_Init(HT_USART0, &USART_InitStructure); //中断设置NVIC_EnableIRQ(USART1_IRQn);NVIC_EnableIRQ(USART0_IRQn);USART_IntConfig(HT_USART1, USART_INT_RXDR, ENABLE);USART_IntConfig(HT_USART0, USART_INT_RXDR, ENABLE);// 使能 COM1_PORT发送和接收 USART_TxCmd(HT_USART1, ENABLE);USART_RxCmd(HT_USART1, ENABLE);USART_TxCmd(HT_USART0, ENABLE);USART_RxCmd(HT_USART0, ENABLE); //USART_RXTLConfig(COM1_PORT, USART_RXTL_04); 设置FIFO接收等级}/**************************实现函数********************************************函数说明:接收中断服务函数*******************************************************************************/ void USART1_IRQHandler(void)//串口1中断{u8 data;if( USART_GetFlagStatus(HT_USART1, USART_FLAG_RXDR ) ) //接收中断{data = USART_ReceiveData(HT_USART1); //读取接收到的数据printf("data = %c\n",data);//把收到的数据发送回电脑}//发送多字节会多次进入中断USART_ClearFlag(HT_USART1,USART_FLAG_RXDR);}void USART0_IRQHandler(void)//串口1中断{u8 data;if( USART_GetFlagStatus(HT_USART0, USART_FLAG_RXDR ) ) //接收中断{data = USART_ReceiveData(HT_USART0); //读取接收到的数据Usart_Sendbyte(HT_USART0,data); //把收到的数据发送回电脑}//发送多字节会多次进入中断USART_ClearFlag(HT_USART0,USART_FLAG_RXDR);}void USART_Tx1(const char* TxBuffer, u32 length){int i;for (i = 0; i < length; i++){while (!USART_GetFlagStatus(HT_USART1, USART_FLAG_TXC));USART_SendData(HT_USART1, TxBuffer[i]);}}void USART_Tx0(const char* TxBuffer, u32 length){int i;for (i = 0; i < length; i++){while (!USART_GetFlagStatus(HT_USART0, USART_FLAG_TXC));USART_SendData(HT_USART0, TxBuffer[i]);}}/**************************实现函数********************************************函数说明:发送一个字节*******************************************************************************/ void Usart_Sendbyte(HT_USART_TypeDef* USARTx, u8 data){USART_SendData(USARTx, data);while (USART_GetFlagStatus(USARTx, USART_FLAG_TXDE) == RESET);} /**************************实现函数********************************************函数说明:发送数组*******************************************************************************/ void Usart_SendArray(HT_USART_TypeDef* USARTx, u8 *array,u8 num){u8 i;for( i = 0;i < num;i++){Usart_Sendbyte(USARTx,*array);array++;}} /**************************实现函数********************************************函数说明:发送字符串*******************************************************************************/ void Usart_SendStr(HT_USART_TypeDef* USARTx, uint8_t *str){uint8_t i;for(i = 0;str[i] != '\0';i++){Usart_Sendbyte(USARTx,str[i]);}}

usart.h文件

#ifndef __USART_H#define __USART_H#include "ht32f5xxxx_usart.h"#include "sys.h"#define USART_GPIO_GROUP (GPIO_PA)#define USART_TX_PIN (GPIO_PIN_4)#define USART_RX_PIN (GPIO_PIN_5)#define USART_AFIO_MODE(AFIO_FUN_USART_UART) //默认模式:AFIO_MODE_DEFAULT ,AFIO_MODE_1~15对应模式1~15#define COM1_PORT(HT_USART1)#define COM0_PORT(HT_USART0)void USART_Configuration(void);void COM1_IRQHandler(void);void Usart_Sendbyte(HT_USART_TypeDef* USARTx, u8 data);void Usart_SendArray(HT_USART_TypeDef* USARTx, u8 *array,u8 num);void Usart_SendStr(HT_USART_TypeDef* USARTx, uint8_t *str);void USART_Tx1(const char* TxBuffer, u32 length);void USART_Tx0(const char* TxBuffer, u32 length);#endif

我所发现的问题是这个宏定义,如果串口中断名改为

void COM0_PORT_IRQHandler(void) //串口0中断

void COM1_PORT_IRQHandler(void) //串口1中断

#define COM1_PORT(HT_USART1)#define COM0_PORT(HT_USART0)

串口是无法进入中断,也就是无法接收信息的,但是可以正常发送,只要使用原本的中断名就会恢复正常接收,如下

void USART0_IRQHandler(void) //串口0中断

void USART1_IRQHandler(void) //串口1中断

主函数调用格式

#include "ht32.h"#include "usart.h"#include "delay.h"int main(void){ int input=0; GPIOInout_CKCU_Configuration(); USART_Configuration();printf("Loading Finished! %d\r\n", input);USART_Tx1(HelloString, sizeof(HelloString));USART_Tx0(HelloString, sizeof(HelloString));while (1){}}

printf函数使用的是哪个串口可以在实际运行后使用串口助手看到,只有一个串口输出了两句信息。或者打开这个文件直接修改printf函数的串口,默认是COM1(也就是USART1 —PA4 PA5),我们这里修改成USART0(PA2 PA3),然后printf函数就不用数据线输出了,要接转串口效果见图二。如果你依旧接数据线观察输出的话就会发现只剩一条信息了,因为板子上的数据线默认是接在串口1(USART1),效果见图三。

图二(注意这里是CH340转串口)

图二接线

图三(注意这里是串行设备口)

图三接线

百度云链接,建议使用精修改文件当模板,里面还有官网的整个HT32F52352的历程,但是比较晦涩难懂。

单个PWM只能有四路输出,如果4个不够的话,建议先在精修改文件里新建出两个PWM口,验证完再继续写其他内容。

点个赞,留个言再拿走吧!!!

链接:https://pan.baidu.com/s/17eMTxfDPCqiAtMJ7KlzQ4g
提取码:yzyt