[PSOC™] 【英飞凌PSOC 4000T DIY】上手体验耀眼特性

[复制链接]
 楼主| jobszheng 发表于 2025-5-23 02:29 | 显示全部楼层 |阅读模式
<
本帖最后由 jobszheng 于 2025-5-23 10:09 编辑

【英飞凌PSOC 4000T DIY】上手体验耀眼特性
在进入DIY之前,我们必须熟悉我们的MCU,开发板,熟悉其特性与优势。我们将PSOC 4000T Multi-Sense原型开发套件设计为前端触摸采集面板。我们需要实现PSOC 4000T MS的触摸按键,实现悬停按键实验与串口数据交互实验。
我们借助英飞凌官方代码生成工具ModusToolBox来生成我们的PSOC 4000T MS的基础底层代码。我使用了Eclipse IDE for ModusToolBox来编译我们的代码。
触摸按键实验
在ModusToolBox工具软件中新建 -> 选择PSOC 4000T MS T452工程后,软件会自己从github.com中拉取工程代码下来。居然直接完成工程的搭建与示例的基础代码的实现,然后直接编译下载到开发板。全速运行之后就可以实现触摸按键的功能了,给大家做了一个GF动画的演示。注意,在示例上我可是洒了少量水哟~~

悬停触摸实验
本实验我们依然使用英飞凌官方的ModusToolBox工具软件,这次选择hove-touch示例工程,等待一些时间,待工程全部pull下来后即可实现悬停触摸的示例演示了。本次实验展示了英飞凌强大的隔空检测技术,在测试过程中触摸准确度相当高!

串口接收与发送实验
英飞凌官方提供了UART的发送与接收实验,但是我通过查看源代码发现其仅为测试代码。它的Uart的接收采用了查询的方式,这种方式我们在常规项目应用里边几乎很少使用。所以。我们要将其应用为使用查询方式发送,使用中断方式接收。再配合PSOC 4000T的串口16字节的接收FIFO,有效减少系统被中断“打断”的次数,提升系统的综合性能。我这里先简单演示一下官方实验。可以看到,串口可以正常接收并发送接收到的数据,实现了简单的echo功能演示。
英飞凌的PDL外设驱动库在串口外设功能实现中支持ring buffer模式的接收,不支持用户自行处理的方式,所以我们也使用其官方的PDL库来实现,但思来想去,学习RingBuffer的方式无法实现帧尾空闲的中断处理。于是,还是使用的普通的单次中断触发的方式。
英飞凌PSOC 4000T支持多种接收中断,阅读官方手册与PDL驱动库可以看到有多种中断可以使用,如下所示:
  1. #define         CY_SCB_RX_INTR_LEVEL   SCB_INTR_RX_TRIGGER_Msk
  2.          The number of data elements in the RX FIFO is greater than the value of the RX FIFO level.
  3. #define         CY_SCB_RX_INTR_NOT_EMPTY   SCB_INTR_RX_NOT_EMPTY_Msk
  4.          The RX FIFO is not empty.
  5. #define         CY_SCB_RX_INTR_FULL   SCB_INTR_RX_FULL_Msk
  6.          The RX FIFO is full.
  7. #define         CY_SCB_RX_INTR_OVERFLOW   SCB_INTR_RX_OVERFLOW_Msk
  8.          An attempt to write to a full RX FIFO.
  9. #define         CY_SCB_RX_INTR_UNDERFLOW   SCB_INTR_RX_UNDERFLOW_Msk
  10.          An attempt to read from an empty RX FIFO.
  11. #define         CY_SCB_RX_INTR_BAUD_DETECT   SCB_INTR_RX_BAUD_DETECT_Msk
  12.          LIN baudrate detection is completed.
  13. #define         CY_SCB_RX_INTR_UART_FRAME_ERROR   SCB_INTR_RX_FRAME_ERROR_Msk
  14.          A UART framing error detected.
  15. #define         CY_SCB_RX_INTR_UART_PARITY_ERROR   SCB_INTR_RX_PARITY_ERROR_Msk
  16.          A UART parity error detected.
  17. #define         CY_SCB_RX_INTR_SPI_PARITY_ERROR   SCB_INTR_RX_PARITY_ERROR_Msk
  18.          A SPI parity error detected.
  19. #define         CY_SCB_RX_INTR_UART_BREAK_DETECT   SCB_INTR_RX_BREAK_DETECT_Msk
  20.   A UART break detected.
