搜索
bottom↓
回复: 24

STM32F429中在freertos基础工程里增加sdram的功能后,对sdram初...

[复制链接]

出0入0汤圆

发表于 2019-10-22 20:43:59 | 显示全部楼层 |阅读模式
用的是正点原子的阿波罗f429的开发板,sdram.c和sdram.h用的都是原子例程里的,工程用的是基于freertos的基础例程,freertos的mdk工程烧录进开发板是运行正常的,在main函数里对sdram进行初始化后就死机了进入了hardfault,请问有知道这是什么原因的吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-10-23 04:39:27 来自手机 | 显示全部楼层
本帖最后由 Excellence 于 2019-10-23 04:41 编辑

看看原子ucos的例程。有SDRAM,运行没问题

出0入442汤圆

发表于 2019-10-23 07:21:52 | 显示全部楼层
我怎么记得F4不需要配置啊,直接打开SDRAM控制器就可以直接通过内存访问了?

出0入0汤圆

发表于 2019-10-23 08:42:53 | 显示全部楼层
里面做了啥,死机死在哪一行你都没看,就标一个调用会死机,连里面是这么写的都没给出来,让大家来猜哑谜咯

出0入0汤圆

发表于 2019-10-23 08:49:29 | 显示全部楼层
可以看硬件错误标志寄存器,或者依据调用树定位到出异常是哪行。

出0入0汤圆

 楼主| 发表于 2019-10-23 08:51:01 | 显示全部楼层
Excellence 发表于 2019-10-23 04:39
看看原子ucos的例程。有SDRAM,运行没问题

待会去看看

出0入0汤圆

 楼主| 发表于 2019-10-23 08:53:00 | 显示全部楼层
wye11083 发表于 2019-10-23 07:21
我怎么记得F4不需要配置啊,直接打开SDRAM控制器就可以直接通过内存访问了? ...

需要配置啊,里面有些需要配置的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-10-23 08:54:26 | 显示全部楼层
nongxiaoming 发表于 2019-10-23 08:42
里面做了啥,死机死在哪一行你都没看,就标一个调用会死机,连里面是这么写的都没给出来,让大家 ...

