用UART配置可编程逻辑器件

⚠️
你好。。谢谢你来到论坛。令人兴奋的消息!我们现在正在迁移到新的论坛平台,该平台将提供更好的功能,并包含在主对话网站中。所有员额和帐户都已迁移。我们现在只接受新论坛的流量-请在//www.wsdof.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
9个员额/ 0个新员额
最后一篇文章
哈米德霍塞尼
离线
最后一次见到:9个月1周前
加入:2020-05-12上午
用UART配置可编程逻辑器件

你好,

我正在尝试将UART与BLE并行使用。就我的项目而言,无代码和DSP不适用,不可能进行充分的修改。因此,我决定将示例项目中演示的UART功能与ble_app_外围示例结合使用。

也就是说,在导入一些所需的库并在示例中启用dma模式之后;我遵循了这个过程:

  • 订阅adc值1后,我希望开始每5秒读取一次数据。
void user_svc1_adc_val_1_cfg_ind_handler(ke_msg_id_t const msgid,struct custs1_val_write_ind const*param,ke_task_id_t const dest_id,ke_task id_t const src_id){//在中心订阅时生成指示,如果(param->value[0]){printf string(UART2,“用户已订阅adc特征!\n\r”);SendRecSM}
  • 我尝试使用不同的中断模式:
ke_msg_id_t timer_used_SendRec_SM __SECTION_ZERO(“retention_mem_area0”);//@RETENTION MEMORY uart_t * uart = UART2; //保留内存const int READ_CHAR_COUNT = 5;static char buffer_BLE[READ_CHAR_COUNT + 1]; /Volatile bool uart_receive_finished = false;Volatile uint16_t data_received_cnt = 0;//函数定义void SendRecSM_op() {//blocking_receive_uart();intr_receive_uart ();/ / dma_receive_uart ();uart_chk_buffer_cb app_easy_timer (500); } static void uart_receive_cb(uint16_t length){ data_received_cnt = length; uart_receive_finished = true; } void dma_receive_uart(){ uart_receive_finished = false; data_received_cnt = 0; uart_register_rx_cb(uart, uart_receive_cb); //Time to ask for data! uart_receive(uart, (uint8_t *)buffer_BLE, READ_CHAR_COUNT, UART_OP_DMA); } void uart_chk_buffer_cb() { arch_printf("\n\rChecking the buffer!\n\r"); if (uart_receive_finished){ buffer_BLE[READ_CHAR_COUNT] = 0; // make it a null terminated string printf_string(uart,buffer_BLE); } } void intr_receive_uart(){ uart_receive_finished = false; data_received_cnt = 0; uart_register_rx_cb(uart, uart_receive_cb); //Time to ask for data! arch_printf("UART is in Interrupt mode!\n\r"); arch_printf("Please input the data!"); uart_receive(uart, (uint8_t *)buffer_BLE, READ_CHAR_COUNT, UART_OP_INTR); } void blocking_receive_uart(){ printf_string(uart,"UART is in Blocking mode!\n\r"); printf_string(uart,"Please input the data!"); uart_receive(uart, (uint8_t *)buffer_BLE, READ_CHAR_COUNT, UART_OP_BLOCKING); buffer_BLE[READ_CHAR_COUNT] = 0; // make it a null terminated string printf_string(uart,buffer_BLE); }

在阻塞接收的情况下,我没有使用计时器。但是,如果我不立即输入数据,程序会由于以下原因崩溃:“而(!uart_data_ready_getf(uart_id));”指挥“uart_读取字节()”.

如果接收中断,我使用上述定时器。然而,程序只运行一次。换句话说,它只打印“正在检查缓冲区!”不管我怎么做,一切都会冻结。

  • 如果我坚持原始代码并使用“当(!接收完成);”程序将由于同一行代码而崩溃。

我想知道,我能做些什么来解决这些问题?是否有我没有为UART配置的东西?有更好的方法吗?(除了使用无代码或DSP,因为它们似乎极难修改)

设备:
PM_对话框
离线
最后一次见到:3天6小时前
工作人员
加入:2018-02-08 11:03
嗨,哈米德霍塞尼,

嗨,哈米德霍塞尼,

你能澄清一下你想要完成什么吗?如果我理解正确,您只需要通过UART打印消息?我的理解正确吗?您是否尝试使用arch_prntf()API打印日期?

你用的是哪一个例子?请注意,如果您正在使用任何可用的睡眠模式,则所有外围设备域都将关闭(包括UART)。这意味着您不能在睡眠模式下进行任何UART活动。

谢谢,下午好

孙梦君
离线
最后一次见到:1个月3周前
加入:2020-03-03 02:40
我也有同样的问题

我也有同样的问题,我已经定义了arch_uusleep_uuoff。

在DA14585、SDK6.0.12、ble_应用程序_外围设备中。

哈米德霍塞尼
离线
最后一次见到:9个月1周前
加入:2020-05-12上午
你好,

你好,

感谢您的回复,我的工作基于BLE_APP_外围设备示例,我也尝试在这个示例中通过UART添加发送和接收数据。

现在,我已经设法解决了这个问题。现在我明白了在这个例子中使用阻塞模式是不可能的。然而,我在编写中断和dma模式的回调时犯了一个小错误。

孙梦君
离线
最后一次见到:1个月3周前
加入:2020-03-03 02:40
你是怎么解决的

你是如何解决这个问题的?

哈米德霍塞尼
离线
最后一次见到:9个月1周前
加入:2020-05-12上午
所以,我的问题在于

所以,我的问题是app_easy_timer。我忘记在回调函数中再次调用这个函数。因此,它只运行一次。如果您认为自己也有同样的问题,可以查看SDK中使用此函数的示例。

PM_对话框
离线
最后一次见到:3天6小时前
工作人员
加入:2018-02-08 11:03
你好,

你好,

我建议使用最新的SDK版本SDK6.0.14。请你澄清一下你的目标是什么,以便我能理解我能如何帮助你?

谢谢,下午好

哈米德霍塞尼
离线
最后一次见到:9个月1周前
加入:2020-05-12上午
谢谢,我的问题解决了

谢谢,我的问题现在解决了。我不知道问题的哪一部分对你来说是模糊的,如果有什么需要澄清,请告诉我。

孙梦君
离线
最后一次见到:1个月3周前
加入:2020-03-03 02:40
非常感谢你的帮助

非常感谢您的回复。我要试试这个方法。