- /* add user code begin Header */
 
- /**
 
-   **************************************************************************
 
-   * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
 
-   * [url=home.php?mod=space&uid=247401]@brief[/url]    main program
 
-   **************************************************************************
 
-   *                       Copyright notice & Disclaimer
 
-   *
 
-   * The software Board Support Package (BSP) that is made available to
 
-   * download from Artery official website is the copyrighted work of Artery.
 
-   * Artery authorizes customers to use, copy, and distribute the BSP
 
-   * software and its related documentation for the purpose of design and
 
-   * development in conjunction with Artery microcontrollers. Use of the
 
-   * software is governed by this copyright notice and the following disclaimer.
 
-   *
 
-   * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
 
-   * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
 
-   * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
 
-   * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
 
-   * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
 
-   * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
 
-   *
 
-   **************************************************************************
 
-   */
 
- /* add user code end Header */
 
 
- /* Includes ------------------------------------------------------------------*/
 
- #include "at32f423_wk_config.h"
 
 
- /* private includes ----------------------------------------------------------*/
 
- /* add user code begin private includes */
 
- #include <string.h>
 
- /* add user code end private includes */
 
 
- /* private typedef -----------------------------------------------------------*/
 
- /* add user code begin private typedef */
 
 
- /* add user code end private typedef */
 
 
- /* private define ------------------------------------------------------------*/
 
- /* add user code begin private define */
 
 
- /* add user code end private define */
 
 
- /* private macro -------------------------------------------------------------*/
 
- /* add user code begin private macro */
 
- #define MS_TICK         (system_core_clock / 8 / 1000U)
 
- #define TX_BUF_SIZE     100
 
- #define RX_BUF_SIZE     100
 
- /* add user code end private macro */
 
 
- /* private variables ---------------------------------------------------------*/
 
- /* add user code begin private variables */
 
- static volatile uint32_t sys_tick;
 
- uint8_t tx_buf[TX_BUF_SIZE];    /* uart 发送缓冲区 */
 
- volatile uint16_t tx_len;                /* uart 实际发送数据长度 */
 
- volatile uint8_t tx_flag;                /* uart 发送繁忙标志 */
 
- uint8_t rx_buf[RX_BUF_SIZE];    /* uart 接收缓冲区 */
 
- volatile uint16_t rx_len;                /* uart 实际接收数据长度 */
 
- volatile uint8_t rx_flag;                /* uart 接收完成标志 */
 
- static const char *start_msg = "The demo is started!\n";
 
- /* add user code end private variables */
 
 
- /* private function prototypes --------------------------------------------*/
 
- /* add user code begin function prototypes */
 
 
- /* add user code end function prototypes */
 
 
- /* private user code ---------------------------------------------------------*/
 
- /* add user code begin 0 */
 
- static void systick_init(void)
 
- {
 
-     SysTick_Config(MS_TICK);
 
-     systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_DIV8);
 
- }
 
 
- static void sys_tick_increament(void)
 
- {
 
-     sys_tick++;
 
- }
 
 
- uint32_t sys_tick_get(void)
 
- {
 
-     return sys_tick;
 
- }
 
 
- void SysTick_Handler(void)
 
- {
 
-   sys_tick_increament();
 
- }
 
- /* add user code end 0 */
 
 
 
- /**
 
-   * @brief  take some delay for waiting power stable, delay is about 60ms with frequency 8MHz.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- static void wk_wait_for_power_stable(void)
 
- {
 
-   volatile uint32_t delay = 0;
 
-   for(delay = 0; delay < 50000; delay++);
 
- }
 
 
- /**
 
-   * @brief main function.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- int main(void)
 
- {
 
-   /* add user code begin 1 */
 
-     uint32_t start_tick;
 
-   /* add user code end 1 */
 
 
-   /* add a necessary delay to ensure that Vdd is higher than the operating
 
-      voltage of battery powered domain (2.57V) when the battery powered 
 
-      domain is powered on for the first time and being operated. */
 
-   wk_wait_for_power_stable();
 
-   
 
-   /* system clock config. */
 
-   wk_system_clock_config();
 
 
-   /* config periph clock. */
 
-   wk_periph_clock_config();
 
 
-   /* nvic config. */
 
-   wk_nvic_config();
 
 
-   /* init dma1 channel1 */
 
-   wk_dma1_channel1_init();
 
-   /* config dma channel transfer parameter */
 
-   /* user need to modify parameters memory_base_addr and buffer_size */
 