本次我们使用当FIFO非空即进入接收中断CY_SCB_RX_INTR_NOT_EMPTY,使用RX FIFO满CY_SCB_RX_INTR_FULL来标识,本次接收有溢出问题。本次的串口实验中,我们用来接收一段字符串,对于帧尾的判断我们暂时忽略,待下一篇内容一并完善。我们的实验核心源代码如下:
  1. #define UART_BUF_SIZE (32)

  2. uint8_t uart_rx_buf[UART_BUF_SIZE] = {0};
  3. uint8_t uart_tx_buf[UART_BUF_SIZE] = {0};

  4. typedef struct uart_class_s
  5. {
  6.         uint8_t *rx_buf;
  7.         uint8_t *tx_buf;
  8.         uint16_t rx_length;
  9.         uint16_t rx_cursor;
  10.         uint16_t tx_length;
  11.         uint16_t tx_cursor;
  12. } uart_class_t;

  13. uart_class_t uart0_inst;

  14. void uart0_handler(void)
  15. {
  16.         uint8_t dat;
  17.         if (Cy_SCB_GetRxInterruptStatusMasked(CYBSP_UART_HW) & CY_SCB_UART_RX_NOT_EMPTY)
  18.         {
  19.                 dat = Cy_SCB_UART_Get(CYBSP_UART_HW);
  20.                 uart0_inst.rx_buf[uart0_inst.rx_length] = dat;
  21.                 uart0_inst.rx_length++;
  22.                 Cy_SCB_ClearRxInterrupt(CYBSP_UART_HW, CY_SCB_UART_RX_NOT_EMPTY);
  23.         }
  24. }

  25. int main(void)
  26. {
  27.         cy_rslt_t result;
  28.         uint32_t read_data;
  29.         cy_en_scb_uart_status_t initstatus;
  30.         uart0_inst.rx_buf = uart_rx_buf;
  31.         uart0_inst.tx_buf = uart_tx_buf;
  32.         uart0_inst.rx_length = 0;
  33.         uart0_inst.rx_cursor = 0;
  34.         uart0_inst.tx_length = 0;
  35.         uart0_inst.tx_cursor = 0;

  36.         /* Turn off the USER LED */
  37.         Cy_GPIO_Write(CYBSP_LED1_PORT, CYBSP_LED1_NUM, LED_OFF);

  38.         /* Initialize the device and board peripherals */
  39.         result = cybsp_init();

  40.         /* Board init failed. Stop program execution */
  41.         if (result != CY_RSLT_SUCCESS)
  42.         {
  43.                 CY_ASSERT(0);
  44.         }

  45.         /* Initialize the UART */
  46.         initstatus = Cy_SCB_UART_Init(CYBSP_UART_HW, &CYBSP_UART_config,
  47.                                                                   &CYBSP_UART_context);

  48.         /* Initialization failed. Handle error */
  49.         if (initstatus != CY_SCB_UART_SUCCESS)
  50.         {
  51.                 handle_error();
  52.         }
  53.         Cy_SCB_SetRxInterruptMask(CYBSP_UART_HW, CY_SCB_RX_INTR_NOT_EMPTY);

  54.         result = Cy_SysInt_Init(&uart0_intrcfg, uart0_handler);
  55.         if (result != CY_SYSINT_SUCCESS)
  56.         {
  57.                 CY_ASSERT(0);
  58.         }
  59.         /* Enable Interrupt */
  60.         NVIC_EnableIRQ(uart0_intrcfg.intrSrc);

  61.         /* Enable global interrupts */
  62.         __enable_irq();

  63.         Cy_SCB_UART_Enable(CYBSP_UART_HW);

  64.         /* Transmit Header to the Terminal */
  65.         Cy_SCB_UART_PutString(CYBSP_UART_HW,
  66.                                                   "PSOC 4000T Uart Send and Receive Test\r\n");

  67.         while (1)
  68.         {
  69.         }
  70. }
实验效果如下:


本次实验体验了英飞凌PSOC 4000T的电感按键触摸以及悬浮触摸按键。并通过ModusToolBox的device  configurator来配置串口参数,实现了串口以中断方式接收的实验,算是站在了ModusToolBox“巨人的肩膀之上”。总体体验下来,ModusToolBox在底层外设驱动实现上对用户体验非常棒,可以实现嵌入式工程师无需关注底层驱动,也能写出高质量的外设驱动代码的目的。
最后再次强调一下,在使用ModusToolBox时,一定要通过ModusToolBox Settings选项,将Manifest DB选择为“default China”。本次分享就到这里了,谢谢大家。




本帖子中包含更多资源

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

×
星辰大海不退缩 发表于 2025-5-26 17:09 | 显示全部楼层
非常不错的项目分享
suncat0504 发表于 2025-5-27 09:55 | 显示全部楼层
这一套板子套件真漂亮啊。
小夏天的大西瓜 发表于 2025-5-27 10:08 | 显示全部楼层
英飞凌的PDL外设驱动库在串口外设功能实现中支持ring buffer模式的接收,不支持用户自行处理的方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:热爱开源,乐于分享。在嵌入式技术领域里面,主攻通讯协议,Modbus,TCP/IP以及虚拟化和RTOS

30

主题

740

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:嵌入式技术专家
简介:热爱开源,乐于分享。在嵌入式技术领域里面,主攻通讯协议,Modbus,TCP/IP以及虚拟化和RTOS

30

主题

740

帖子

23

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