【合泰HT32串口控制多路舵机】

合泰HT32串口控制多路舵机

前面完成了HT32 GPTM定时器的多路PWM舵机的控制,在此基础之上加入串口控制,后面会在加上蓝牙和WiFi实现远程控制。定时器和舵机相关配置不在重复如果还没有看的请前往前一篇。

HT32多路PWM舵机控制

usart.h

#ifndef _UART_H
#define _UART_H
 
#include "ht32f5xxxx_01.h"
#include 


#define COM_CLK(CK)                (CK.Bit.USART0)
#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)
 
//	DEBUG_USART1 
//串口1 USART - 1
#define COM1_CLK(CK)                (CK.Bit.USART1)
#define COM1_PORT                   (HT_USART1)
#define COM1_IRQn                   (USART1_IRQn)
#define COM1_IRQHandler             (USART1_IRQHandler)
 
#define COM1_TX_GPIO_ID             (GPIO_PA)
#define COM1_TX_AFIO_PIN            (AFIO_PIN_4)
#define COM1_TX_AFIO_MODE           (AFIO_FUN_USART_UART)
 
#define COM1_RX_GPIO_ID             (GPIO_PA)
#define COM1_RX_AFIO_PIN            (AFIO_PIN_5)
#define COM1_RX_AFIO_MODE           (AFIO_FUN_USART_UART)
 

void Uart_Init(void); 
void USARTx_Init(void);
void USARTx_Init2(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 "uart.h"

/************************************************************串口1 PA4 PA5**********************************************/
static void USART_CKCU_Config()
{
	CKCU_PeripClockConfig_TypeDef CCLOCK;
	
	CCLOCK.Bit.AFIO = 1;
	COM1_CLK(CCLOCK) = 1;
	
	CKCU_PeripClockConfig(CCLOCK, ENABLE);
}
 
static void USART_AFIO_Config()
{
	AFIO_GPxConfig(COM1_TX_GPIO_ID, COM1_TX_AFIO_PIN, AFIO_FUN_USART_UART);
	AFIO_GPxConfig(COM1_RX_GPIO_ID, COM1_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(COM1_PORT  , &USART_InitStructure);
	
	/* 设置USART中断标志 */
	USART_IntConfig(COM1_PORT, USART_INT_RXDR, ENABLE);
	/* 使能USART接收、发送 */
	USART_TxCmd(COM1_PORT, ENABLE);
	USART_RxCmd(COM1_PORT, ENABLE);
	/* 初始化中断 */
	NVIC_EnableIRQ(COM1_IRQn);
	
}
 
void USARTx_Init()
{
	USART_CKCU_Config();
	USART_AFIO_Config();
	USARTx_Config();
}



/************************************************************串口2 PA2 PA3**********************************************/
static void USART_CKCU_Config2()
{
	CKCU_PeripClockConfig_TypeDef CCLOCK;
	
	CCLOCK.Bit.AFIO = 1;
	COM_CLK(CCLOCK) = 1;
	
	CKCU_PeripClockConfig(CCLOCK, ENABLE);
}
 
static void USART_AFIO_Config2()
{
	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_Config2()
{
	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_Init2(void)
{
	USART_CKCU_Config2();
	USART_AFIO_Config2();
	USARTx_Config2();
}


void Uart_Init(void)
{
	 USARTx_Init();
	 USARTx_Init2();
}
/**********************************************共用代码****************************************************/
 
// 发送一个字节
void Usart_Sendbyte(HT_USART_TypeDef* USARTx, u8 Data)
{
	USART_SendData(USARTx, Data);
	// 等待发送数据寄存器清空
	while (USART_GetFlagStatus(USARTx, 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(COM1_PORT, (uint8_t) ch);
		
	/* 等待发送完毕 */
	while (USART_GetFlagStatus(COM1_PORT, USART_FLAG_TXDE) == RESET);		
	
	return (ch);
}
 
// 重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
	/* 等待串口输入数据 */
	while (USART_GetFlagStatus(COM1_PORT, USART_FLAG_RXDNE) == RESET);
 
	return (int)USART_ReceiveData(COM1_PORT);
}

/*
void COM1_IRQHandler(void)
{
	if( USART_GetFlagStatus(COM1_PORT, USART_FLAG_RXDR) )
	{
		
	}
}
*/

/*
void COM_IRQHandler(void)
{
	if( USART_GetFlagStatus(COM1_PORT, USART_FLAG_RXDR) )
	{
		data = USART_ReceiveData(COM1_PORT);
	}
	
}
*/

main.c

#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "uart.h"
#include "time.h"

/******************TH32 串口GPTM多路舵机控制*******************
Author:小殷

Date:2022-4-28
***************************************************************/
int main()
{
	Led_Init();
	Uart_Init();
	GPTM_PWM_init();
	Servo_Run(45);
	Servo_Run2(45);
	Servo_Run3(45);
	Servo_Run4(45);
	printf("---------pwm Test------\n");
	while(1)
	{
		
	}
}


//使用串口1 进行数据的接收
void COM1_IRQHandler(void)
{
	uint8_t data = 0;
	if( USART_GetFlagStatus(COM1_PORT, USART_FLAG_RXDR) )
	{
		data = USART_ReceiveData(COM1_PORT);
		//printf("data = %c\n",data);
		if(data == '1')
		{	
			Servo_Run(0);
			printf("servo1 open\n");
		}
		else if(data == '2')
		{	
			Servo_Run(45);
			printf("servo1 close\n");
		}
		else if(data == '3')
		{	
			Servo_Run2(0);
			printf("servo2 open\n");
		}
		else if(data == '4')
		{	
			Servo_Run2(45);
			printf("servo2 close\n");
		}
		/* 可以加上其他控制功能 */
			USART_ClearFlag(COM1_PORT, USART_FLAG_RSADD);
	}
}

实验结果

【合泰HT32串口控制多路舵机】_第1张图片

ヾ(◍°∇°◍)ノ゙ 加油勒

你可能感兴趣的:(合泰ht32,ht32,串口)