打印
[PSoC™]

在MTB tool上面实现PSoC4100S Plus uart 中断的步骤

[复制链接]
513|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 IFX_Lingling 于 2023-12-14 17:48 编辑

1:MTB tool提供了UART_Transmit_and_Receive 的示例工程,在这个工程的基础上面,我添加了uart rx fifo not empty的功能,完成了一个uart中断处理的操作示例:
2:具体实现这个功能的步骤如下:
2.1 根据下面截图的1,2,3找到操作uart 中断的具体方法:

2.2 上面截图描述的是high low的API,我这里改成了Low level的API,使能fifo not empty:

2.3 中断部分的代码配置分为中断初始化和中断处理函数的配置
cy_stc_sysint_t intrCfg =
{
    /*.intrSrc =*/ scb_3_interrupt_IRQn, /* 中断source为 scb_3_interrupt_IRQn */
    /*.intrPriority =*/ 3UL                     /* Interrupt priority is 3 */
};
   /* Initialize the interrupt with vector at Interrupt_Handler_Port0() */
     Cy_SysInt_Init(&intrCfg, (cy_israddress)CYBSP_UART_IRQ_hander); // CYBSP_UART_IRQ_hander这个是中断入口函数的地址
     /* Enable the interrupt */
     NVIC_EnableIRQ(intrCfg.intrSrc);
void CYBSP_UART_IRQ_hander() //中断函数里面需要判断是否为fifo not empty,并且把pending的中断标准需要清除掉。
{
#if 1
        /* Returns the status/identity of which enabled RX interrupt source caused interrupt event */
            uint32_t source = Cy_SCB_GetRxInterruptStatusMasked(CYBSP_UART_HW);

                /* Checks for "RX FIFO AND not empty" interrupt */
            if(0ul != (CY_SCB_RX_INTR_NOT_EMPTY & source))
            {
                /* Get the character from terminal */
                    Cy_SCB_UART_GetArray(CYBSP_UART_HW,read_character,1);

                /* Clear UART "RX FIFO not empty interrupt" */
                     Cy_SCB_ClearRxInterrupt(CYBSP_UART_HW, CY_SCB_RX_INTR_NOT_EMPTY);

                /* Sets received_character flag */
                received_character = 1;
            }
            else
            {
                error_uart = 1;
            }

#endif

}
2.4 测试证明可以正常工作。

3: 用High Level的API,下面是我的操作步骤:
3.1:把Device Configurator 4.10里面的API 从low level改成High Level

通过API使能中断,只有调用这个函数才会生成中断。  
Cy_SCB_UART_Receive(CYBSP_UART_HW,read_character,sizeof(read_character),&CYBSP_UART_context);
中断处理函数可以这么写。
void CYBSP_UART_IRQ_hander(void)
{
          Cy_SCB_UART_Interrupt(CYBSP_UART_HW, &CYBSP_UART_context);
          received_character=1;
}
3.2测试可以工作。

4:我在附件放的测试代码,可以更改device config里面的High Level 或者Low Level的设置,配合main函数里面的宏设置,在device config里面配成High Level,就把high level的使能设置成1,反之就把low level的设置成1。#define High_LEVEL_API_Enable 1
#define Low_LEVEL_API_Enable 0
5:下面是对中断的理解:
现在ARM的MCU里面中断的控制比较相似,分为两个方向,一个是外设,一个是core。包含使能外设某个中断,这个可以通过查看对应芯片的寄存器手册。另外就是配置NVIC的source和中断处理函数。下面的图可以帮助我们对中断进行理解。这是单核的中断控制,双核的控制在中断配置上面是有区别的。




UART_isr5.zip

1.18 MB

使用特权

评论回复
沙发
zwsam| | 2023-12-16 15:29 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:
简介:关于英飞凌——我们致力于打造一个更加便利、安全和环保的世界,在赢得自身成功发展的同时,积极践行企业社会责任。

105

主题

189

帖子

5

粉丝