windaqwe 2024-07-26 17:22 采纳率: 0%
浏览 13
已结题

ING91680C BLE5.3 芯片怎么实现串口收发数据

ING91680C BLE5.3 芯片怎么实现串口中断收发数据,


```c
写了这些代码,
#define UART_INTBIT_RECEIVE            0x10  //receive interrupt
#define UART_INTBIT_TRANSMIT           0x20  //transmit interrupt
char dst[256];
int index = 0;
void apUART_BaudRateSet(
  UART_TypeDef* pBase,      //UART参数结构体&设备地址
  uint32_t ClockFrequency,  //时钟信号的频率
  uint32_t BaudRate         //波特率
  );
void apUART_Initialize(
  UART_TypeDef* pBase, 
  UART_sStateStruct* UARTx,  //uart状态结构体
  uint32_t IntMask    //中断掩码
  );
void config_uart(uint32_t freq, uint32_t baud)
{
      UART_sStateStruct config;

      config.word_length       = UART_WLEN_8_BITS;
      config.parity            = UART_PARITY_NOT_CHECK;
      config.fifo_enable       = 1;
      config.two_stop_bits     = 0;
      config.receive_en        = 1;
      config.transmit_en       = 1;
      config.UART_en           = 1;
      config.cts_en            = 0;
      config.rts_en            = 0;
      config.rxfifo_waterlevel = 1;
      config.txfifo_waterlevel = 1;
      config.ClockFrequency    = freq;
      config.BaudRate          = baud;

      apUART_Initialize(APB_UART0, &config, UART_INTBIT_RECEIVE | UART_INTBIT_TRANSMIT);
}
void setup_peripheral_uart()
{
    APB_UART0->FifoSelect = (0 << bsUART_TRANS_INT_LEVEL ) |
                    (0X10 << bsUART_RECV_INT_LEVEL  ) ;
    APB_UART0->IntMask = (1 << bsUART_RECEIVE_INTENAB) | (0 << bsUART_TRANSMIT_INTENAB) |
                        (1 << bsUART_TIMEOUT_INTENAB);
    APB_UART0->Control = 1 << bsUART_RECEIVE_ENABLE |
                1 << bsUART_TRANSMIT_ENABLE |
                1 << bsUART_ENABLE          |
                0 << bsUART_CTS_ENA         |
                0 << bsUART_RTS_ENA;
}

uint32_t uart_isr(void *user_data)
{
    uint32_t status;

    while(1)
    {
        status = apUART_Get_all_raw_int_stat(APB_UART0);

        if (status == 0)
            break;

        APB_UART0->IntClear = status;

        // rx int
        if (status & (1 << bsUART_RECEIVE_INTENAB))
        {
            while (apUART_Check_RXFIFO_EMPTY(APB_UART0) != 1)
            {
                char c = APB_UART0->DataRead;
                dst[index] = c;
                index++;
            }
        }

        // rx timeout_int
        if (status & (1 << bsUART_TIMEOUT_INTENAB))
        {
            while (apUART_Check_RXFIFO_EMPTY(APB_UART0) != 1)
            {
                char c = APB_UART0->DataRead;
                dst[index] = c;
                index++;
            }
        }
        printf("\ndst = %s\n",dst);
    }
    return 0;
}

void uart_peripherals_read_data()
{
    //注册uart0中断
    platform_set_irq_callback(PLATFORM_CB_IRQ_UART0, uart_isr, NULL);
    setup_peripheral_uart();
}
static void watchdog_task(void *pdata)
{
    for (;;)
    {            
                printf("hello1\r\n");
        vTaskDelay(pdMS_TO_TICKS(2500));
        TMR_WatchDogRestart();
    }
}
主函数是这样的
int app_main()
{
    cube_soc_init();
        config_uart(OSC_CLK_FREQ, 115200);
        uart_peripherals_read_data();
    // setup event handlers
    platform_set_evt_callback_table(&evt_cb_table);

    SYSCTRL_Init();
    setup_peripherals();
        
    xTaskCreate(watchdog_task,
           "w",
           configMINIMAL_STACK_SIZE,
           NULL,
           (configMAX_PRIORITIES - 1),
           NULL);

    trace_rtt_init(&trace_ctx);
    // TODO: config trace mask
    platform_config(PLATFORM_CFG_TRACE_MASK, 0);

    return 0;
}

然后他只能做到定时发送数据,但是接收不到数据,我先在就想实现一个接收到数据马上把接收到的数据打印出来的功能

  • 写回答

8条回答 默认 最新

  • 专家-司宇[在线] 2024-07-26 17:22
    关注

    引自免费微信小程序:皆我百晓生

    要解决这个问题,你需要修改uart_peripherals_read_data()函数中的中断处理程序,使其可以同时接收和发送数据。这里是一个可能的实现方式:

    首先,我们创建一个UART_HandleTypeDef类型的变量来存储UART配置信息。

    UART_HandleTypeDef huart0;
    

    接着,在uart_peripherals_read_data()函数中,我们将UART_INTBIT_RECEIVEUART_INTBIT_TRANSMIT设置为0x100x20,以便在接收到数据或发送数据时触发中断。

    void uart_peripherals_read_data()
    {
        // 注册uart0中断
        platform_set_irq_callback(PLATFORM_CB_IRQ_UART0, uart_isr, NULL);
        setup_peripheral_uart();
    }
    

    接下来,我们需要将UART的初始化设置更改为支持双向通信,并且在uart_isr函数中添加两个中断标志位,分别用于接收数据和发送数据。

    void uart_isr(void *user_data)
    {
        uint32_t status;
    
        // 获取所有中断标志位的状态
        status = apUART_Get_all_raw_int_stat(APB_UART0);
    
        // 处理中断标志位
        if ((status & (1 << bsUART_RECEIVE_INTENAB)) != 0) {
            // 接收中断发生
            // 在这里添加接收数据的逻辑
            printf("\nReceived data: ");
            for (int i = 0; i < index; i++) {
                printf("%c", dst[i]);
            }
            printf("\n");
    
            // 更新接收指针
            index = 0;
        } else if ((status & (1 << bsUART_TRANSMIT_INTENAB)) != 0) {
            // 发送中断发生
            // 在这里添加发送数据的逻辑
            for (int i = 0; i < index; i++) {
                printf("%c", dst[i]);
            }
            printf("\n");
    
            // 更新发送指针
            index = 0;
        }
    }
    

    为了使接收和发送功能协同工作,我们需要更新uart_peripherals_read_data()函数中的循环,确保每次只读取一个字符,直到所有的字符都被读取。

    void uart_peripherals_read_data()
    {
        // 注册uart0中断
        platform_set_irq_callback(PLATFORM_CB_IRQ_UART0, uart_isr, NULL);
        setup_peripheral_uart();
    
        // 初始化UART配置
        UART_sStateStruct config;
        config.word_length       = UART_WLEN_8_BITS;
        config.parity            = UART_PARITY_NONE;
        config.fifo_enable       = 1;
        config.two_stop_bits     = 0;
        config.receive_en        = 1;
        config.transmit_en       = 1;
        config.UART_en           = 1;
        config.cts_en            = 0;
        config.rts_en            = 0;
        config.rxfifo_waterlevel = 1;
        config.txfifo_waterlevel = 1;
        config.ClockFrequency    = OSC_CLK_FREQ;
        config.BaudRate          = 115200;
    
        // 初始化UART
        apUART_Initialize(APB_UART0, &config, UART_INTBIT_RECEIVE | UART_INTBIT_TRANSMIT);
    }
    

    这样,当接收数据时,就从队列中读取数据并打印出来;而当发送数据时,则会逐个打印输出到串口上。这个过程可以持续进行,直到所有数据都已被发送或接收完毕。

    通过这种方式,你可以实现单片机上的串口收发数据功能。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月1日
  • 修改了问题 7月26日
  • 修改了问题 7月26日
  • 创建了问题 7月26日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上