[PSOC™] 【英飞凌PSOC 4000T DIY】开箱与环境搭建

[复制链接]
 楼主| 南来之风 发表于 2025-4-12 11:44 | 显示全部楼层 |阅读模式
<
本帖最后由 南来之风 于 2025-4-12 11:44 编辑

非常感谢英飞凌与21ic联合赠送的PSOC™ 4000T Multi-Sense Kit,这是一个完整的触摸方案验证原型,包含了接触、隔空和液体等多种应用场景。


官网资料介绍:CY8CPROTO-040T-MS PSOC™ 4000T Multi-Sense Prototyping Kit
https://www.infineon.com/cms/cn/product/evaluation-boards/cy8cproto-040t-ms/#!designsupport

三块触摸模块:2按键、4按键与悬浮触控


主控板:


参数信息        CY8CPROTO-040T-MS蓝牙标准          无
电容式感应技术     按键(悬停触摸)、金属表面触摸、液位传感器
内核            ARM Cortex - M0+
器件            CY8C4046LQI-T452
系列            赛普拉斯(PSoC™)4000T 微控制器
特性            电感式感应、液位感应、悬停触摸、金属表面触摸、可扩展的引脚头,用于定制人机界面(HMI)板
编程器 / 调试器     板载 KitProg
传感器           电容式、电感式、液位传感器
软件支持          ModusToolbox


开发环境的安装从ModusToolBox工具箱开始:


在创建项目的时候,选择本次活动板卡:CY8CPROTO-040T-MS



本次体验直奔主题“触摸”,选择4按键扩展板触摸demo:


之后需要从Git上克隆项目到本地,如果遇到下载错误,可以参考英飞凌社区的帖子:
ModusToolbox URL Modifier https://community.infineon.com/t5/Code-Examples/ModusToolbox-URL-Modifier/m-p/366015#.

等待项目下载,点击小锤子图标进行编译
  1. ==============================================================================
  2. = Build complete =
  3. ==============================================================================

  4. Calculating memory consumption: CY8C4046LQI-T452 GCC_ARM


  5.    ----------------------------------------------------
  6.   | Section Name         |  Address      |  Size       |
  7.    ----------------------------------------------------
  8.   | .text                |  0x00000000   |  24184      |
  9.   | .ARM.exidx           |  0x00005e78   |  8          |
  10.   | .copy.table          |  0x00005e80   |  12         |
  11.   | .zero.table          |  0x00005e8c   |  8          |
  12.   | .ramVectors          |  0x20000000   |  192        |
  13.   | .data                |  0x200000c0   |  1252       |
  14.   | .noinit              |  0x200005a8   |  32         |
  15.   | .bss                 |  0x200005c8   |  900        |
  16.   | .heap                |  0x2000094c   |  4788       |
  17.   | .stack               |  0x20001c00   |  1024       |
  18.    ----------------------------------------------------

  19.   Total Internal Flash (Available)          65536      
  20.   Total Internal Flash (Utilized)           25464      


  21. 09:53:25 Build Finished. 0 errors, 0 warnings. (took 51s.833ms)

连接硬件

在设备->端口,查看是否有KitProg3设备


主要代码分析:通过调用cybsp_init()来初始化设备与板载外设。
  1. cy_rslt_t cybsp_init(void)
  2. {
  3.     cy_rslt_t result = CY_RSLT_SUCCESS;

  4.     #if defined(CY_USING_HAL)
  5.     result = cyhal_hwmgr_init();

  6.     if (CY_RSLT_SUCCESS == result)
  7.     {
  8.         result = cyhal_syspm_init();
  9.     }
  10.     #ifdef CY_CFG_PWR_VDDA_MV
  11.     if (CY_RSLT_SUCCESS == result)
  12.     {
  13.         cyhal_syspm_set_supply_voltage(CYHAL_VOLTAGE_SUPPLY_VDDA, CY_CFG_PWR_VDDA_MV);
  14.     }
  15.     #endif
  16.     #endif // if defined(CY_USING_HAL)

  17.     init_cycfg_all();

  18.     if (CY_RSLT_SUCCESS == result)
  19.     {
  20.         #if defined(CYBSP_CUSTOM_SYSCLK_PM_CALLBACK)
  21.         result = cybsp_register_custom_sysclk_pm_callback();
  22.         #else
  23.         result = cybsp_register_sysclk_pm_callback();
  24.         #endif
  25.     }

  26.     return result;
  27. }

代码里有初始化tuner模块,通过调用initialize_capsense_tuner()。这里应该是有一个电容触摸调试的功能。

接下来初始化电容触摸模块:
  1.     /* Initialize MSC CAPSENSE™ */
  2.     initialize_capsense();

  3.     /* Measures the actual ILO frequency and compensate MSCLP wake up timers */
  4.     Cy_CapSense_IloCompensate(&cy_capsense_context);

  5.     /* Configure the MSCLP wake up timer as per the ACTIVE mode refresh rate */
  6.     Cy_CapSense_ConfigureMsclpTimer(ACTIVE_MODE_TIMER, &cy_capsense_context);