初始化就做了这个啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-10-23 08:56:38 | 显示全部楼层
  1. /***************************************************************************************************************/
  2. /*                                        FreeRTOS基础配置配置选项                                              */
  3. /***************************************************************************************************************/
  4. #define configUSE_PREEMPTION                                        1                       //1使用抢占式内核,0使用协程
  5. #define configUSE_TIME_SLICING                                        1                                                //1使能时间片调度(默认式使能的)
  6. #define configUSE_PORT_OPTIMISED_TASK_SELECTION        1                       //1启用特殊方法来选择下一个要运行的任务
  7.                                                                         //一般是硬件计算前导零指令,如果所使用的
  8.                                                                         //MCU没有这些硬件指令的话此宏应该设置为0!
  9. #define configUSE_TICKLESS_IDLE                                        0                       //1启用低功耗tickless模式
  10. #define configUSE_QUEUE_SETS                                        1                       //为1时启用队列
  11. #define configCPU_CLOCK_HZ                                                (180000000)             //CPU频率
  12. #define configTICK_RATE_HZ                                                (500)                  //时钟节拍频率,若这里设置为1000,周期就是1ms
  13. #define configMAX_PRIORITIES                                        (32)                    //可使用的最大优先级
  14. #define configMINIMAL_STACK_SIZE                                ((unsigned short)130)   //空闲任务使用的堆栈大小
  15. #define configMAX_TASK_NAME_LEN                                        (16)                    //任务名字字符串长度

  16. #define configUSE_16_BIT_TICKS                                        0                       //系统节拍计数器变量数据类型,
  17.                                                                         //1表示为16位无符号整形,0表示为32位无符号整形
  18. #define configIDLE_SHOULD_YIELD                                        1                       //为1时空闲任务放弃CPU使用权给其他同优先级的用户任务
  19. #define configUSE_TASK_NOTIFICATIONS            1                       //为1时开启任务通知功能,默认开启
  20. #define configUSE_MUTEXES                                                1                       //为1时使用互斥信号量
  21. #define configQUEUE_REGISTRY_SIZE                                8                       //不为0时表示启用队列记录,具体的值是可以
  22.                                                                         //记录的队列和信号量最大数目。
  23. #define configCHECK_FOR_STACK_OVERFLOW                        0                       //大于0时启用堆栈溢出检测功能,如果使用此功能
  24.                                                                         //用户必须提供一个栈溢出钩子函数,如果使用的话
  25.                                                                         //此值可以为1或者2,因为有两种栈溢出检测方法。
  26. #define configUSE_RECURSIVE_MUTEXES                                1                       //为1时使用递归互斥信号量
  27. #define configUSE_MALLOC_FAILED_HOOK                        0                       //1使用内存申请失败钩子函数
  28. #define configUSE_APPLICATION_TASK_TAG                        0                       
  29. #define configUSE_COUNTING_SEMAPHORES                        1                       //为1时使用计数信号量

  30. /***************************************************************************************************************/
  31. /*                                FreeRTOS与内存申请有关配置选项                                                */
  32. /***************************************************************************************************************/
  33. #define configSUPPORT_DYNAMIC_ALLOCATION        1                       //支持动态内存申请
  34. #define configTOTAL_HEAP_SIZE                                        ((size_t)(30*1024))     //系统所有总的堆大小,单位Byte

  35. /***************************************************************************************************************/
  36. /*                                FreeRTOS与钩子函数有关的配置选项                                              */
  37. /***************************************************************************************************************/
  38. #define configUSE_IDLE_HOOK                                                0                       //1,使用空闲钩子;0,不使用
  39. #define configUSE_TICK_HOOK                                                0                       //1,使用时间片钩子;0,不使用

  40. /***************************************************************************************************************/
  41. /*                                FreeRTOS与运行时间和任务状态收集有关的配置选项                                 */
  42. /***************************************************************************************************************/
  43. #define configGENERATE_RUN_TIME_STATS                0                       //为1时启用运行时间统计功能
  44. #define configUSE_TRACE_FACILITY                                1                       //为1启用可视化跟踪调试
  45. #define configUSE_STATS_FORMATTING_FUNCTIONS        1                       //与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数
  46.                                                                         //prvWriteNameToBuffer(),vTaskList(),
  47.                                                                         //vTaskGetRunTimeStats()
  48.                                                                         
  49. /***************************************************************************************************************/
  50. /*                                FreeRTOS与协程有关的配置选项                                                  */
  51. /***************************************************************************************************************/
  52. #define configUSE_CO_ROUTINES                                 0                       //为1时启用协程,启用协程以后必须添加文件croutine.c
  53. #define configMAX_CO_ROUTINE_PRIORITIES         ( 2 )                   //协程的有效优先级数目

  54. /***************************************************************************************************************/
  55. /*                                FreeRTOS与软件定时器有关的配置选项                                            */
  56. /***************************************************************************************************************/
  57. #define configUSE_TIMERS                                        1                               //为1时启用软件定时器
  58. #define configTIMER_TASK_PRIORITY                        (configMAX_PRIORITIES-1)        //软件定时器优先级
  59. #define configTIMER_QUEUE_LENGTH                        5                               //软件定时器队列长度
  60. #define configTIMER_TASK_STACK_DEPTH                (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小

  61. /***************************************************************************************************************/
  62. /*                                FreeRTOS可选函数配置选项                                                      */
  63. /***************************************************************************************************************/
  64. #define INCLUDE_xTaskGetSchedulerState          1                       
  65. #define INCLUDE_vTaskPrioritySet                        1
  66. #define INCLUDE_uxTaskPriorityGet                        1
  67. #define INCLUDE_vTaskDelete                                        1
  68. #define INCLUDE_vTaskCleanUpResources                1
  69. #define INCLUDE_vTaskSuspend                                1
  70. #define INCLUDE_vTaskDelayUntil                                1
  71. #define INCLUDE_vTaskDelay                                        1
  72. #define INCLUDE_eTaskGetState                                1
  73. #define INCLUDE_xTimerPendFunctionCall                1
  74. #define INCLUDE_uxTaskGetStackHighWaterMark     1

  75. /***************************************************************************************************************/
  76. /*                                FreeRTOS与中断有关的配置选项                                                  */
  77. /***************************************************************************************************************/
  78. #ifdef __NVIC_PRIO_BITS
  79.         #define configPRIO_BITS                       __NVIC_PRIO_BITS
  80. #else
  81.         #define configPRIO_BITS                       4                  
  82. #endif

  83. /*中断最低优先级,用来配置systick和pendsv中断优先级*/
  84. #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY                        15  
  85. /*系统可管理的最高中断优先级,可在优先级为5到15的中断里面调用FreeRTOS的API*/
  86. #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        5  
  87. /*内核优先级数值为configLIBRARY_LOWEST_INTERRUPT_PRIORITY左移4位得到*/
  88. #define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
  89. /*调用FreeRTOS关中断后,所有优先级数值大于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断都会被关闭,优先级数值小于不会被关闭*/
  90. #define configMAX_SYSCALL_INTERRUPT_PRIORITY         ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

  91. /***************************************************************************************************************/
  92. /*                                FreeRTOS与中断服务函数有关的配置选项                                          */
  93. /***************************************************************************************************************/
  94. #define xPortPendSVHandler         PendSV_Handler
  95. #define vPortSVCHandler         SVC_Handler
  96. #define xPortSysTickHandler SysTick_Handler

  97. #endif /* FREERTOS_CONFIG_H */
