星闪Hi3863串口乱码问题(踩坑日记)

前言:

跟着星闪官网敲串口代码的时候在配置参数的时候,看官网数据位配置成3位,平常用串口正常都是8位,然后我就配置成了8位数据位,结果开串口调试助手起来看的时候打印不出来

正确代码:

#include "common_def.h"
#include "osal_debug.h"
#include "soc_osal.h"
#include "cmsis_os2.h"
#include "gpio.h"
#include "pinctrl.h"
#include "app_init.h"
#include "uart.h"
#define TASKS_TEST_TASK_STACK_SIZE      0x1000
#define TASKS_TEST_TASK_PRIO            (osPriority_t)(17)
#define TASK_TICK                       10

#define UART_TX_PIN     15
#define UART_RX_PIN     16
#define UART_ID         1

static uint8_t g_app_uart_rx_buff[16] = { 0 };

static uart_buffer_config_t g_app_uart_buffer_config = {
    .rx_buffer = g_app_uart_rx_buff,
    .rx_buffer_size = 16
};

/*串口初始化*/
void myuart_init(void)
{

    //复用引脚
    uapi_pin_set_mode(UART_TX_PIN, PIN_MODE_1);
    uapi_pin_set_mode(UART_RX_PIN, PIN_MODE_1);
    //配置UART
    uart_attr_t attr = {
        .baud_rate = 115200,
        .data_bits = 3, 
        .stop_bits = 1,
        .parity = 0
    };

    uart_pin_config_t pin_config = {
        .tx_pin = UART_TX_PIN,
        .rx_pin = UART_RX_PIN,
        .cts_pin = PIN_NONE,
        .rts_pin = PIN_NONE
    };
    uapi_uart_deinit(UART_ID); 
    uapi_uart_init(UART_ID, &pin_config, &attr, NULL, &g_app_uart_buffer_config);
}

static void *tasks_test_task(const char *arg)
{
    unused(arg);
    myuart_init();
    static uint8_t g_app_uart_tx_buff[512] = "Hello world";
    while (1)
    {   
        osal_msleep(2000);
        uapi_uart_write(UART_ID, g_app_uart_tx_buff, 512, 0);
        //printf("uart transimit");
        
    }

    return NULL;
}


static void tasks_test_entry(void)
{
    osThreadAttr_t attr;

    attr.name = "TasksTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = TASKS_TEST_TASK_STACK_SIZE;
    attr.priority = TASKS_TEST_TASK_PRIO;

    if (osThreadNew((osThreadFunc_t)tasks_test_task, NULL, &attr) == NULL) {
        /* Create task fail. */
    }
}   

/* Run the tasks_test_entry. */
app_run(tasks_test_entry);

数据位数改成3才能正常输出不会乱码,具体为什么8不是我也还没找到原因,有大佬知道的话帮忙指导一下

<think>好的,我现在需要处理用户关于“inmp441hi3863”的查询。首先,用户可能想了解这两个组件的关系或如何在嵌入式系统中结合使用。INMP441是数字麦克风,而Hi3863是华为的物联网芯片。用户可能在进行一个需要音频采集和物联网通信的项目,比如智能家居设备。 首先,我需要确认INMP441和Hi3863的技术规格。INMP441使用I2S接口传输PDM数据,而Hi3863是否有I2S接口是关键。查阅Hi3863的文档,发现它主要支持UART、SPI、I2C等,但可能没有原生I2S支持。这时候可能需要软件模拟或外部芯片转换PDM到PCM。 接下来,用户可能遇到在Hi3863上驱动INMP441的问题,比如时序不匹配或数据接收错误。参考之前的问题,用户使用STM32时通过DMA和中断处理数据,但Hi3863的资源有限,DMA可能不可用,需要考虑中断服务例程的效率。 另外,存储数据到SD卡时,创建文件夹和文件的问题在STM32上出现过,用户可能在Hi3863上遇到类似问题。需要检查文件系统的操作是否阻塞了音频采集,可能需要停止麦克风再进行文件操作,类似引用中的解决方案。 还要考虑Hi3863的软件开发环境,比如使用的RTOS或裸机编程,这会影响多任务处理和数据缓冲的设计。可能需要使用双缓冲区或循环缓冲区来确保音频数据不丢失。 最后,生成相关问题时要覆盖硬件接口、驱动开发、数据处理和存储等方面,帮助用户全面了解可能遇到的挑战和解决方案。</think>关于INMP441与Hi3863的嵌入式开发相关内容,根据引用[1][2]和行业经验,主要涉及以下技术要点: ### 一、INMP441麦克风与Hi3863的硬件集成 1. **接口兼容性分析** - INMP441采用$I^2S$数字音频接口输出PDM信号[^2] - Hi3863芯片需确认是否原生支持$I^2S$协议,若无则需要: $$使用GPIO模拟I^2S时序$$ $$添加PDM-PCM编解码芯片(如STA808)$$ 2. **典型硬件连接方案** ```c // Hi3863引脚配置示例 #define I2S_WS GPIO_11 // 字选择线 #define I2S_SCK GPIO_12 // 时钟线 #define I2S_SD GPIO_13 // 数据线 ``` ### 二、软件开发关键点 1. **时序配置难点** - 需严格匹配INMP441的2.4MHz典型时钟频率[^2] - Hi3863的PWM输出精度调整: ```c PWM_SetDuty(pwm_id, 50); // 设置占空比 PWM_SetFrequency(pwm_id, 2400000); // 设置时钟频率 ``` 2. **数据采集优化** - 使用双缓冲机制避免数据丢失 - 内存管理策略: ```c #define BUFFER_SIZE 1024 uint16_t bufferA[BUFFER_SIZE]; uint16_t bufferB[BUFFER_SIZE]; ``` ### 三、典型问题解决方案 1. **文件系统冲突** - 参考引用[1]经验: - 创建文件夹前中止DMA传输 - 使用原子操作管理存储过程 2. **实时性保障** - 中断优先级配置: ```c IoTGpioSetIsrPriority(GPIO_IRQ, 0); // 设置最高中断优先级 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值