OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3314|回复: 6

STM32H743IIT6+STemWin(5.44.a)+FreeRTOS移植疑问。

[复制链接]

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
发表于 2019-10-16 15:48:46 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 yconnor 于 2019-10-16 15:52 编辑

手头上用的是原子的STM32H743IIT6核心板 我这里几乎都是用STM32cubeMX配置的。 SDRAM测试正常,LTDC测试正常,SD卡和文件系统也测试正常的。移植STemWin的时候没有按照原子的例程来移植,因为我看原里的 emWin 库文件是 GUI_CM4F_L.lib 而不是M7内核的,于是按照 “安富莱”的教程和他们的源文件。移植后我写了一段代码来测试是否成功
  1. void demo_task(void const *pvParameters)
  2. {
  3. //        uint8_t res;
  4.         int x,y;
  5.         while(1){
  6.                
  7. //                GUI_UC_SetEncodeUTF8();
  8. //                hMemBMP = _ShowBMP("0:/PICTURE/BMP/图标.bmp", 0, 30 );
  9. //                hMemBMP = ShowJpeg("0:/PICTURE/JPEG/实例图片.jpg", 0, 0);
  10. //                MainTask();
  11.                 GUI_Init();
  12.                 GUI_SetLayerVisEx (1, 0);
  13.                 GUI_SetBkColor(GUI_YELLOW);
  14.                 GUI_Clear();
  15.                 GUI_SetColor(GUI_RED);
  16.                 GUI_SetFont(&GUI_Font32_1);
  17.                 GUI_DispString("Hello world!");
  18.                 x = (LCD_GetXSize()-100)/2;
  19.                 y = (LCD_GetYSize()-20)/2;
  20.                 GUI_DispStringAt("Hello world!", x, y);
  21.                 while(1){
  22. //                        GUI_Delay(100);
  23. //                        GUI_Exec();
  24.                         osDelay(100);
  25.                 }
  26.         }
  27. }
复制代码

FreeRTOS 建了一个任务,这个任务里GUI初始化和GUI_DispString();已及下面的两条语句获取x,y坐标也正常。但GUI_DispStringAt就会出现硬件总线错误中断(PRECISERR)如下图所示。
Fault Reports.png
开启了MPU和Icache和Dcache。MPU代码如下:
  1. void MPU_Config(void)
  2. {
  3.   MPU_Region_InitTypeDef MPU_InitStruct = {0};

  4.   /* Disables the MPU */
  5.   HAL_MPU_Disable();
  6.   /** Initializes and configures the Region and the memory to be protected
  7.   */
  8.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  9.   MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  10.   MPU_InitStruct.BaseAddress = 0x24000000;
  11.   MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  12.   MPU_InitStruct.SubRegionDisable = 0x0;
  13.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  14.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  15.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  16.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  17.   MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  18.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  19.   HAL_MPU_ConfigRegion(&MPU_InitStruct);
  20.         

  21.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
  22.         MPU_InitStruct.BaseAddress      = 0xC0000000;
  23.         MPU_InitStruct.Size             = MPU_REGION_SIZE_32MB;
  24.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  25.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
  26.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
  27.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
  28.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
  29.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
  30.         MPU_InitStruct.SubRegionDisable = 0x00;
  31.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

  32.         HAL_MPU_ConfigRegion(&MPU_InitStruct);



  33.   /* Enables the MPU */
  34.   HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

  35. }
复制代码
求各位大佬能够指点一下。谢谢了!
自己移植过后的工程如下第一个没有Drivers文件夹 STM32H743.ioc 文件打开可看到cubemx的配置,第二个是安富莱的移植
H743CubeEMwinTest.rar (5.76 MB, 下载次数: 31)

FreeRTOS emWin(含MDK和IAR).rar

7.98 MB, 下载次数: 65

安富莱的

最佳答案

查看完整内容[请看2#楼]

老哥,我估计你这很少人会去看你的代码的, 不过我还真去看了,首先你这个内存分配就错了啊, void GUI_X_Config(void) { #if EX_SRAM static U32 *aMemory; aMemory = (U32 *)LCD_FRAME_BUF_ADDR; /* Assign memory to emWin */ GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES); GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); #else // /* 32 bit aligned memory area */ // static U32 aMemory[GUI_NUMB ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

46

帖子

1

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2017-5-8
在线时间
136 小时
发表于 2019-10-16 15:48:47 | 显示全部楼层
老哥,我估计你这很少人会去看你的代码的,
不过我还真去看了,首先你这个内存分配就错了啊,
void GUI_X_Config(void)
{
#if EX_SRAM
        static U32 *aMemory;
        aMemory = (U32 *)LCD_FRAME_BUF_ADDR;
       
        /*  Assign memory to emWin */
        GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
        GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
#else       
//        /* 32 bit aligned memory area */
//        static U32 aMemory[GUI_NUMBYTES / 4];
        static U32 *aMemory;
        aMemory = (U32 *)0x24000000;
        /*  Assign memory to emWin */
        GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
        GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
#endif
//        if(EX_SRAM) //使用外部RAM
//        {       
//                U32 *aMemory = mymalloc(SRAMEX,GUI_NUMBYTES); //从外部SRAM中分配GUI_NUMBYTES字节的内存
//        GUI_ALLOC_AssignMemory((void*)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块
//                GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少
//                GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体
//        }else  //使用内部RAM
//        {
//                U32 *aMemory = mymalloc(SRAMIN,GUI_NUMBYTES); //从内部RAM中分配GUI_NUMBYTES字节的内存
//                GUI_ALLOC_AssignMemory((U32 *)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块
//                GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少
//                GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体
//        }
}

你内存分配用了LCD的缓存了,不能用LCD的缓存做内存,其他的倒是还没发现什么问题,
回复

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
 楼主| 发表于 2019-10-16 16:47:29 | 显示全部楼层
后来又发现。GUI_DispString()只能被调用一次,第二次就会硬件错误中断。
  1. GUI_FillRect(0,20,200,100);
  2.                 GUI_FillCircle(300,150,50);
  3. //                x = (LCD_GetXSize()-100)/2;
  4. //                y = (LCD_GetYSize()-20)/2;
  5.                 GUI_DispString("The frist project ....");
复制代码

如上所示的代码绘制图形可以多次调用。 而且GUI_Delay()一调用也会死掉。求指点。求帮助!
回复

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
 楼主| 发表于 2019-10-17 08:42:44 | 显示全部楼层
今天发现只要调用了GUI_DispString后再调用其它的GUI函数就会进入硬件错误中断。有没有大神遇到过类似的问题的啊。求指点。
回复

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
 楼主| 发表于 2019-10-17 11:29:19 | 显示全部楼层
但是如果在调用GUI_DispString之前调用了GUI_SetTextMode(GUI_TM_TRANS);后就不会进入BUS硬件错误中断。
回复

使用道具 举报

2

主题

46

帖子

1

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2017-5-8
在线时间
136 小时
发表于 2019-10-18 09:11:45 | 显示全部楼层
你这个问题应该好找,只要LCD能点亮,其他问题都不大,LCDConfig里面直接用ST官方的就行。
回复

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
 楼主| 发表于 2019-10-18 09:37:38 | 显示全部楼层
fl7547454 发表于 2019-10-18 09:11
你这个问题应该好找,只要LCD能点亮,其他问题都不大,LCDConfig里面直接用ST官方的就行。

非常感谢。我觉得可能就是这个问题。当初没有注意。我之前看了一下在那个LCDCon_lin_Template.c里的LCD底层驱动里有对这个LCD显存地址的分配,我还以为是GUI管理的呢。哈哈。非常感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 18:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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