复制代码


会不会跟FREERTOS的配置有关,上面是我的配置

出0入0汤圆

 楼主| 发表于 2019-10-23 08:57:26 | 显示全部楼层
styleno1 发表于 2019-10-23 08:49
可以看硬件错误标志寄存器,或者依据调用树定位到出异常是哪行。

不知道还有这操作,待会百度学习一下

出0入0汤圆

发表于 2019-10-23 09:05:17 | 显示全部楼层
也是用阿波罗f429的开发板,cube配置,freertos,没有发现这样的问题

出0入0汤圆

 楼主| 发表于 2019-10-23 10:40:54 | 显示全部楼层
jbpan852 发表于 2019-10-23 09:05
也是用阿波罗f429的开发板,cube配置,freertos,没有发现这样的问题

freertos没问题,加上对SDRAM初始化就不行,我当时怀疑是分配给freertos的内存大了导致的,所以我将内存改小了再试,但结果还是一样死机。

出0入0汤圆

发表于 2019-10-23 16:37:25 | 显示全部楼层
需要在连接脚本文件里面添加SDRAM的信息吧

出0入0汤圆

 楼主| 发表于 2019-10-23 19:26:02 | 显示全部楼层
jueenkay 发表于 2019-10-23 16:37
需要在连接脚本文件里面添加SDRAM的信息吧

你好,你说的连接脚本文件能说的具体一点吗?

出0入0汤圆

发表于 2019-10-23 19:39:33 | 显示全部楼层
初始化里的写保护那个是不是要换成这一句,     hsram.Init.WriteOperation     = FSMC_WRITE_OPERATION_ENABLE;

出0入0汤圆

 楼主| 发表于 2019-10-23 21:21:08 | 显示全部楼层
ZMHCISS 发表于 2019-10-23 19:39
初始化里的写保护那个是不是要换成这一句,     hsram.Init.WriteOperation     = FSMC_WRITE_OPERATION_EN ...

