先放出双串口的代码,很多时候我们要利用一个串口仿造写出另一个串口的时候,时而失败。我通过改了几次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 5
AFIO_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