之后有个for循环来根据是否在TimeOut时间内检测到触摸等分成了三个状态:ACTIVE_MODEALR_MODE (Active Low Refresh-rate ModeWOT_MODE (Wake On Touch Mode
  1. for (;;)
  2.     {
  3.         switch(capsense_state)
  4.         {
  5.             case ACTIVE_MODE:

  6.                 Cy_CapSense_ScanAllSlots(&cy_capsense_context);

  7.                 interruptStatus = Cy_SysLib_EnterCriticalSection();

  8.                 while (Cy_CapSense_IsBusy(&cy_capsense_context))
  9.                 {
  10.                     Cy_SysPm_CpuEnterDeepSleep();

  11.                     Cy_SysLib_ExitCriticalSection(interruptStatus);

  12.                     /* This is a place where all interrupt handlers will be executed */
  13.                     interruptStatus = Cy_SysLib_EnterCriticalSection();
  14.                 }

  15.                 Cy_SysLib_ExitCriticalSection(interruptStatus);

  16. #if ENABLE_RUN_TIME_MEASUREMENT
  17.                 active_processing_time=0;
  18.                 start_runtime_measurement();
  19. #endif

  20.                 Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);

  21.                 /* Scan, process and check the status of the all Active mode sensors */
  22.                 if(Cy_CapSense_IsAnyWidgetActive(&cy_capsense_context))
  23.                 {
  24.                     capsense_state_timeout = ACTIVE_MODE_TIMEOUT;
  25.                 }
  26.                 else
  27.                 {
  28.                     capsense_state_timeout--;

  29.                     if(TIMEOUT_RESET == capsense_state_timeout)
  30.                     {
  31.                         capsense_state = ALR_MODE;
  32.                         capsense_state_timeout = ALR_MODE_TIMEOUT;

  33.                         /* Configure the MSCLP wake up timer as per the ALR mode refresh rate */
  34.                         Cy_CapSense_ConfigureMsclpTimer(ALR_MODE_TIMER, &cy_capsense_context);
  35.                     }
  36.                 }

  37. #if ENABLE_RUN_TIME_MEASUREMENT
  38.                 active_processing_time=stop_runtime_measurement();
  39. #endif

  40.                 break;
  41.                 /* End of ACTIVE_MODE */

  42.                 /* Active Low Refresh-rate Mode */
  43.             case ALR_MODE :

  44.                 Cy_CapSense_ScanAllSlots(&cy_capsense_context);

  45.                 interruptStatus = Cy_SysLib_EnterCriticalSection();

  46.                 while (Cy_CapSense_IsBusy(&cy_capsense_context))
  47.                 {
  48.                     Cy_SysPm_CpuEnterDeepSleep();

  49.                     Cy_SysLib_ExitCriticalSection(interruptStatus);

  50.                     /* This is a place where all interrupt handlers will be executed */
  51.                     interruptStatus = Cy_SysLib_EnterCriticalSection();
  52.                 }

  53.                 Cy_SysLib_ExitCriticalSection(interruptStatus);

  54. #if ENABLE_RUN_TIME_MEASUREMENT
  55.                 alr_processing_time=0;
  56.                 start_runtime_measurement();
  57. #endif

  58.                 Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);

  59.                 /* Scan, process and check the status of the all Active mode sensors */
  60.                 if(Cy_CapSense_IsAnyWidgetActive(&cy_capsense_context))
  61.                 {
  62.                     capsense_state = ACTIVE_MODE;
  63.                     capsense_state_timeout = ACTIVE_MODE_TIMEOUT;

  64.                     /* Configure the MSCLP wake up timer as per the ACTIVE mode refresh rate */
  65.                     Cy_CapSense_ConfigureMsclpTimer(ACTIVE_MODE_TIMER, &cy_capsense_context);
  66.                 }
  67.                 else
  68.                 {
  69.                     capsense_state_timeout--;

  70.                     if(TIMEOUT_RESET == capsense_state_timeout)
  71.                     {
  72.                         capsense_state = WOT_MODE;

  73.                     }
  74.                 }

  75. #if ENABLE_RUN_TIME_MEASUREMENT
  76.                 alr_processing_time=stop_runtime_measurement();
  77. #endif

  78.                 break;
  79.                 /* End of Active-Low Refresh Rate(ALR) mode */

  80.                 /* Wake On Touch Mode */
  81.             case WOT_MODE :

  82.                 Cy_CapSense_ScanAllLpSlots(&cy_capsense_context);

  83.                 interruptStatus = Cy_SysLib_EnterCriticalSection();

  84.                 while (Cy_CapSense_IsBusy(&cy_capsense_context))
  85.                 {
  86.                     Cy_SysPm_CpuEnterDeepSleep();

  87.                     Cy_SysLib_ExitCriticalSection(interruptStatus);

  88.                     /* This is a place where all interrupt handlers will be executed */
  89.                     interruptStatus = Cy_SysLib_EnterCriticalSection();
  90.                 }

  91.                 Cy_SysLib_ExitCriticalSection(interruptStatus);

  92.                 if (Cy_CapSense_IsAnyLpWidgetActive(&cy_capsense_context))
  93.                 {
  94.                     capsense_state = ACTIVE_MODE;
  95.                     capsense_state_timeout = ACTIVE_MODE_TIMEOUT;

  96.                     /* Configure the MSCLP wake up timer as per the ACTIVE mode refresh rate */
  97.                     Cy_CapSense_ConfigureMsclpTimer(ACTIVE_MODE_TIMER, &cy_capsense_context);
  98.                 }
  99.                 else
  100.                 {
  101.                     capsense_state = ALR_MODE;
  102.                     capsense_state_timeout = ALR_MODE_TIMEOUT;

  103.                     /* Configure the MSCLP wake up timer as per the ALR mode refresh rate */
  104.                     Cy_CapSense_ConfigureMsclpTimer(ALR_MODE_TIMER, &cy_capsense_context);
  105.                 }

  106.                 break;
  107.                 /* End of "WAKE_ON_TOUCH_MODE" */

  108.             default:
  109.                 /**  Unknown power mode state. Unexpected situation.  **/
  110.                 CY_ASSERT(CY_ASSERT_FAILED);
  111.                 break;
  112.         }
  113. #if ENABLE_LED
  114.         led_control();
  115. #endif

  116. #if ENABLE_TUNER
  117.         /* Establishes synchronized communication with the CAPSENSE™ Tuner tool */
  118.         Cy_CapSense_RunTuner(&cy_capsense_context);
  119. #endif
  120.     }

