Nanne
Nanne
This guy hasn't written anything yet

注册于 2 years ago

回答
0
文章
0
关注者
1

    本帖最后由 Nanne 于 2020-6-29 12:12 编辑


确实是硬件组播过滤的问题:

//mac层接收组播数据
///////////////////////////////////////////////////////////////////////////////////////////////////////
pFilterConfig_test =(ETH_MACFilterConfigTypeDef *)rt_malloc(sizeof(ETH_MACFilterConfigTypeDef));
HAL_ETH_GetMACFilterConfig(&LAN8720_ETHHandle, pFilterConfig_test);
pFilterConfig_test->ReceiveAllMode =ENABLE;
pFilterConfig_test->PassAllMulticast =ENABLE;
HAL_ETH_SetMACFilterConfig(&LAN8720_ETHHandle, pFilterConfig_test);
///////////////////////////////////////////////////////////////////////////////////////////////////////

    本帖最后由 Nanne 于 2020-5-18 21:54 编辑


另外,以下宏定义的最大速度,是最大只能50MHz吗?
#define RT_SFUD_SPI_MAX_HZ 50000000

我的STM32H750IB板卡,实测50MHz会读取失败:
在【state = HAL_SPI_Receive(spi_handle, (uint8_t *)recv_buf, send_length, 1000)】处报错。
如果将频率降低到40MHz,则可以正常读写,这个可能是什么原因呢?

    本帖最后由 Nanne 于 2020-5-18 15:49 编辑


1.png
如上图,此处既然已经注册设备了,为什么采用这样的方式调用呢?
// sfud_flash *sfud_dev =NULL;
// sfud_dev=rt_sfud_flash_find_by_dev_name("W25Q32"); //然后就可以开心的玩耍了
// result=sfud_erase(sfud_dev, 0, 1024);
// result=sfud_read(sfud_dev, 0, 32, data);
// memset(dataBufW,1,31);
// result=sfud_write(sfud_dev,0,32,dataBufW);
// result=sfud_read(sfud_dev, 0, 32, data);



我在应用的时候,如果按照注册设备的方式应用,则会出现报错:
g_rtt_sfud_flash_dev->flash_device.read((rt_device_t)sfud_dev, 0, (void *)data_buff_recv, 100);


是我的应用方法有问题,还是当前确实就是这样?@armink


whj467467222 发表于 2019-7-29 11:34
你现在的是最新的吗?你看下drv_mpu.c里面的 AXI SRAM的cache配置是不是WT模式?
早先的模式是WB模式是会这 ...


谢谢

yangjie 发表于 2019-12-17 13:54
一般来说是这样的,该pkg是基于4.0+做的,你可以在3.1.3上测试下


好的,我试一下,谢谢杨工

aozima 发表于 2019-12-13 10:08
楼主是否方便借个硬件给我们硬件工程师分析下?


没问题,我把我这边的代码也发给你们,供参考。有劳了!
地址的话,我找杨工要?

whj467467222 发表于 2019-12-12 11:45
楼主这个问题早就更新过了,你下载最新的版本看看


刚看了一下,master分支确实更新了。
因为是用在项目上,保险起见,选用的是发布版本。目前最新的发布版本3.1.3和4.0.1,还没更新。

tyustli 发表于 2019-12-7 15:20
这个地址:https://github.com/RT-Thread/rt-thread/tree/master/components/drivers/touch


OK,谢了
原来是touch的驱动只存在于master分支,发布版现在还没有加进去。

兄弟,你的touch.c和touch.h是从哪里找到的?我怎么找不到

可以参考一下我的这个疑问贴:
https://fastadmin.rt-thread.org/ask/question/422728.html

简而言之,可能是SPI速率配置的问题,我也还没有彻底搞清楚。

    本帖最后由 Nanne 于 2019-10-5 08:41 编辑


这句话怎么理解?我在判断条件内部设置了断点,发现程序死的时候,进入了该判断条件。正常运行的时候是不进入的。执行完这个函数后,就进入hard fault了。

if ((thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_READY &&
thread->tlist.next != thread->tlist.prev)







完整函数:


/**
* This function will let current thread yield processor, and scheduler will
* choose a highest thread to run. After yield processor, the current thread
* is still in READY state.
*
* @return RT_EOK
*/
rt_err_t rt_thread_yield(void)
{
register rt_base_t level;
struct rt_thread *thread;


/* disable interrupt */
level = rt_hw_interrupt_disable();


/* set to current thread */
thread = rt_current_thread;


/* if the thread stat is READY and on ready queue list */
if ((thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_READY &&
thread->tlist.next != thread->tlist.prev)
{
/* remove thread from thread list */
rt_list_remove(&(thread->tlist));


/* put thread to end of ready queue */
rt_list_insert_before(&(rt_thread_priority_table[thread->current_priority]),
&(thread->tlist));


/* enable interrupt */
rt_hw_interrupt_enable(level);


rt_schedule();


return RT_EOK;
}


/* enable interrupt */
rt_hw_interrupt_enable(level);


return RT_EOK;
}
RTM_EXPORT(rt_thread_yield);




    本帖最后由 Nanne 于 2019-10-4 22:14 编辑


现在调试,发现程序死的时候,跟之前的现象不太一样,通过Call Stack + Locals能定位到“rt_thread_yield”。这个函数我没有主动调用过。

1.png
2.png

回到
顶部

发布
问题

投诉
建议