[STM32U3] 【NUCLEO-U3C5ZI 测评】 MODBUS主站+从站

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

链接成功后,在调试状态可以观测两路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所有,任何人未经允许禁止转载。