-   wk_dma_channel_config(DMA1_CHANNEL1, (uint32_t)&USART1->dt, (uint32_t)rx_buf, RX_BUF_SIZE);
 
-   dma_channel_enable(DMA1_CHANNEL1, TRUE);
 
 
-   /* init dma1 channel2 */
 
-   wk_dma1_channel2_init();
 
-   /* config dma channel transfer parameter */
 
-   /* user need to modify parameters memory_base_addr and buffer_size */
 
-   wk_dma_channel_config(DMA1_CHANNEL2, (uint32_t)&USART1->dt, (uint32_t)start_msg, strlen(start_msg));
 
-   dma_channel_enable(DMA1_CHANNEL2, TRUE);
 
 
-   /* init usart1 function. */
 
-   wk_usart1_init();
 
 
-   /* init gpio function. */
 
-   wk_gpio_config();
 
 
-   /* add user code begin 2 */
 
-     systick_init();
 
-     
 
-     dma_interrupt_enable(DMA1_CHANNEL2, DMA_FDT_INT, TRUE); /* 打开 dma 发送完成中断 */
 
 
-     rx_len = RX_BUF_SIZE;                                   /* 设置接收的最大长度 */
 
-     dma_flag_clear(DMA1_FDT1_FLAG);                         /* 清除 uart dma 传输完成标志 */
 
-     usart_flag_clear(USART1, USART_IDLEF_FLAG);             /* 清除空闲中断标志 */
 
-     dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, TRUE); /* 打开 uart dma 接收完成中断 */
 
-     usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE);   /* 打开 uart 空闲中断 */
 
-     
 
-     start_tick = sys_tick_get();
 
-   /* add user code end 2 */
 
 
-   while(1)
 
-   {
 
-     /* add user code begin 3 */
 
-     if (rx_flag) {
 
-         rx_flag = 0;
 
-         
 
-         while (tx_flag == 0);                           /* 等待发送就绪 */
 
-         
 
-         if (rx_len) {
 
-             memcpy(tx_buf, rx_buf, rx_len);             /* 拷贝接收数据 */
 
-             /* 配置 DMA 发送*/
 
-             wk_dma_channel_config(DMA1_CHANNEL2, (uint32_t)&USART1->dt, (uint32_t)tx_buf, rx_len);
 
-             dma_interrupt_enable(DMA1_CHANNEL2, DMA_FDT_INT, TRUE); /* 打开 dma 发送完成中断 */
 
-             dma_channel_enable(DMA1_CHANNEL2, TRUE);                /* 启动 dma 通道传输 */
 
-             tx_flag = 0;                                /* 设置发送繁忙标志 */
 
-         }
 
- //        else {
 
- //            while (1);
 
- //        }
 
 
-         /* 重新启动 uart dma 接收 */
 
-         dma_flag_clear(DMA1_FDT1_FLAG);                         /* 清除 uart dma 传输完成标志 */
 
-         usart_flag_clear(USART1, USART_IDLEF_FLAG);             /* 清除空闲中断标志 */
 
-         dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, TRUE); /* 打开 uart dma 接收完成中断 */
 
-         usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE);   /* 打开 uart 空闲中断 */
 
-         rx_len = RX_BUF_SIZE;                                   /* 设置接收的最大长度 */
 
-         /* 重新配置 dma 接收参数 */
 
-         wk_dma_channel_config(DMA1_CHANNEL1, (uint32_t)&USART1->dt, (uint32_t)rx_buf, RX_BUF_SIZE);
 
-         dma_channel_enable(DMA1_CHANNEL1, TRUE);                /* 打开 dma 通道传输 */
 
-     }
 
-     
 
-     if (sys_tick_get() - start_tick >= 500) {                   /* 每隔 500 ms 翻转一次 LED */
 
-         start_tick = sys_tick_get();
 
-         gpio_bits_toggle(LED2_GPIO_PORT, LED2_PIN);
 
-         gpio_bits_toggle(LED3_GPIO_PORT, LED3_PIN);
 
-         gpio_bits_toggle(LED4_GPIO_PORT, LED4_PIN);
 
-     }
 
-     /* add user code end 3 */
 
-   }
 
- }
 
at32f423_int.c
- /* add user code begin Header */
 
