感谢21IC平台提供NUCLEO-U3C5ZI评估机会,开发板做工十分精良,板载CAN接口,居然还有一M2存储接口,虽然当前用不上,也算是意外之喜。

拿到开发板子,首先用CubeMX配置一个简单的工程点灯跑起来来点儿信心,点亮很顺利。
接下来就要切入正题了,对于超多外设、超大内存的U3C5ZI来说,并行执行各种复杂任务势在必行,使用RTOS在所难免。CubeMX配置项目可以直接选择THREADX,这个RTOS认证很多,飞机汽车都可使用,本次评测就用这个操作系统打底了。
1、操作系统添加
CubeMX选择中间件里面的THREADX,然后要做些简单的配置,本次测试的配置如下图所示:
内存池管理要开起来,这个后面CMSIS-OS中间层要用。
 


2、调试串口
板载的ST-LINK连接在芯片的UART1上,用UART1做一个SHELL控制台方便调试打印,如下图所示,可以通过串口做运行时交互。
 


3、MODBUS
本次试验的重点来了,MODBUS主站和从站
USART2做主站,PA2-PA3
USART3做从站,PB10-PB11
两个串**叉相连后,两个站点可以通过MODBUS通信了。
PA2-PB11
PA3-PB10

调试过程中遇到一点小插曲,可能这颗芯片出来时间太短,官方库居然有个狗血的漏洞,USART2的时钟获取是缺失的,无论LL库还是HAL库都会获取失败,导致U2波特率设置错误,缺失如下所示。
 

 


我用LL库,修改如下就可以正常工作了。
 


MODBUS任务代码如下:

复制

 
  1. void qc_task(const void *argv)
  2. {
  3.     qc_cmd_type mcmd;
  4.     uu8 bdone;
  5.     /* 主站配置 */
  6.     modbus_master_init(QC_MODE_MASTER, 115200, MB_PAR_NONE);
  7.     modbus_master.os_event_send = mb_os_send;
  8.     modbus_master.extend = 0;
  9.    
  10.     /* 从站配置 */
  11.     modbus_slave_init(QC_MODE_SLAVE, 115200, MB_PAR_NONE);
  12.     modbus_slave.os_event_send = mb_os_send;
  13.         modbus_slave.extend = &qc_mb_slave_box;
  14.    
  15.     /* 命令配置 */
  16.     mcmd.id = 1;
  17.     mcmd.wdat = mb_tst.reg_w;
  18.     mcmd.rdat = mb_tst.reg_r;
  19.     mcmd.wa = word_make(0xF, 5);
  20.     mcmd.wn = 4;
  21.     mcmd.ra = word_make(0x00, 0x10);
  22.     mcmd.rn = 6;
  23.     mcmd.callback = qc_callback;
  24.     mcmd.attr = QC_MB_ATTR_HOLD_RW;
  25.     mqc_stc_cmd_req(&modbus_master, 0, &mcmd);
  26.     mqc_stc_cmd_req(&modbus_slave, 0, &mcmd);
  27.     mcmd.wa = word_make(0x10, 12);
  28.     mcmd.wn = 0;
  29.     mqc_stc_cmd_req(&modbus_master, 1, &mcmd);
  30.     mqc_stc_cmd_req(&modbus_slave, 1, &mcmd);
  31.     mcmd.wa = word_make(0x0C, 8);
  32.     mcmd.wn = 8;
  33.     mcmd.ra = word_make(0x0C, 8);
  34.     mcmd.rn = 8;
  35.     mcmd.wdat = mb_tst.reg_w;
  36.     mcmd.rdat = mb_tst.reg_r;
  37.     mcmd.attr = QC_MB_ATTR_HOLD_RW;
  38.     modbus_master.fun->stc_cmd_req(2, &mcmd);
  39.     mqc_dyna_cmd_req(&modbus_master, &mcmd);
  40.     mqc_dyna_cmd_req(&modbus_master, &mcmd);
  41.     /* 任务处理 */
  42.     for (;;)
  43.     {
  44.         osDelay(2);
  45.         if (modbus_master.com_st == QC_RX_END)
  46.         {
  47.             NOP1();
  48.         }
  49.         if (modbus_slave.com_st == QC_RX_END)
  50.         {
  51.             NOP1();
  52.         }
  53.         qc_mb_data_handle();
  54.        qc_mb_poll(&modbus_master);
  55.        qc_mb_poll(&modbus_slave);
  56.     }
  57. }

链接成功后,在调试状态可以观测两路MODBUS运行状态,一主一从如下:
 

 



下面附上代码链接,感兴趣的小伙伴可以一起研究:

复制

 
  1. https://gitee.com/open-instrument/NUCLEO-U3C5ZIQ

NUCLEO-U3C5ZIQ: NUCLEO-U3C5ZIQ 评估
 


---------------------
作者:aple0807
链接:https://bbs.21ic.com/icview-3521128-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