合泰HT32F65C40F 串口驱动 例:UART0 数据收发

发布时间:2024年01月11日

.c.h 源码已付文末;

这款芯片串口调试的例程几乎没有! 折腾了许久 终于算是不负有心人?

使用 :

1. 初始化:UART0_Configuration()

2. 收:UART0_analyze_data()? ???// 【extern 它:u8 rbfData[20]? 即可】

3. 发:UART0_tx_string(const char *str)

????????????uprintf(const char *str, ...)? ? ? ? ?// 【类似于printf】

#define onleyUart0
#ifdef onleyUart0

#include "Log_Uart.h"
u8 rbfData[20];

#define MAX_BUFFER_SIZE 100
#define __ALIGN4 __align(4)
//-----------------------------------------------------------------------------
__ALIGN4 _UART0_STRUCT rxd_comm0;
__ALIGN4 _UART0_STRUCT txd_comm0;

//extern u8 rbfData[8];

//-----------------------------------------------------------------------------
void UART0_Configuration(void)
{
	USART_InitTypeDef USART_InitStruct; //定义在前,避免报错
	
	//外设时钟 在CKCU_Configuration(void)内设置 或 在此处初始化即可 重复设置亦可 无影响
  CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  CKCUClock.Bit.UART0   = 1;
  CKCUClock.Bit.AFIO    = 1;
  CKCUClock.Bit.PA      = 1;
  CKCU_PeripClockConfig(CKCUClock, ENABLE);		
	
	//GPIO引脚设置
  GPIO_PullResistorConfig(HT_GPIOA, GPIO_PIN_5, GPIO_PR_UP); 	// PA5_RX PULL_UP
  AFIO_GPxConfig(GPIO_PA, AFIO_PIN_4, AFIO_FUN_USART_UART);  	// Config AFIO mode - PA4_TX
  AFIO_GPxConfig(GPIO_PA, AFIO_PIN_5, AFIO_FUN_USART_UART);  	// Config AFIO mode - PA5_RX
	
	//UART0 参数设置 
  USART_InitStruct.USART_BaudRate = 115200;
  USART_InitStruct.USART_WordLength = USART_WORDLENGTH_8B;
  USART_InitStruct.USART_StopBits = USART_STOPBITS_1;
  USART_InitStruct.USART_Parity = USART_PARITY_NO;
  USART_InitStruct.USART_Mode = USART_MODE_NORMAL;
	
	//将参数结构体USART_InitStruct初始化到对应串口UART0
  USART_Init(HT_UART0, &USART_InitStruct);										
	

//	//PMDA负责搬运串口数据收发  与 PDMA_Configuration(void)配合 锁定到UART0
//  //这里没用DMA 注释掉了
//	USART_PDMACmd(HT_UART0, USART_PDMAREQ_TX, ENABLE);  
//	USART_PDMACmd(HT_UART0, USART_PDMAREQ_RX, ENABLE);

	//使能
  USART_RxCmd(HT_UART0, ENABLE);
  USART_TxCmd(HT_UART0, ENABLE);

  
	//使能 串口中断收发数据 
	USART_IntConfig(HT_UART0, USART_INT_RXDR, ENABLE);
  NVIC_EnableIRQ(UART0_IRQn);
  UART0_init_buffer();
	
}

//-----------------------------------------------------------------------------
void UART0_init_buffer (void)
{
  rxd_comm0.read_pt = 0;
  rxd_comm0.write_pt = 0;
  rxd_comm0.cnt = 0;

  txd_comm0.read_pt = 0;
  txd_comm0.write_pt = 0;
  txd_comm0.cnt = 0;
}

//-----------------------------------------------------------------------------

void UART0_IRQHandler(void)
{
  // Tx, move data from buffer to UART FIFO
  if ((HT_UART0->SR) & USART_FLAG_TXC)
  {
    if (!txd_comm0.cnt)
    {
      USART_IntConfig(HT_UART0, USART_INT_TXC, DISABLE);
    }
    else
    {
      u16 i;
      for (i = 0; i < UART0_FIFO_LEN; i++)   //have FIFO?
      {
        USART_SendData(HT_UART0, txd_comm0.buffer[txd_comm0.read_pt]);
        txd_comm0.read_pt = (txd_comm0.read_pt + 1) % UART0_BUF_SIZE;
        txd_comm0.cnt--;
        if (!txd_comm0.cnt)
          break;
      }
    }
  }

  // Rx, move data from UART FIFO to buffer
  if ((HT_UART0->SR) & USART_FLAG_RXDR )
  {
    rxd_comm0.buffer[rxd_comm0.write_pt] = USART_ReceiveData(HT_UART0);

    rxd_comm0.write_pt = (rxd_comm0.write_pt + 1) % UART0_BUF_SIZE;
    rxd_comm0.cnt++;
  }
}

