嗨,对话工程师,我在ble_peripheral示例项目上做了一些修改,我可以通过UART2使用ARCH_PRINTF()发送数据,但我无法获得任何RX中断,因为UART2_HANDLLLLEL永远不会被调用,我将UART2_INIT()与Project Uart2_Async中的uart2_init()进行比较项目,它们是相同的代码,有人有一个想法吗?您的任何建议都将非常感谢
嗨Chris0409,
为了在您有可用数据时,您需要在UART2_IIR_DLH_REG的UART模块中启用中断,程序读取时,UART2_ASYNC项目才能通过调用UART2_READ()函数(接收数据的中断,启用该中断设置在UART2_REC_DATA_AVAIL_SETF(1);功能)。您是否调用该函数以获得收到的数据可用中断?
谢谢mt_dialog.
嗨,mt_dialog,我在UART_INIT之后调用UART2_READ,但我仍然无法获取UART2_HANDLER()触发?如果我从UART终端发送字符串,我可以一次获取UART2_HANDLER()一次。代码是这样的
静态UINT8_T缓冲区[2] = 0;void periph_init(空白){
//上电外围设备的电源域setBits16(PMU_CTRL_REG,PERIPH_SLEEP,0);而(!(getword16(sys_stat_reg)&per_is_up));
SetBits16(CLK_16M_REG,XTAL16_BIAS_SH_ENABLE,1);// rom补丁patch_func();// init pad.set_pad_functions();#ifdef cfg_printf_uart2.setBits16(CLK_PER_REG,UART2_ENABLE,1);UART2_INIT(UART_BAUDRATE_115K2,3);#万一UART2_READ(&BUFFER,1,NULL);//启用焊盘SetBits16(Sys_ctrl_reg,pad_latch_en,1);
还有什么我应该添加的吗?我需要随时捕获UART的每个字节,所以我不能在循环中使用它.ANY建议?
没有额外的配置才能从UART获取接收的中断,您粘贴的代码在我身边粘贴的作品,我在UART2_HANDLER()上为我发送的每个角色获得接收中断,如果你没有得到它,然后我想你在睡眠模式下运行,这意味着你无法获得你想要的中断,因为当设备睡眠时,自UART模块已关闭UART模块(您仍然可以获得中断但只有在同时发生字符的情况时,才会唤醒,以便宣传或保持相连的连接)。如果您在期待数据时切换到无睡眠模式或保持设备唤醒,那么这应该是工作。
嗨,mt_dialog,BLE_PERITELAL示例项目使用ARCH_SLEEP_OFF的睡眠模式,因此它不会睡眠,现在我在main_func()中使用UART2_READ(),它可以正常工作。
很高兴这适合你,但为了给你一些更多的洞察力,当你用大小的参数调用read2_read时,你只会得到1个中断,因为这是你声明的大小(错过了你提到你只得到一个中断的点,我是在印象中,你不能在你的第一个端口中提到的任何中断)。因此,在接收中断可用后,UART2_REC_DATA_AVAIL_ISR()将减少已声明的大小量,最终当由于大小为零以来不会预期其他数据时,该函数会禁用该中断。现在,您可以做的是将回调函数声明为您想要的任何大小(UART2_READ()函数将第三个参数作为回调,当接收数据的大小达到用户声明的值时将调用)此回调重置您的中断(从那个回调中调用UART2_READ(),其中包含您想要的相同或任何类型的大小。
嗨Chris0409,
为了在您有可用数据时,您需要在UART2_IIR_DLH_REG的UART模块中启用中断,程序读取时,UART2_ASYNC项目才能通过调用UART2_READ()函数(接收数据的中断,启用该中断设置在UART2_REC_DATA_AVAIL_SETF(1);功能)。您是否调用该函数以获得收到的数据可用中断?
谢谢mt_dialog.
嗨,mt_dialog,
我在UART_INIT之后调用UART2_READ,但我仍然无法获取UART2_HANDLER()触发?如果我从UART终端发送字符串,我可以一次获取UART2_HANDLER()一次。
代码是这样的
静态UINT8_T缓冲区[2] = 0;
void periph_init(空白)
{
//上电外围设备的电源域
setBits16(PMU_CTRL_REG,PERIPH_SLEEP,0);
而(!(getword16(sys_stat_reg)&per_is_up));
SetBits16(CLK_16M_REG,XTAL16_BIAS_SH_ENABLE,1);
// rom补丁
patch_func();
// init pad.
set_pad_functions();
#ifdef cfg_printf_uart2.
setBits16(CLK_PER_REG,UART2_ENABLE,1);
UART2_INIT(UART_BAUDRATE_115K2,3);
#万一
UART2_READ(&BUFFER,1,NULL);
//启用焊盘
SetBits16(Sys_ctrl_reg,pad_latch_en,1);
还有什么我应该添加的吗?我需要随时捕获UART的每个字节,所以我不能在循环中使用它.ANY建议?
嗨Chris0409,
没有额外的配置才能从UART获取接收的中断,您粘贴的代码在我身边粘贴的作品,我在UART2_HANDLER()上为我发送的每个角色获得接收中断,如果你没有得到它,然后我想你在睡眠模式下运行,这意味着你无法获得你想要的中断,因为当设备睡眠时,自UART模块已关闭UART模块(您仍然可以获得中断但只有在同时发生字符的情况时,才会唤醒,以便宣传或保持相连的连接)。如果您在期待数据时切换到无睡眠模式或保持设备唤醒,那么这应该是工作。
谢谢mt_dialog.
嗨,mt_dialog,
BLE_PERITELAL示例项目使用ARCH_SLEEP_OFF的睡眠模式,因此它不会睡眠,现在我在main_func()中使用UART2_READ(),它可以正常工作。
嗨Chris0409,
很高兴这适合你,但为了给你一些更多的洞察力,当你用大小的参数调用read2_read时,你只会得到1个中断,因为这是你声明的大小(错过了你提到你只得到一个中断的点,我是在印象中,你不能在你的第一个端口中提到的任何中断)。因此,在接收中断可用后,UART2_REC_DATA_AVAIL_ISR()将减少已声明的大小量,最终当由于大小为零以来不会预期其他数据时,该函数会禁用该中断。现在,您可以做的是将回调函数声明为您想要的任何大小(UART2_READ()函数将第三个参数作为回调,当接收数据的大小达到用户声明的值时将调用)此回调重置您的中断(从那个回调中调用UART2_READ(),其中包含您想要的相同或任何类型的大小。
谢谢mt_dialog.