HT32F52352单片机,双串口,PWM的4路输出,GPIO输入(红外模块)(可以当合泰杯比赛的程序模板,非常好用),printf使用自定义串口输出

先放出双串口的代码,很多时候我们要利用一个串口仿造写出另一个串口的时候,时而失败。我通过改了几次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路输出,GPIO输入(红外模块)(可以当合泰杯比赛的程序模板,非常好用),printf使用自定义串口输出_第1张图片

图二接线

HT32F52352单片机,双串口,PWM的4路输出,GPIO输入(红外模块)(可以当合泰杯比赛的程序模板,非常好用),printf使用自定义串口输出_第2张图片

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

HT32F52352单片机,双串口,PWM的4路输出,GPIO输入(红外模块)(可以当合泰杯比赛的程序模板,非常好用),printf使用自定义串口输出_第3张图片

 图三接线

HT32F52352单片机,双串口,PWM的4路输出,GPIO输入(红外模块)(可以当合泰杯比赛的程序模板,非常好用),printf使用自定义串口输出_第4张图片

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

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

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

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

你可能感兴趣的:(HT32,单片机,嵌入式硬件,c语言)