.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