试过也是不行

出0入0汤圆

 楼主| 发表于 2019-10-23 21:41:42 | 显示全部楼层
styleno1 发表于 2019-10-23 08:49
可以看硬件错误标志寄存器,或者依据调用树定位到出异常是哪行。

进入hardfault时,对应的寄存器的值是这样的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2019-10-23 22:16:31 | 显示全部楼层
你的问题和我去年碰到的问题貌似同一个问题,都是在使用bank5,6时配置FMC死机.
cube配置时没问题,自己写就会死机.在网上搜索没发现别人有类似问题.
所以我后来把cube配置的程序和自己的程序一行一行的比较单步运行,终于发现了问题.
用cube配置时,即时SDRAM是连接在FMC_Bank2_SDRAM上,它也会读一下FMC_Bank1_SDRAM的寄存器,
而自己写驱动时认为SDRAM是连接在FMC_Bank2_SDRAM上,没有对FMC_Bank1_SDRAM寄存器有任何操作,
这样就会死机.感觉这是一个bug, 反映给STM32的FAE, 他们似乎也不在意.楼主可试一下是不是这个原因.

出0入0汤圆

发表于 2019-10-23 22:42:52 | 显示全部楼层
dragonFANG 发表于 2019-10-23 19:26
你好,你说的连接脚本文件能说的具体一点吗?

MDK用的比较少,具体的我也不怎么了解,atmel studio上是在链接脚本里面把SDRAM段定义出来;你找一下OBJ目录下有没有.sct文件,添加起始地址和长度之后试试。

出0入0汤圆

 楼主| 发表于 2019-10-23 22:50:49 | 显示全部楼层
jjl3 发表于 2019-10-23 22:16
你的问题和我去年碰到的问题貌似同一个问题,都是在使用bank5,6时配置FMC死机.
cube配置时没问题,自己写就会 ...

我的是SDRAM是连接在FMC_Bank1_SDRAM上的,还有你说的也会读一下另一个寄存器这个该怎样操作,是图片这样的写吗?刚试了还是不行、、

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-10-23 22:58:23 | 显示全部楼层
这里添加和链接脚本应该是一样的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-10-23 23:14:00 | 显示全部楼层
问题解决了,原来是在初始化程序里面有个delay_us写的不对,我把delay_us去掉就好了,后来又修改了delay_us,没去掉delay_us(500),也是没问题的,但是我仿真测了下延时时间,算出来不是500us
  1. void delay_us(u32 nus)
  2. {               
  3.         u32 ticks;
  4.         u32 told,tnow,tcnt=0;
  5.         u32 reload=SysTick->LOAD;                                //LOAD的值                     
  6.         ticks=nus*fac_us;                                                 //需要的节拍数
  7.         told=SysTick->VAL;                                        //刚进入时的计数器值
  8.         while(1)
  9.         {
  10.                 tnow=SysTick->VAL;       
  11.                 if(tnow!=told)
  12.                 {            
  13.                         if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
  14.                         else tcnt+=reload-tnow+told;            
  15.                         told=tnow;
  16.                         if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
  17.                 }  
  18.         };
  19. }
复制代码

出0入0汤圆

发表于 2019-10-25 05:59:17 来自手机 | 显示全部楼层
延时程序看看安富莱的。用的内核延时

出0入0汤圆

 楼主| 发表于 2019-10-25 21:47:12 | 显示全部楼层
Excellence 发表于 2019-10-25 05:59
延时程序看看安富莱的。用的内核延时

谢谢提示,我待会去看下,安富莱电子做的教程真心不错,硬汉很辛苦、、

出0入0汤圆

 楼主| 发表于 2019-10-25 21:48:54 | 显示全部楼层
刚刚又发现了新问题,SDRAM_Iinit是没问题了,但是现在的malloc有问题了,只要初始化内存池就会进入hardfault、、、
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 02:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表