你好mt_dialog,
是否可以在Rx上收到指定数量的字节来获取UART2中断?
到目前为止,我将使用回调函数调用UART2_READ(..)来检索一个再见,但我在循环中执行它,我希望它通过中断自动完成,因此如果指定的号码则调用我的回调函数字节到来。是否有可能 ?
谢谢,- 萨法夫
嗨bensalemsaif,
您可以更改FIFO级别并将其设置为当FIFO达到特定级别时触发中断。例如,如果将UART2_IIR_FCR_REG寄存器设置为0x87的值,则每1/2触发16字节FIFO(每8字节接收中断)每1/2触发接收_AVAILABLE中断。这个1/4 fifo满是少数其他选择,FIFO完整的2个少,设置为0是FIFO中的一个字符。
谢谢mt_dialog.
我在uart2.c中更改了这一行:setword16(UART2_IIR_FCR_REG,7);- > setword16(UART2_IIR_FCR_REG,0);但我仍然没有在UART2_Handler中得到任何东西,这是我的UART2_INIT函数:
+++++++++++++++++++++++++++++++++++++++++++++++++!//启用FIFO,如果UART2_LCR_REG.DLAB = 0,则注册FCR// XMIT FIFO RESET,RCVR FIFO RESET,FIFO启用setBits16(UART2_LCR_REG,UART_DLAB,0);setword16(UART2_IIR_FCR_REG,0);
//禁用中断,如果UART2_LCR_REG.DLAB = 0,则注册IERsetword16(UART2_IER_DLH_REG,0);
//访问diviSorlatch寄存器用于波特拉特115200,如果uart2_lcr_reg.dlab = 1,则寄存器UART_DLH / DLL_REGsetBits16(UART2_LCR_REG,UART_DLAB,1);setword16(UART2_IER_DLH_REG,0);//为串行CLK 16MHz Baudrate 115200setword16(UART2_IIR_DLH_REG,(BAUDR&0xFF >> 0x8));setword16(UART2_RBR_THR_DLL_REG,BAUDR&0xFF);//设置波特兰〜115200 = Serial_Clk /(16 * 9)
//无奇偶校验,1个停止位,8个数据长度和setword16(UART2_LCR_REG,模式);
//启用TX中断,如果UART2_LCR_REG.DLAB = 0,则注册IERsetBits16(UART2_LCR_REG,UART_DLAB,0);
nvic_disableirq(UART2_IRQN);nvic_setpriority(UART2_IRQN,1);nvic_enableirq(UART2_IRQN);nvic_clearpendingirq(UART2_IRQN);
//配置UART环境UART2_ENV.ERRORDETECT = UART_ERROR_DETECT_DISABLED;uart2_env.rx.bufptr = null;uart2_env.rx.size = 0;uart2_env.tx.bufptr = null;uart2_env.tx.size = 0;++++++++++++++++++++++++++++++++++++++++++++++!
有什么缺失吗?获取UART2上的数据的唯一方法是调用UART2_READ函数,但我希望得到一个中断。
您可以拍摄Peripheral_examples项目和UART2_ASYNC作为示例,调用UART2_READ()函数才能设置UART的环境,函数UART2_REC_DATA_AVAIL_SETF()是启用可用中断的函数。由于在UART2_HANDLLER()中触发了每个可用字符后启用中断()(您可以放置断点并检查)。当您将UART2_READ()作为参数调用时,将缓冲区放置为数据,您等待收到的数据有多少,并且在接收到这些数据时会触发的回调是什么,然后启用接收中断。所以每次你得到一个角色时都会启用中断uart2_handler()将击中和一个已收到的occept_available idd和uart2_rec_data_avail_isr()。UART2_REC_DATA_AVAIL_ISR()将从环境缓冲区中的UART中放置数据,并减少环境的预期角色的计数。当所有预期字符到达UART2_REC_DATA_AVAIL_ISR()将禁用接收中断时,在UART环境回调中放置空变量,然后执行回调本身。在上述实现中,您不会调用UART2_REC_DATA_AVAIL_SETF()以便启用接收中断。
嗨bensalemsaif,
您可以更改FIFO级别并将其设置为当FIFO达到特定级别时触发中断。例如,如果将UART2_IIR_FCR_REG寄存器设置为0x87的值,则每1/2触发16字节FIFO(每8字节接收中断)每1/2触发接收_AVAILABLE中断。这个1/4 fifo满是少数其他选择,FIFO完整的2个少,设置为0是FIFO中的一个字符。
谢谢mt_dialog.
你好mt_dialog,
我在uart2.c中更改了这一行:
setword16(UART2_IIR_FCR_REG,7);- > setword16(UART2_IIR_FCR_REG,0);但我仍然没有在UART2_Handler中得到任何东西,这是我的UART2_INIT函数:
+++++++++++++++++++++++++++++++++++++++++++++++++!
//启用FIFO,如果UART2_LCR_REG.DLAB = 0,则注册FCR
// XMIT FIFO RESET,RCVR FIFO RESET,FIFO启用
setBits16(UART2_LCR_REG,UART_DLAB,0);
setword16(UART2_IIR_FCR_REG,0);
//禁用中断,如果UART2_LCR_REG.DLAB = 0,则注册IER
setword16(UART2_IER_DLH_REG,0);
//访问diviSorlatch寄存器用于波特拉特115200,如果uart2_lcr_reg.dlab = 1,则寄存器UART_DLH / DLL_REG
setBits16(UART2_LCR_REG,UART_DLAB,1);
setword16(UART2_IER_DLH_REG,0);//为串行CLK 16MHz Baudrate 115200
setword16(UART2_IIR_DLH_REG,(BAUDR&0xFF >> 0x8));
setword16(UART2_RBR_THR_DLL_REG,BAUDR&0xFF);//设置波特兰〜115200 = Serial_Clk /(16 * 9)
//无奇偶校验,1个停止位,8个数据长度和
setword16(UART2_LCR_REG,模式);
//启用TX中断,如果UART2_LCR_REG.DLAB = 0,则注册IER
setBits16(UART2_LCR_REG,UART_DLAB,0);
nvic_disableirq(UART2_IRQN);
nvic_setpriority(UART2_IRQN,1);
nvic_enableirq(UART2_IRQN);
nvic_clearpendingirq(UART2_IRQN);
//配置UART环境
UART2_ENV.ERRORDETECT = UART_ERROR_DETECT_DISABLED;
uart2_env.rx.bufptr = null;
uart2_env.rx.size = 0;
uart2_env.tx.bufptr = null;
uart2_env.tx.size = 0;
++++++++++++++++++++++++++++++++++++++++++++++!
有什么缺失吗?获取UART2上的数据的唯一方法是调用UART2_READ函数,但我希望得到一个中断。
谢谢,
- 萨法夫
嗨bensalemsaif,
您可以拍摄Peripheral_examples项目和UART2_ASYNC作为示例,调用UART2_READ()函数才能设置UART的环境,函数UART2_REC_DATA_AVAIL_SETF()是启用可用中断的函数。由于在UART2_HANDLLER()中触发了每个可用字符后启用中断()(您可以放置断点并检查)。当您将UART2_READ()作为参数调用时,将缓冲区放置为数据,您等待收到的数据有多少,并且在接收到这些数据时会触发的回调是什么,然后启用接收中断。所以每次你得到一个角色时都会启用中断uart2_handler()将击中和一个已收到的occept_available idd和uart2_rec_data_avail_isr()。UART2_REC_DATA_AVAIL_ISR()将从环境缓冲区中的UART中放置数据,并减少环境的预期角色的计数。当所有预期字符到达UART2_REC_DATA_AVAIL_ISR()将禁用接收中断时,在UART环境回调中放置空变量,然后执行回调本身。在上述实现中,您不会调用UART2_REC_DATA_AVAIL_SETF()以便启用接收中断。
谢谢mt_dialog.