- /**
 
-   **************************************************************************
 
-   * [url=home.php?mod=space&uid=288409]@file[/url]     at32f423_int.c
 
-   * [url=home.php?mod=space&uid=247401]@brief[/url]    main interrupt service routines.
 
-   **************************************************************************
 
-   *                       Copyright notice & Disclaimer
 
-   *
 
-   * The software Board Support Package (BSP) that is made available to
 
-   * download from Artery official website is the copyrighted work of Artery.
 
-   * Artery authorizes customers to use, copy, and distribute the BSP
 
-   * software and its related documentation for the purpose of design and
 
-   * development in conjunction with Artery microcontrollers. Use of the
 
-   * software is governed by this copyright notice and the following disclaimer.
 
-   *
 
-   * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
 
-   * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
 
-   * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
 
-   * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
 
-   * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
 
-   * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
 
-   *
 
-   **************************************************************************
 
-   */
 
- /* add user code end Header */
 
 
- /* includes ------------------------------------------------------------------*/
 
- #include "at32f423_int.h"
 
 
- /* private includes ----------------------------------------------------------*/
 
- /* add user code begin private includes */
 
 
- /* add user code end private includes */
 
 
- /* private typedef -----------------------------------------------------------*/
 
- /* add user code begin private typedef */
 
 
- /* add user code end private typedef */
 
 
- /* private define ------------------------------------------------------------*/
 
- /* add user code begin private define */
 
 
- /* add user code end private define */
 
 
- /* private macro -------------------------------------------------------------*/
 
- /* add user code begin private macro */
 
 
- /* add user code end private macro */
 
 
- /* private variables ---------------------------------------------------------*/
 
- /* add user code begin private variables */
 
 
- /* add user code end private variables */
 
 
- /* private function prototypes --------------------------------------------*/
 
- /* add user code begin function prototypes */
 
 
- /* add user code end function prototypes */
 
 
- /* private user code ---------------------------------------------------------*/
 
- /* add user code begin 0 */
 
 
- /* add user code end 0 */
 
 
- /* external variables ---------------------------------------------------------*/
 
- /* add user code begin external variables */
 
- extern volatile uint8_t tx_flag;
 
- extern volatile uint16_t rx_len;
 
- extern volatile uint8_t rx_flag;
 
- /* add user code end external variables */
 
 
- /**
 
-   * @brief  this function handles nmi exception.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void NMI_Handler(void)
 
- {
 
-   /* add user code begin NonMaskableInt_IRQ 0 */
 
 
-   /* add user code end NonMaskableInt_IRQ 0 */
 
 
-   /* add user code begin NonMaskableInt_IRQ 1 */
 
 
-   /* add user code end NonMaskableInt_IRQ 1 */
 
- }
 
 
- /**
 
-   * @brief  this function handles hard fault exception.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void HardFault_Handler(void)
 
- {
 
-   /* add user code begin HardFault_IRQ 0 */
 
 
-   /* add user code end HardFault_IRQ 0 */
 
-   /* go to infinite loop when hard fault exception occurs */
 
-   while (1)
 
-   {
 
-     /* add user code begin W1_HardFault_IRQ 0 */
 
 
-     /* add user code end W1_HardFault_IRQ 0 */
 
-   }
 
- }
 
 
- /**
 
-   * @brief  this function handles memory manage exception.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void MemManage_Handler(void)
 
- {
 
-   /* add user code begin MemoryManagement_IRQ 0 */
 
 
-   /* add user code end MemoryManagement_IRQ 0 */
 
-   /* go to infinite loop when memory manage exception occurs */
 
-   while (1)
 
-   {
 
-     /* add user code begin W1_MemoryManagement_IRQ 0 */
 
 
-     /* add user code end W1_MemoryManagement_IRQ 0 */
 
-   }
 
- }
 
 
- /**
 
-   * @brief  this function handles bus fault exception.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void BusFault_Handler(void)
 
- {
 
-   /* add user code begin BusFault_IRQ 0 */
 
 
-   /* add user code end BusFault_IRQ 0 */
 
-   /* go to infinite loop when bus fault exception occurs */
 
-   while (1)
 
-   {
 
-     /* add user code begin W1_BusFault_IRQ 0 */
 
 
-     /* add user code end W1_BusFault_IRQ 0 */
 
-   }
 
- }
 
 
- /**
 
-   * @brief  this function handles usage fault exception.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void UsageFault_Handler(void)
 
- {
 
-   /* add user code begin UsageFault_IRQ 0 */
 
 
-   /* add user code end UsageFault_IRQ 0 */
 
-   /* go to infinite loop when usage fault exception occurs */
 
-   while (1)
 
