打印
[PSOC™]

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

[复制链接]
236|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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驱动库可以看到有多种中断可以使用,如下所示:
#define         CY_SCB_RX_INTR_LEVEL   SCB_INTR_RX_TRIGGER_Msk
         The number of data elements in the RX FIFO is greater than the value of the RX FIFO level.
#define         CY_SCB_RX_INTR_NOT_EMPTY   SCB_INTR_RX_NOT_EMPTY_Msk
         The RX FIFO is not empty.
#define         CY_SCB_RX_INTR_FULL   SCB_INTR_RX_FULL_Msk
         The RX FIFO is full.
#define         CY_SCB_RX_INTR_OVERFLOW   SCB_INTR_RX_OVERFLOW_Msk
         An attempt to write to a full RX FIFO.
#define         CY_SCB_RX_INTR_UNDERFLOW   SCB_INTR_RX_UNDERFLOW_Msk
         An attempt to read from an empty RX FIFO.
#define         CY_SCB_RX_INTR_BAUD_DETECT   SCB_INTR_RX_BAUD_DETECT_Msk
         LIN baudrate detection is completed.
#define         CY_SCB_RX_INTR_UART_FRAME_ERROR   SCB_INTR_RX_FRAME_ERROR_Msk
         A UART framing error detected.
#define         CY_SCB_RX_INTR_UART_PARITY_ERROR   SCB_INTR_RX_PARITY_ERROR_Msk
         A UART parity error detected.
#define         CY_SCB_RX_INTR_SPI_PARITY_ERROR   SCB_INTR_RX_PARITY_ERROR_Msk
         A SPI parity error detected.
#define         CY_SCB_RX_INTR_UART_BREAK_DETECT   SCB_INTR_RX_BREAK_DETECT_Msk
  A UART break detected.
本次我们使用当FIFO非空即进入接收中断CY_SCB_RX_INTR_NOT_EMPTY,使用RX FIFO满CY_SCB_RX_INTR_FULL来标识,本次接收有溢出问题。本次的串口实验中,我们用来接收一段字符串,对于帧尾的判断我们暂时忽略,待下一篇内容一并完善。我们的实验核心源代码如下:
#define UART_BUF_SIZE (32)

uint8_t uart_rx_buf[UART_BUF_SIZE] = {0};
uint8_t uart_tx_buf[UART_BUF_SIZE] = {0};

typedef struct uart_class_s
{
        uint8_t *rx_buf;
        uint8_t *tx_buf;
        uint16_t rx_length;
        uint16_t rx_cursor;
        uint16_t tx_length;
        uint16_t tx_cursor;
} uart_class_t;

uart_class_t uart0_inst;

void uart0_handler(void)
{
        uint8_t dat;
        if (Cy_SCB_GetRxInterruptStatusMasked(CYBSP_UART_HW) & CY_SCB_UART_RX_NOT_EMPTY)
        {
                dat = Cy_SCB_UART_Get(CYBSP_UART_HW);
                uart0_inst.rx_buf[uart0_inst.rx_length] = dat;
                uart0_inst.rx_length++;
                Cy_SCB_ClearRxInterrupt(CYBSP_UART_HW, CY_SCB_UART_RX_NOT_EMPTY);
        }
}

int main(void)
{
        cy_rslt_t result;
        uint32_t read_data;
        cy_en_scb_uart_status_t initstatus;
        uart0_inst.rx_buf = uart_rx_buf;
        uart0_inst.tx_buf = uart_tx_buf;
        uart0_inst.rx_length = 0;
        uart0_inst.rx_cursor = 0;
        uart0_inst.tx_length = 0;
        uart0_inst.tx_cursor = 0;

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

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

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

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

        /* Initialization failed. Handle error */
        if (initstatus != CY_SCB_UART_SUCCESS)
        {
                handle_error();
        }
        Cy_SCB_SetRxInterruptMask(CYBSP_UART_HW, CY_SCB_RX_INTR_NOT_EMPTY);

        result = Cy_SysInt_Init(&uart0_intrcfg, uart0_handler);
        if (result != CY_SYSINT_SUCCESS)
        {
                CY_ASSERT(0);
        }
        /* Enable Interrupt */
        NVIC_EnableIRQ(uart0_intrcfg.intrSrc);

        /* Enable global interrupts */
        __enable_irq();

        Cy_SCB_UART_Enable(CYBSP_UART_HW);

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

        while (1)
        {
        }
}
实验效果如下:


本次实验体验了英飞凌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

28

主题

628

帖子

5

粉丝