合泰HT32F52352 USART串口与电脑通信控制LED

大怨种经过3天的学习终于把USART串口与电脑通信控制LED完成了,这过程中遇到了许多问题,参考了许多文章,在这就不把所有参考文章都一一列出了,基本上所有的HT32的学习笔记大家的USART.c的文件都大同小异。大家可能一般都使用CH340转串口,我这个初学者是直接使用usb数据线直接烧入的,就出现了能发送数据给电脑,但HT32不能接收数据。后参考了这篇博主的文章 http://t.csdn.cn/ky2Is经过尝试把配置USART1的交替模式4、5改成交替模式14、15

 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);//如果要使用数据线进行串口通信功能,把PA4 5改成PA14 15
  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);

 经过尝试不管是改成14、15还是原先的4、5都不能让HT32接收电脑发送的数据,所以这边还请大佬们教教我

完成实现的编码如下

 参考这位博主的文章http://t.csdn.cn/DtrP9

usart.h

​
#ifndef _USART_H
#define _USART_H
 
#include "ht32f5xxxx_01.h"
#include <stdio.h>
 
#define DEBUG_USART0					   (0)
#define DEBUG_USART1					   (1)

#if  DEBUG_USART0
//串口0 USART - 0
#define COM_PORT                   (HT_USART0)
#define COM_IRQn                   (USART0_IRQn)
#define COM_IRQHandler             (USART0_IRQHandler)
 
#define COM_TX_GPIO_ID             (GPIO_PA)
#define COM_TX_AFIO_PIN            (AFIO_PIN_2)
#define COM_TX_AFIO_MODE           (AFIO_FUN_USART_UART)
 
#define COM_RX_GPIO_ID             (GPIO_PA)
#define COM_RX_AFIO_PIN            (AFIO_PIN_3)
#define COM_RX_AFIO_MODE           (AFIO_FUN_USART_UART)
 
#elif DEBUG_USART1
//串口1 USART - 1
#define COM_PORT                   (HT_USART1)
#define COM_IRQn                   (USART1_IRQn)
#define COM_IRQHandler             (USART1_IRQHandler)
 
#define COM_TX_GPIO_ID             (GPIO_PA)
#define COM_TX_AFIO_PIN            (AFIO_PIN_4)
#define COM_TX_AFIO_MODE           (AFIO_FUN_USART_UART)
 
#define COM_RX_GPIO_ID             (GPIO_PA)
#define COM_RX_AFIO_PIN            (AFIO_PIN_5)
#define COM_RX_AFIO_MODE           (AFIO_FUN_USART_UART)

#endif
 
void USARTx_Init(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);
 
#endif

​

usart.c

#include "usart.h"
 
static void USART0_CKCU_Config()
{
	CKCU_PeripClockConfig_TypeDef CCLOCK;
	
	CCLOCK.Bit.AFIO   = 1;
	CCLOCK.Bit.USART0 = 1;
	CCLOCK.Bit.PA			= 1;
	
	CKCU_PeripClockConfig(CCLOCK, ENABLE);
}

static void USART1_CKCU_Config()
{
	CKCU_PeripClockConfig_TypeDef CCLOCK;
	
	CCLOCK.Bit.AFIO   = 1;
	CCLOCK.Bit.USART1 = 1;
	CCLOCK.Bit.PA			= 1;
	
	CKCU_PeripClockConfig(CCLOCK, ENABLE);
} 


static void USART_AFIO_Config()
{
	AFIO_GPxConfig(COM_TX_GPIO_ID, COM_TX_AFIO_PIN, AFIO_FUN_USART_UART);
	AFIO_GPxConfig(COM_RX_GPIO_ID, COM_RX_AFIO_PIN, AFIO_FUN_USART_UART);
}
 
static void USARTx_Config()
{
	USART_InitTypeDef USART_InitStructure;
	
	/*USART初始化
	*波特率:115200
	*字节长度:8位
	*停止位: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(COM_PORT, &USART_InitStructure);
	
	/* 设置USART中断标志 */
	USART_IntConfig(COM_PORT, USART_INT_RXDR, ENABLE);
	/* 使能USART接收、发送 */
	USART_TxCmd(COM_PORT, ENABLE);
	USART_RxCmd(COM_PORT, ENABLE);
	/* 初始化中断 */
	NVIC_EnableIRQ(COM_IRQn);
	
}
 
//初始化函数
void USARTx_Init()
{
	USART0_CKCU_Config();
	USART1_CKCU_Config();
	USART_AFIO_Config();
	USARTx_Config();
}
 
// 发送一个字节
void Usart_Sendbyte(HT_USART_TypeDef* USARTx, u8 Data)
{
	USART_SendData(COM_PORT, Data);
	// 等待发送数据寄存器清空
	while (USART_GetFlagStatus(COM_PORT, USART_FLAG_TXDE) == RESET);		
}
 
//发送每个元素数据长度为8位的数组
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]);
	}
}
 
// 重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到串口 */
	USART_SendData(COM_PORT, (uint8_t) ch);
		
	/* 等待发送完毕 */
	while (USART_GetFlagStatus(COM_PORT, USART_FLAG_TXDE) == RESET);		
	
	return (ch);
}
 
// 重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
	/* 等待串口输入数据 */
	while (USART_GetFlagStatus(COM_PORT, USART_FLAG_RXDNE) == RESET);
 
	return (int)USART_ReceiveData(COM_PORT);
}

/*中断函数*/
/*void COM_IRQHandler(void)
{
	u8 data;
	
	if( USART_GetFlagStatus(COM_PORT, USART_FLAG_RXDR) )//接收中断
	{
		data = USART_ReceiveData(COM_PORT); //读取接收到的数据
		printf("data = %c\n",data);
	}
}*/

 博主那边的这个printf.c文件是不在HT32工程里的文件,这个我就没有修改了,但能实现串口通信与串口助手的printf的文字输出

main.c

#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "usart.h"

uint8_t data = 0;

int main()
{
	led_init();
	USARTx_Init();
	Usart_SendStr(COM1_PORT,(uint8_t *)"------HT32 UART TEST-------\r\n");//循环发送字符串,测试用
	while(1)
	{
		
	}
}


void COM_IRQHandler(void)
{
	u8 data;
	
	if( USART_GetFlagStatus(COM_PORT, USART_FLAG_RXDR) )
	{
		data = USART_ReceiveData(COM_PORT);
		printf("data = %c\r\n",data);
		if(data == '0')
		{
			led_on();
			printf("LED ON\r\n");
		}
		else if(data == '1')
		{
			led_off();
			printf("LED OFF\r\n");
		}
	}
}

led.c

#include "led.h"

void led_init(void)
{
   CKCU_PeripClockConfig_TypeDef LEDClock = {{ 0 }};
   LEDClock.Bit.PC = 1; //使能PC
   CKCU_PeripClockConfig(LEDClock, ENABLE); //一定要先使能时钟,再配置下面的
   GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_15|GPIO_PIN_14, GPIO_DIR_OUT); //设置PC15为输出
   led_off();
}

void led_on(void)
{
   GPIO_WriteOutBits(HT_GPIOC, GPIO_PIN_15, RESET);
   GPIO_WriteOutBits(HT_GPIOC, GPIO_PIN_14, RESET);
}

void led_off(void)
{
   GPIO_WriteOutBits(HT_GPIOC, GPIO_PIN_15, SET);
   GPIO_WriteOutBits(HT_GPIOC, GPIO_PIN_14, SET);
	
}

 

再次感谢这位博主。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值