[活动] 【APM32F411V Tiny Board测评】综合测试

[复制链接]
 楼主| aple0807 发表于 2024-6-10 23:00 | 显示全部楼层 |阅读模式
感谢论坛和极海提供的APM32F411-TINY开发板,通过两周的学习,对F411芯片的基础外设做了简单的测试。
1、RTOS
        本测试使用RTX操作系统,ARM针对M家族芯片做好了适配,选择对应的文件即可完成操作系统的添加。
        RTX的启动相对较为简单,代码如下:
  1. osKernelInitialize(); // Initialize CMSIS-RTOS
  2.        
  3.         thread_obj_init();
  4.        
  5.         thread_init();

  6.         if (osKernelGetState() == osKernelReady)
  7.         {
  8.                 osKernelStart(); // Start thread execution
  9.         }
2、串口控制台
        为方便人机交互,本测试工程添加了一组控制台程序,使用方法类似SHELL,可从串口输入命令来执行内部函数。控制台是一个独立的任务,串口使用板载调试器的串口进行连接,效果如下:打开串口输入SHELL -H可查看可用命令
SHELL.png
       
3、DMA 测试
        F411用有两组DMA模块,可以极大释放CPU占用率,提高系统运行速度。为了方便使用,本次测试封装了一组DMA接口:包含以下功能:
  1. /*******************************************************************************
  2.          * [url=home.php?mod=space&uid=247401]@brief[/url]  APP DMA type
  3.          *******************************************************************************/
  4.         typedef struct
  5.         {
  6.                 DMA_T *DMAx;                                                // DMA 模块
  7.                 DMA_Stream_T *stream;                            // DMA 数据流
  8.                 uint16_t ch_num;                                        // DMA 通道编号
  9.                 uint16_t trig_src;                                         // DMA 触发源
  10.                 IRQn_Type irqn;                                                // 中断号
  11.         } app_dma_type;

  12. #ifdef IN_DMA_MOUDLE
  13. #define dma_stream_make(name, dmax, ch, src) \
  14.         const app_dma_type name = {              \
  15.                 .DMAx = dmax,                        \
  16.                 .stream = dmax##_Stream##ch,       \
  17.                 .ch_num = ch,                        \
  18.                 .trig_src = src,                     \
  19.                 .irqn = dmax##_STR##ch##_IRQn}
  20. #else
  21. #define dma_stream_make(name, dmax, ch, src) \
  22.         extern const app_dma_type name
  23. #endif

  24.         /*******************************************************************************
  25.          * @brief  APP DMA CONFIG
  26.          *******************************************************************************/
  27.         dma_stream_make(DMA_U01_RX, DMA2, 2, 4);
  28.         dma_stream_make(DMA_U01_TX, DMA2, 7, 4);

  29.         dma_stream_make(DMA_U04_RX, DMA1, 2, 4);
  30.         dma_stream_make(DMA_U04_TX, DMA1, 4, 4);

  31.         dma_stream_make(DMA_U06_RX, DMA2, 1, 5);
  32.         dma_stream_make(DMA_U06_TX, DMA2, 6, 5);
  33.        
  34.         dma_stream_make(DMA_ADC, DMA2, 0, 0);

  35.         /*******************************************************************************
  36.          * @brief  中断回调注册
  37.          *******************************************************************************/
  38.         typedef struct
  39.         {
  40.                 void (*stream10)(void);
  41.                 void (*stream11)(void);
  42.                 void (*stream12)(void);
  43.                 void (*stream13)(void);
  44.                 void (*stream14)(void);
  45.                 void (*stream15)(void);
  46.                 void (*stream16)(void);
  47.                 void (*stream17)(void);
  48.                 void (*stream20)(void);
  49.                 void (*stream21)(void);
  50.                 void (*stream22)(void);
  51.                 void (*stream23)(void);
  52.                 void (*stream24)(void);
  53.                 void (*stream25)(void);
  54.                 void (*stream26)(void);
  55.                 void (*stream27)(void);
  56.         } dma_it_type;

  57.         extern dma_it_type dma_it;

  58.         /*******************************************************************************
  59.          * @brief  APP DMA API
  60.          *******************************************************************************/
  61.         void dma_nvic_set(const app_dma_type *dmax, uint32_t irq_en, void (*callback)(void));

  62.         /*******************************************************************************
  63.          * @brief  配置
  64.          *******************************************************************************/
  65.         typedef struct
  66.         {
  67.                 uint8_t mem_to_periph;
  68.                 uint8_t cycle_mode;
  69.                 uint8_t mem_inc, periph_inc;
  70.                 uint16_t data_len;
  71.                 DMA_PRIORITY_T prio;
  72.                 void *mem;
  73.                 volatile void *periph;
  74.         } dma_stream_cfg_type;

  75.         void dma_stream_config(const app_dma_type *dmax, dma_stream_cfg_type *cfg);
  76.         /*******************************************************************************
  77.          * @brief  获取传输完成标志
  78.          * \param[in] dma
  79.          * \retval:  0-No 1-Yes
  80.          *******************************************************************************/
  81.         __STATIC_INLINE uint32_t dma_comp_flag_get(const app_dma_type *dmax)
  82.         {
  83.                 int ch_num = dmax->ch_num;
  84.                 uint32_t bit_pos = ((ch_num % 4) / 2) * 16 + (ch_num % 2) * 6 + 5;

  85.                 return ((&(dmax->DMAx->LINTSTS))[ch_num / 4] >> bit_pos) & 1;
  86.         }

  87.         /*******************************************************************************
  88.          * @brief  清除传输完成标志
  89.          * \param[in] dma
  90.          * \retval:  0-No 1-Yes
  91.          *******************************************************************************/
  92.         __STATIC_INLINE void dma_comp_flag_clr(const app_dma_type *dmax)
  93.         {
  94.                 int ch_num = dmax->ch_num;
  95.                 uint32_t bit_pos = ((ch_num % 4) / 2) * 16 + (ch_num % 2) * 6 + 5;

  96.                 (&(dmax->DMAx->LIFCLR))[ch_num / 4] = 0x3DUL << bit_pos;
  97.         }

  98. /*******************************************************************************
  99. * @brief  库接口映射
  100. * \param[in] dma
  101. * \retval:  0-No 1-Yes
  102. *******************************************************************************/
  103. /* 反初始化 */
  104. #define dma_stream_deinit(dmax) DMA_Reset((dmax)->stream)

  105. /* 判断是否已使能DMA数据流 */
  106. #define is_dma_stream_enable(dmax) (dmax)->stream->SCFG_B.EN

  107. /* 使能DMA数据流 */
  108. #define dma_stream_enable(dmax) \
  109.         dma_comp_flag_clr(dmax);    \
  110.         DMA_Enable((dmax)->stream)

  111. /* 禁能DMA数据流 */
  112. #define dma_stream_disable(dmax) DMA_Disable((dmax)->stream)

  113. /* 设置DMA数据流RAM地址 */
  114. #define dma_stream_set_mem_addr(dmax, addr) (dmax)->stream->M0ADDR = (addr)

  115. /* 设置DMA数据流外设地址 */
  116. #define dma_stream_set_periph_addr(dmax, addr) (dmax)->stream->PADDR = (addr)

  117. /* 设置DMA数据流数据长度 */
  118. #define dma_stream_set_data_len(dmax, len) (dmax)->stream->NDATA = (len)

  119. /* 获取DMA数据流剩余传输长度 */
  120. #define dma_stream_get_data_len(dmax) (dmax)->stream->NDATA

  121. /* 使能数据流传输完成中断 */
  122. #define dma_stream_complete_isr_enable(dmax) (dmax)->stream->SCFG_B.TXCIEN = 1
封装后,DMA的使用更加方便,具体的使用参加控制台串口,该串口收发数据使用了DMA优化。

4、MODBUS测试
        本程序开通了4路MODBUS接口,分别使用UART2/3/4/6,其中U3/4做主站,U2/6做从站。
  1.   // master config
  2.         qc03_Init(QC_MODE_MASTER, 115200, MB_PAR_NONE);
  3.         mb.qc03.os_event_send = mb3_os_event_send;
  4.         qc04_Init(QC_MODE_MASTER, 19200, MB_PAR_NONE);
  5.         mb.qc04.os_event_send = mb3_os_event_send;
  6.        
  7.         mcmd.id = 1;
  8.         mcmd.wdat = &mb_input[0].uval;
  9.         mcmd.rdat = &mb_input[0].uval;
  10.         mcmd.wa = 0;
  11.         mcmd.wn = 96;
  12.         mcmd.ra = 0x1800;
  13.         mcmd.rn = 1;
  14.         mcmd.callback = qc_callback;
  15.         mcmd.attr = QC_MB_ATTR_HOLD_MW;
  16.         mqc_stc_cmd_req(&mb.qc03, 0, &mcmd);
  17.         mqc_stc_cmd_req(&mb.qc04, 0, &mcmd);
  18.        
  19.         mcmd.wdat = &mb_input[0].uval;
  20.         mcmd.wa = 96;
  21.         mcmd.wn = 96;
  22.         mqc_stc_cmd_req(&mb.qc03, 1, &mcmd);
  23.         mqc_stc_cmd_req(&mb.qc04, 0, &mcmd);
  24.        
  25.         // slave config
  26.         qc02_Init(QC_MODE_SLAVE, 115200, MB_PAR_NONE);
  27.         mb.qc02.os_event_send = mb2_os_event_send;
  28.        
  29.         qc06_Init(QC_MODE_SLAVE, 19200, MB_PAR_NONE);
  30.         mb.qc06.os_event_send = mb8_os_event_send;
  31.        
  32.         mcmd.id = 1;
  33.         mcmd.wdat = &mb_input[0].uval;
  34.         mcmd.rdat = &mb_input[0].uval;
  35.         mcmd.wa = 16;
  36.         mcmd.wn = 16;
  37.         mcmd.ra = 0;
  38.         mcmd.rn = 8;
  39.         mcmd.callback = qc_callback;
  40.         mcmd.attr = QC_MB_ATTR_HOLD_MW;
  41.        
  42.         mqc_stc_cmd_req(&mb.qc02, 0, &mcmd);
  43.         mqc_stc_cmd_req(&mb.qc02, 1, &mcmd);
  44.         mqc_stc_cmd_req(&mb.qc06, 0, &mcmd);
  45.         mqc_stc_cmd_req(&mb.qc06, 1, &mcmd);
连接U4和U6可以进行通信,调试状态测试结果如下
MODBUS.png
       
5、SPI测试

        SPI接口外接SPI-FLASH进行测试:
        SPI 配置如下
  1.   SPI_Config_T cfg;
  2.         intx_alloc();

  3.         // 开启时钟
  4.         intx_disable();

  5.         RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1);
  6.         RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_SPI1);
  7.         RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_SPI1);

  8.         intx_enable();

  9.         // SPI 配置
  10.         cfg.direction = SPI_DIRECTION_2LINES_FULLDUPLEX;
  11.         cfg.baudrateDiv = SPI_BAUDRATE_DIV_16;
  12.         cfg.mode = SPI_MODE_MASTER;
  13.         cfg.length = SPI_DATA_LENGTH_8B;
  14.         cfg.firstBit = SPI_FIRSTBIT_MSB;
  15.         cfg.nss = SPI_NSS_SOFT;
  16.         cfg.polarity = SPI_CLKPOL_LOW;
  17.         cfg.phase = SPI_CLKPHA_1EDGE;
  18.         cfg.crcPolynomial = 0;

  19.         SPI_Config(NOR_SPI, &cfg);

  20.         NOR_SPI->CTRL1_B.SPIEN = 1;

  21.         nor_spi_cs(0);

  22.         nor_spi_rb();

  23.         nor_spi_cs(1);

  24.         b_io_q_mode = 0;
在控制台输入FLASH测试命令:nor check  4 对FLASH写入4MB数据并读取验证,如下图所示:
FLASH.png

下面附上测试代码,有兴趣的小伙伴可下载研究交流:
APM32F411-TINY.rar (8.77 MB, 下载次数: 8)
       

星辰大海不退缩 发表于 2024-6-22 21:35 | 显示全部楼层
综合测试都有哪些具体需要注意的地方呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

77

主题

326

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部