hpw422移植新的sdk

This commit is contained in:
xushaoxiang
2026-07-03 18:08:25 +08:00
commit 945a5a5b0b
2583 changed files with 713209 additions and 0 deletions
@@ -0,0 +1,129 @@
/*!
* \file main.c
*
* \brief Target main implementation
*
* \copyright Revised BSD License, see section \ref LICENSE.
*
* \code
*
* _ __ _ ________ _
* | |/ /(_)___ / ____/ /_ (_)___
* | // / __ \/ / / __ \/ / __ \
* / |/ / / / / /___/ / / / / /_/ /
* /_/|_/_/_/ /_/\____/_/ /_/_/ .___/
* /_/
* (C) 2022-2025 XinChip
*
* \endcode
*
* \author ( XinChip ) Alex-J
*
* \author ( XinChip )
*/
/*-----------------------------------------------------------------------------------
INCLUDE HEADE FILES
------------------------------------------------------------------------------------*/
#include "main.h"
/*------------------------------------------------------------------------------------
Macros
-------------------------------------------------------------------------------------*/
#define UART_DMA_TX_DEMO 0
#define UART_DMA_PRINT_DEMO 1
/*------------------------------------------------------------------------------------
Global Variables
-------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------
Func Prototype
-------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------
Functions
-------------------------------------------------------------------------------------*/
void clock_init(void)
{
CLOCK_InitCfg_t clock_cfg;
clock_cfg.hfclk_src = CLOCK_HFCLK_SRC_XTAL;
clock_cfg.hfclk_in = CLOCK_HFCLK_IN_32M;
clock_cfg.lfclk_src = CLOCK_LFCLK_SRC_RC;
if(clock_cfg.lfclk_src == CLOCK_LFCLK_SRC_XTAL) {
clock_cfg.lfclk_in = CLOCK_LFCLK_IN_32768;
} else if(clock_cfg.lfclk_src == CLOCK_LFCLK_SRC_RC) {
clock_cfg.lfclk_in = CLOCK_LFCLK_IN_32K;
}
xc_clock_init_cfg(&clock_cfg);
SysTick_Config(xc_clock_hfclk_in_get( ) / 100);
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
}
void app_uart_init(void)
{
GPIO_InitCfg_t gpio_cfg = {0};
gpio_cfg.Mux = GPIO_Mux0;
gpio_cfg.Pull = GPIO_PULLUP;
gpio_cfg.Int = NOT_INT;
gpio_cfg.FunSel = UART0_TX;
gpio_cfg.Pin = GPIO_18;
gpio_cfg.Dir = GPIO_DIR_OUTPUT;
xc_gpio_init(&gpio_cfg);
gpio_cfg.FunSel = UART0_RX;
gpio_cfg.Pin = GPIO_19;
gpio_cfg.Dir = GPIO_DIR_INPUT;
xc_gpio_init(&gpio_cfg);
UART_InitCfg_t uart_cfg = {0};
uart_cfg.Parity = UART_PARITY_DISABLE;
uart_cfg.StopBits = UART_STOP_1_BITS;
uart_cfg.WordLength = UART_DATA_8_BITS;
uart_cfg.BaudRate = UART_BAUDRATE_115200;
uart_cfg.HardwareFlowControl = UART_HWFC_DISABLE;
xc_uart_init(UART0_IDX, &uart_cfg);
}
/**
* @brief main
* @details
* @param[in] void
* @param[out] void
* @retval int - 0
* @retval void
* @par identifier
* reserve
* @par other
* void
* @par change log
* Alex created on 2023-05-31
*/
int main(void)
{
// Clock Initialization
clock_init();
app_uart_init();
DEBUG("__START__\n");
/* uart demo */
#if UART_DMA_TX_DEMO
uart_dma_tx_demo( );
#elif UART_DMA_PRINT_DEMO
uart_dma_print_demo( );
#endif
while(1)
{
/* main loop */
;
}
}
@@ -0,0 +1,344 @@
/*!
* \file uart_dma_tx.c
*
* \brief Target uart dma tx implementation
*
* \copyright Revised BSD License, see section \ref LICENSE.
*
* \code
*
* _ __ _ ________ _
* | |/ /(_)___ / ____/ /_ (_)___
* | // / __ \/ / / __ \/ / __ \
* / |/ / / / / /___/ / / / / /_/ /
* /_/|_/_/_/ /_/\____/_/ /_/_/ .___/
* /_/
* (C) 2022-2025 XinChip
*
* \endcode
*
* \author ( XinChip ) Alex-J
*
* \author ( XinChip )
*/
/*-----------------------------------------------------------------------------------
INCLUDE HEADE FILES
------------------------------------------------------------------------------------*/
#include "uart_dma_tx.h"
#include "xc_drv_uart.h"
/*------------------------------------------------------------------------------------
Macros
-------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------
Global Variables
-------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------
Functions
-------------------------------------------------------------------------------------*/
/**
* @brief uart_dma_tx_demo
* @details
* @param void
* @retval void
*/
void uart_dma_tx_demo(void)
{
DEBUG("__UART_DMA_TX_DEMO__\n");
uint8_t txbuff[27];
uint8_t uart_handle = UART1_IDX;
if(uart_handle == UART1_IDX)
{
GPIO_InitCfg_t gpio_cfg = {0};
gpio_cfg.Mux = GPIO_Mux0;
gpio_cfg.Pull = GPIO_PULLUP;
gpio_cfg.Int = NOT_INT;
gpio_cfg.Pin = GPIO_14;
gpio_cfg.Dir = GPIO_DIR_OUTPUT;
gpio_cfg.FunSel = UART1_TX;
xc_gpio_init( &gpio_cfg );
gpio_cfg.Pin = GPIO_15;
gpio_cfg.Dir = GPIO_DIR_INPUT;
gpio_cfg.FunSel = UART1_RX;
xc_gpio_init( &gpio_cfg );
UART_InitCfg_t uart_cfg={0};
uart_cfg.Parity = UART_PARITY_DISABLE;
uart_cfg.StopBits = UART_TCR_STOP_1BITS;
uart_cfg.WordLength = UART_DATA_8_BITS;
uart_cfg.BaudRate = UART_BAUDRATE_921600;//UART_BAUDRATE_115200;
uart_cfg.HardwareFlowControl = UART_HWFC_DISABLE;
xc_uart_init( uart_handle, &uart_cfg );
}
NVIC_EnableIRQ(DMA_IRQn);
for(int i=0; i<26; i++)
{
txbuff[i] = i+'A';
}
txbuff[26] = '\n';
xc_dma_init( );
xc_uart_dma_send(uart_handle, DMA_CHANNEL1, sizeof(txbuff), txbuff);
while(!uart1_tx_tfr_flag);
xc_uart_dma_send(uart_handle, DMA_CHANNEL1, sizeof(txbuff), txbuff);
while(!uart1_tx_tfr_flag);
xc_uart_dma_send(uart_handle, DMA_CHANNEL1, sizeof(txbuff), txbuff);
while(1)
{
}
}
/**
================================================================================================================================================
uart dma printf
================================================================================================================================================
**/
/*------------------------------------------------------------------------------------
Global Variables
-------------------------------------------------------------------------------------*/
uint8_t data_buf[DATA_BUFFER_SIZE];
Fifo_t dma_print_fifo;
Fifo_t *fifo = &dma_print_fifo;
volatile bool uart_print_tfr_flag = true;
/*------------------------------------------------------------------------------------
Functions
-------------------------------------------------------------------------------------*/
/**
* @brief
* @details
* @param void
* @retval void
*/
void fifo_create(Fifo_t *pfifo, uint8_t *buffer, uint16_t buff_size)
{
if ((pfifo == NULL) || (buffer == NULL) || (buff_size == 0)) {
return;
}
pfifo->buffer = buffer;
pfifo->size = buff_size;
pfifo->is_full = 0;
pfifo->p_read = 0;
pfifo->p_write = 0;
}
/**
* @brief
* @details
* @param void
* @retval void
*/
uint16_t fifo_writeable_item_count(Fifo_t *pfifo)
{
if(pfifo->is_full) {
return 0;
} else {
if((pfifo->p_read == 0) && (pfifo->p_write ==0)) {
return pfifo->size;
} else {
return (pfifo->size - pfifo->p_write);
}
}
}
/**
* @brief
* @details
* @param void
* @retval void
*/
bool fifo_write_batch(Fifo_t *pfifo, uint8_t *data, uint16_t data_len)
{
memcpy((char *)(pfifo->buffer + pfifo->p_write), data, data_len);
pfifo->p_write += data_len;
return true;
}
/**
* @brief
* @details
* @param void
* @retval void
*/
uint16_t fifo_readable_item_count(Fifo_t *pfifo)
{
return (pfifo->size + pfifo->p_write - pfifo->p_read) % pfifo->size;
}
/**
* @brief
* @details
* @param void
* @retval void
*/
void app_uart_dma_init(void)
{
uint8_t uart_handle = UART1_IDX;
if(uart_handle == UART1_IDX)
{
GPIO_InitCfg_t gpio_cfg = {0};
gpio_cfg.Mux = GPIO_Mux0;
gpio_cfg.Pull = GPIO_PULLUP;
gpio_cfg.Int = NOT_INT;
gpio_cfg.Pin = GPIO_14;
gpio_cfg.Dir = GPIO_DIR_OUTPUT;
gpio_cfg.FunSel = UART1_TX;
xc_gpio_init( &gpio_cfg );
gpio_cfg.Pin = GPIO_15;
gpio_cfg.Dir = GPIO_DIR_INPUT;
gpio_cfg.FunSel = UART1_RX;
xc_gpio_init( &gpio_cfg );
UART_InitCfg_t uart_cfg={0};
uart_cfg.Parity = UART_PARITY_DISABLE;
uart_cfg.StopBits = UART_TCR_STOP_1BITS;
uart_cfg.WordLength = UART_DATA_8_BITS;
uart_cfg.BaudRate = UART_BAUDRATE_921600; //UART_BAUDRATE_115200;
uart_cfg.HardwareFlowControl = UART_HWFC_DISABLE;
xc_uart_init(uart_handle, &uart_cfg);
}
fifo_create(fifo, data_buf, DATA_BUFFER_SIZE);
NVIC_EnableIRQ(DMA_IRQn);
xc_dma_init( );
xc_uart_dma_tx_config(uart_handle, DMA_CHANNEL1, DATA_BUFFER_SIZE, fifo->buffer);
}
/**
* @brief
* @details
* @param void
* @retval void
*/
__RAM_CODE void uart_dma_print_callback(uint8_t eCode)
{
uint16_t trans_len = dma_ctl_h__block_ts__getf(1);
xc_dma_disable( );
fifo->p_read += trans_len;
if(fifo->p_read != fifo->p_write) {
uart_print_tfr_flag = false;
xc_uart_dma_trans(fifo_readable_item_count(fifo),
(uint8_t *)(fifo->buffer+fifo->p_read));
} else {
fifo->p_read = 0;
fifo->p_write = 0;
fifo->is_full = false;
uart_print_tfr_flag = true;
}
}
/**
* @brief
* @details
* @param void
* @retval void
*/
__RAM_CODE void xc_uart_dma_trans(uint16_t tx_size, uint8_t *tx_buff)
{
uint8_t errorCode;
dma_ctl_h__block_ts__setf(1, tx_size);
dma_sar_set(1, (uint32_t)tx_buff);
xc_dma_enable( );
errorCode = xc_dma_start_transfer(DMA_CHANNEL1, uart_dma_print_callback);
if(errorCode != 0) {
DEBUG("\nERROR: Failed Uart DMA_StartTransfer Tx\n");
}
}
/**
* @brief
* @details
* @param void
* @retval void
*/
__RAM_CODE int uart_dma_print(const char *format, ...)
{
va_list arg;
static char SendBuff[512] = { 0 };
int rv;
va_start(arg, format);
rv = vsnprintf((char*)SendBuff, sizeof(SendBuff), (char*)format, arg);
va_end(arg);
if(fifo_writeable_item_count(fifo) < rv) {
fifo->is_full = true;
if(uart_print_tfr_flag == true) {
uart_print_tfr_flag = false;
xc_uart_dma_trans(fifo_readable_item_count(fifo),
(uint8_t *)(fifo->buffer+fifo->p_read));
}
while(!uart_print_tfr_flag);
}
// GLOBAL_INT_DISABLE();
fifo_write_batch(fifo, (uint8_t *)SendBuff, rv);
// GLOBAL_INT_RESTORE();
if(uart_print_tfr_flag == true) {
uart_print_tfr_flag = false;
xc_uart_dma_trans(fifo_readable_item_count(fifo),
(uint8_t *)(fifo->buffer+fifo->p_read));
}
return rv;
}
/**
* @brief uart_dma_print_demo
* @details
* @param void
* @retval void
*/
void uart_dma_print_demo(void)
{
app_uart_dma_init( );
uart_dma_print("__UART_DMA_PRINT_DEMO__\n");
uart_dma_print("Date %u-%d-%d\n", 2024, 1, 25);
uart_dma_print("__UART_DMA_PRINT_STRAT__\n");
for(uint16_t i=1; i<2000; i++) {
uart_dma_print("__UART_DMA_PRINT_%05d__\n", i);
}
uart_dma_print("__UART_DMA_PRINT_OVER__\n");
while(1) {
;
}
}