之后根据4个按键的状态来点亮或者熄灭扩展板上的4个LED。
  1. void led_control()
  2. {

  3.     if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON0_WDGT_ID, &cy_capsense_context))
  4.     {
  5.         Cy_GPIO_Write(CYBSP_KEYPAD_LED1_PORT, CYBSP_KEYPAD_LED1_NUM, CYBSP_LED_ON);
  6.     }
  7.     else
  8.     {
  9.         Cy_GPIO_Write(CYBSP_KEYPAD_LED1_PORT, CYBSP_KEYPAD_LED1_NUM, CYBSP_LED_OFF);
  10.     }

  11.     if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON1_WDGT_ID, &cy_capsense_context))
  12.     {
  13.         Cy_GPIO_Write(CYBSP_KEYPAD_LED2_PORT, CYBSP_KEYPAD_LED2_NUM, CYBSP_LED_ON);
  14.     }
  15.     else
  16.     {
  17.         Cy_GPIO_Write(CYBSP_KEYPAD_LED2_PORT, CYBSP_KEYPAD_LED2_NUM, CYBSP_LED_OFF);
  18.     }

  19.     if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON2_WDGT_ID, &cy_capsense_context))
  20.     {
  21.         Cy_GPIO_Write(CYBSP_KEYPAD_LED3_PORT, CYBSP_KEYPAD_LED3_NUM, CYBSP_LED_ON);
  22.     }
  23.     else
  24.     {
  25.         Cy_GPIO_Write(CYBSP_KEYPAD_LED3_PORT, CYBSP_KEYPAD_LED3_NUM, CYBSP_LED_OFF);
  26.     }

  27.     if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON3_WDGT_ID, &cy_capsense_context))
  28.     {
  29.         Cy_GPIO_Write(CYBSP_KEYPAD_LED4_PORT, CYBSP_KEYPAD_LED4_NUM, CYBSP_LED_ON);
  30.     }
  31.     else
  32.     {
  33.         Cy_GPIO_Write(CYBSP_KEYPAD_LED4_PORT, CYBSP_KEYPAD_LED4_NUM, CYBSP_LED_OFF);
  34.     }

  35. }

最后调试后全速运行:


看一下代码运行在PSCOC400T实物上:



整体开发感受是ModusToolbox生态非常完善,通过ToobBOx的Setup程序可以添加项目上用到的模块;通过Toolbox的IDE可以从官方GIT克隆样例程序,同时也内置了编译器、调试器等必须组件。

硬件做工配得上英飞凌全球微控制器领导者的形象,扎实,硬件布局合理,质量非常好。


下一步计划体验一下电容触摸调试模块的用法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
xhackerustc 发表于 2025-4-13 10:15 | 显示全部楼层
如果ModusToolbox能支持离线就更棒了。友商的的RASC、CubeMX都可以离线使用。
Amazingxixixi 发表于 2025-4-24 17:40 | 显示全部楼层
学习一下
申小林一号 发表于 2025-4-24 19:27 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

290

帖子

2

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

69

主题

290

帖子

2

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