本帖最后由 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”。本次分享就到这里了,谢谢大家。
|