合泰HT3252352串口通信实验注意点
前面一节我们实现了点灯操作,本篇进行串口通信实验分享,通过串口来控制led的开关
串口的接收和发送搞了很久,一直都是只能发送而中断却不能接收数据是,最后在其他博主那里找到了解决方式,因为我们的烧入器是不需要ch430进可以烧入的,如果只进行发送的话也是需要的,但是想要进行数据接收我们就必须要在接一个ch430进行串口数据的收发。
工程链接需要自取
链接:https://pan.baidu.com/s/1ZAcFbE-ZQ_rbaaHOKCY79A
提取码:kuia
–来自百度网盘超级会员V4的分享
再次感谢下面这位博主
官方芯片手册HT32引脚图
我们使用的合泰Ht32芯片只有两个串口 不过有很多 引脚都可以当做串口使用,在使用的时候我们注意要将引脚进行复用初始化
中断使能寄存器
我们在使用printf进行打印的使用下面报错,提示我们多重定义了所有我们需要进行部分修改
1》将printf.c 里面signed int printf(const char *f, …)这个函数注释掉
2》将ht32_retarget.c里面的fputc和fgetc函数注释掉就行了
uart.c
#include "uart.h"
static void USART_CKCU_Config()
{
CKCU_PeripClockConfig_TypeDef CCLOCK;
CCLOCK.Bit.AFIO = 1;
COM_CLK(CCLOCK) = 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()
{
USART_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);
}
uart.h
#ifndef _UART_H
#define _UART_H
#include "ht32f5xxxx_01.h"
#include <stdio.h>
#define DEBUG_USART0 (0)
#define DEBUG_USART1 (1)
#if DEBUG_USART0
//串口0 USART - 0
#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)
#elif DEBUG_USART1
//串口1 USART - 1
#define COM_CLK(CK) (CK.Bit.USART1)
#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
main.c
#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "uart.h"
/**********************TH32 串口点灯**********************
Author:小殷
Date:2022-4-18
******************************************************/
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\n",data);
if(data == '0')
{
LED1_ON();
printf("LED1 ON\n");
}
else if(data == '1')
{
LED1_OFF();
printf("LED1 OFF\n");
}
}
}
串口打印结果