红枫
红枫 - 认证专家
This guy hasn't written anything yet

注册于 1 year ago

回答
250
文章
4
关注者
30

可以参考以下代码

static void fsmc_port_init(void)
{
    SRAM_HandleTypeDef hsram;
    FSMC_NORSRAM_TimingTypeDef Timing = {0};
    
    memset(&hsram,0,sizeof(hsram));
    hsram.Instance = FSMC_NORSRAM_DEVICE;
    hsram.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
    
    hsram.Init.NSBank = FSMC_NORSRAM_BANK3;
    hsram.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
    hsram.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
    hsram.Init.MemoryDataWidth = FPGA_DATA_WIDTH;
    hsram.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
    hsram.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
    hsram.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
    hsram.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
    hsram.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
    hsram.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
    hsram.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
    hsram.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
    hsram.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
    hsram.Init.PageSize = FSMC_PAGE_SIZE_NONE;
    
    Timing.AddressSetupTime = 2;//0;
    Timing.AddressHoldTime = 0;
    Timing.DataSetupTime = 8;
    Timing.BusTurnAroundDuration = 0;
    Timing.CLKDivision = 0;
    Timing.DataLatency = 0;
    Timing.AccessMode = FSMC_ACCESS_MODE_A;
    
    HAL_SRAM_Init(&hsram, &Timing, &Timing); 
    
    LOG_D("FPGA FSMC port init ok!");
}

mqtt的连接错误处理中出的问题,建议单步跟踪调试,看看问题究竟出在哪?

数据+crc一块算计算结果就是0,这样检查crc校验比只计算数据crc然后再比较,要简单

这一段错误

    buf[0] = reg; //cmd
    buf[1] = (rt_uint8_t)data>>16;
    buf[2] = (rt_uint8_t)data>>8;
    buf[3] = (rt_uint8_t)data;

建议采用资源申请和释放均由线程自己进行管理方式设计,具体方案是:

static bool thread_exit_req = false;
static void thread_entry(void * parameter)
{
    //申请内存
    //创建邮箱
    //创建信号量

    while(1)
    {
        do something;
        if (thread_exit_req )
        {
            break;
        }
    }
    
    //删除信号量
    //删除邮箱
    //释放内存
}

void xxx_thread_start(void)//线程启动接口函数
{
    //创建线程
    thread_exit_req = false;
}

void xxx_thread_stop(void)//线程终止接口函数
{
    thread_exit_req = true;
}

可能是有线程在delay(1)运行

可能是调用时间上的问题,调用前加上1秒延时试试

这取决于线程1的优先级是否大于线程2,如果是那么立即切换

因为单片机的存储单位是字节,单片机位数指的是cpu处理器的位宽。

芯片最小擦除尺寸多大?可能是bl分区尺寸不合适,15k?

使用mcu型号?串口接收方式?串口接收fifo尺寸?波特率?等信息

可能会串位,但不会出错,因为get_index的算法也一样。同样的算法、同样的路线。

回到
顶部

发布
问题

投诉
建议