//-----------------------------------------------------------------------------
//接受数据
static uint8_t rbfIndex = 0;          // 字符数组缓冲索引

void UART0_analyze_data(void)
{
    u8 tmp;
    
    if (!rxd_comm0.cnt) {
        return;
    }    
    tmp = rxd_comm0.buffer[rxd_comm0.read_pt];
    
    if (tmp == '\n' || tmp == '\0') {  // 如果接收到字符串结束符
        NVIC_DisableIRQ(UART0_IRQn);
        rbfData[rbfIndex] = '\0';  // 在末尾添加 NULL 字符
        rbfIndex = 0;
        NVIC_EnableIRQ(UART0_IRQn);
        
        UART0_tx_string((const char*)rbfData);  // 将完整的字符串发送出去
    } else if (rbfIndex < UART0_BUF_SIZE - 1) {  // 如果字符数组缓冲未满
        rbfData[rbfIndex++] = tmp;  // 将接收到的字符存储在字符数组缓冲中
    }
    
    rxd_comm0.cnt--;
    rxd_comm0.read_pt = (rxd_comm0.read_pt + 1) % UART0_BUF_SIZE;
}

//-----------------------------------------------------------------------------
void UART0_tx_data(u8 *pt, u8 len)
{
  while(len--)
  {
    txd_comm0.buffer[txd_comm0.write_pt] = *pt++;
    txd_comm0.write_pt = (txd_comm0.write_pt + 1) % UART0_BUF_SIZE;
    NVIC_DisableIRQ(UART0_IRQn);
    txd_comm0.cnt++;
    NVIC_EnableIRQ(UART0_IRQn);
  }

  if(txd_comm0.cnt)
    USART_IntConfig(HT_UART0,  USART_INT_TXC , ENABLE);
}

//-----------------------------------------------------------------------------
void UART0_test(void)
{
  u8 i,test_array[8];
  for(i=0; i<8; i++)
  {
    test_array[i] = i;
  }
  UART0_tx_data(test_array, 8);
}

//-----------------------------------------------------------------------------
#define LOG_do  //如不定义LOG_do 则所有log_uart打印取消
void UART0_tx_string(const char *str)
{
	#ifdef LOG_do
  while (*str) {
    UART0_tx_data((u8*)str, 1);
    str++;
  }
	#endif
}
	
//-----------------------------------------------------------------------------

void uprintf(const char *str, ...) //类似于printf
{	
		int i;
    #ifdef LOG_do
    char buffer[256];  // 定义一个缓冲区,用于存储格式化后的字符串
    va_list args;  // 定义一个 va_list 类型的变量,用于存储可变参数

    // 使用 vsnprintf 函数将可变参数按照 format 格式化成字符串
    va_start(args, str);
    vsnprintf(buffer, sizeof(buffer), str, args);
    va_end(args);

    // 循环发送格式化后的字符串到 UART0
    for ( i = 0; buffer[i] != '\0'; i++) {
        UART0_tx_data((u8*)&buffer[i], 1);
    }
    #endif
}
//-----------------------------------------------------------------------------
#endif



 /************************************************************************************************************
 * 
 *	合泰LOG_UART0.h  
 *
 ************************************************************************************************************/

#ifndef __UART0_H
#define __UART0_H



//-----------------------------------------------------------------------------
#include "ht32.h"
#include <stdarg.h>  // 包含变参函数相关的头文件
//#include "PDMA.h"
//#include "USART.h"
//-----------------------------------------------------------------------------
#define UART0_BUF_SIZE 256
#define UART0_FIFO_LEN 1


//-----------------------------------------------------------------------------
typedef struct
{
  u8 buffer[UART0_BUF_SIZE];
  u16 write_pt;
  u16 read_pt;
  u16 cnt;
}_UART0_STRUCT;

//-----------------------------------------------------------------------------
void UART0_Configuration(void);  				// 波特率 GPIO口 等初始化
void UART0_init_buffer (void);
void UART0_analyze_data(void);
void receiveString(void);								// 接受字符串
void UART0_tx_data(u8 *pt, u8 len);
void UART0_test(void);
void UART0_tx_string(const char *str);	//字符串发送函数
void uprintf(const char *str, ...); 		//类printf 串口发送
//-----------------------------------------------------------------------------
#endif



文章来源:https://blog.csdn.net/Wdf_123654/article/details/135524513
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。