-   {
 
-     /* add user code begin W1_UsageFault_IRQ 0 */
 
 
-     /* add user code end W1_UsageFault_IRQ 0 */
 
-   }
 
- }
 
 
- /**
 
-   * @brief  this function handles svcall exception.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void SVC_Handler(void)
 
- {
 
-   /* add user code begin SVCall_IRQ 0 */
 
 
-   /* add user code end SVCall_IRQ 0 */
 
-   /* add user code begin SVCall_IRQ 1 */
 
 
-   /* add user code end SVCall_IRQ 1 */
 
- }
 
 
- /**
 
-   * @brief  this function handles debug monitor exception.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void DebugMon_Handler(void)
 
- {
 
-   /* add user code begin DebugMonitor_IRQ 0 */
 
 
-   /* add user code end DebugMonitor_IRQ 0 */
 
-   /* add user code begin DebugMonitor_IRQ 1 */
 
 
-   /* add user code end DebugMonitor_IRQ 1 */
 
- }
 
 
- /**
 
-   * @brief  this function handles pendsv_handler exception.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void PendSV_Handler(void)
 
- {
 
-   /* add user code begin PendSV_IRQ 0 */
 
 
-   /* add user code end PendSV_IRQ 0 */
 
-   /* add user code begin PendSV_IRQ 1 */
 
 
-   /* add user code end PendSV_IRQ 1 */
 
- }
 
 
- /**
 
-   * @brief  this function handles DMA1 Channel 1 handler.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void DMA1_Channel1_IRQHandler(void)
 
- {
 
-   /* add user code begin DMA1_Channel1_IRQ 0 */
 
-     if(dma_flag_get(DMA1_FDT1_FLAG)) {
 
-         rx_flag = 1; /* 标记接收到数据 */
 
 
-         /* 关闭 dma 通道,关闭中断 */
 
-         dma_channel_enable(DMA1_CHANNEL1, FALSE);
 
-         dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, FALSE);
 
-         usart_interrupt_enable(USART1, USART_IDLE_INT, FALSE);
 
-     }
 
-   /* add user code end DMA1_Channel1_IRQ 0 */
 
-   /* add user code begin DMA1_Channel1_IRQ 1 */
 
 
-   /* add user code end DMA1_Channel1_IRQ 1 */
 
- }
 
 
- /**
 
-   * @brief  this function handles DMA1 Channel 2 handler.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void DMA1_Channel2_IRQHandler(void)
 
- {
 
-   /* add user code begin DMA1_Channel2_IRQ 0 */
 
-     if(dma_flag_get(DMA1_FDT2_FLAG)) {
 
-         tx_flag = 1;                                                /* 设置发送就绪 */
 
 
-         dma_channel_enable(DMA1_CHANNEL2, FALSE);                   /* 关闭 dma 通道传输 */
 
-         dma_interrupt_enable(DMA1_CHANNEL2, DMA_FDT_INT, FALSE);    /* 关闭 dma 传输完成中断 */
 
-         dma_flag_clear(DMA1_FDT2_FLAG);                             /* 清除传输完成标志 */
 
-     }
 
-   /* add user code end DMA1_Channel2_IRQ 0 */
 
-   /* add user code begin DMA1_Channel2_IRQ 1 */
 
 
-   /* add user code end DMA1_Channel2_IRQ 1 */
 
- }
 
 
- /**
 
-   * @brief  this function handles USART1 handler.
 
-   * @param  none
 
-   * @retval none
 
-   */
 
- void USART1_IRQHandler(void)
 
- {
 
-   /* add user code begin USART1_IRQ 0 */
 
-     if(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET)
 
-     {
 
-         rx_flag = 1; /* 标记接收到数据 */
 
-         rx_len -= dma_data_number_get(DMA1_CHANNEL1); /* 计算实际接收到的数据长度 */
 
 
-         /* 关闭 dma 通道,关闭中断 */
 
-         dma_channel_enable(DMA1_CHANNEL1, FALSE);
 
-         dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, FALSE);
 
-         usart_interrupt_enable(USART1, USART_IDLE_INT, FALSE);
 
-     }
 
-   /* add user code end USART1_IRQ 0 */
 
-   /* add user code begin USART1_IRQ 1 */
 
 
-   /* add user code end USART1_IRQ 1 */
 
- }
 
 
- /* add user code begin 1 */
 
 
- /* add user code end 1 */
 
3、测试
可以看到,接收字节数 == 发送字节数
