[STM32H750]HAL库移植正点原子屏幕显示
在使用正点原子的 MiniPro750 开发板时,想移植在CubeMX生成的项目上,虽然正点原子提供了HAL库下屏幕的驱动,但是正点原子也对HAL库进行了修改,所以不能无脑直接将屏幕驱动拷贝到MX生成的项目中去。我在移植过程中也发现了一些问题,特在此做以记录。我在移植时参考了该文章“”,讲的很详细,只不过是博主是移植在了F407的芯片上,与H750芯片还是有很多区别的。该文章也在此文章的基础上进行
说明
在使用正点原子的 MiniPro750 开发板时,想移植在CubeMX生成的项目上,虽然正点原子提供了HAL库下屏幕的驱动,但是正点原子也对HAL库进行了修改,所以不能无脑直接将屏幕驱动拷贝到MX生成的项目中去。我在移植过程中也发现了一些问题,特在此做以记录。
我在移植时参考了该文章“HAL库移植正点原子屏幕显示和触摸驱动_正点原子屏幕驱动-CSDN博客”,讲的很详细,只不过是博主是移植在了F407的芯片上,与H750芯片还是有很多区别的。该文章也在此文章的基础上进行H750移植总结(为避免该文章不能进行查看,我将文章进行了下载,链接放在了文章最下面)。建议在按照该文章进行移植后无法使用再查看该文章的问题总结。
延时问题
在参考文章中,博主重写了正点原子的us延时函数,重写的延时函数是不准确的,受制于芯片的频率,所以再次提供一个使用硬件定时器完成的us延时函数。
MX配置:

延时函数代码:
void delay_us(uint16_t nus)
{
uint16_t differ = 65535-nus-5;
HAL_TIM_Base_Start(&htim7);
__HAL_TIM_SetCounter(&htim7,differ);
while(differ<0xffff-5)
{
differ = __HAL_TIM_GetCounter(&htim7);
}
HAL_TIM_Base_Stop(&htim7);
}
记得更改对应的.h文件。
FMC/FSMC硬件配置
H750在MX中的FMC硬件就是F407的FSMC,这里配置不太一样,我也不是很理解这个硬件,我在配置时,只是将FMC进行了启用,目的是让MX将FMC的库进行启用,最后在项目中将MX的配置进行注释,只调用正点原子提供的 lcd_init 函数即可。因为这个函数中会再次配置FSMC。MX配置如下:

代码书写如下:

2025.3.26:今天测试了下,我对MX的配置是正确的,可以不讲MX_FMC_Init()函数注释掉也能运行,但不知道会不会预计什么奇怪问题,暂时还没遇到。
Cache配置
由于H750芯片需要配置cache缓存,F407芯片不需要,所以参考文章并没有进行cache的配置,这里对按照MiniPro H750的开发板进行了cache配置,MX截图如下:

这里的配置也是因为该开发板外扩了 flash,也就是按照正点原子提供的方案配置了下载算法,感觉应该是正点原子将部分资源写到了外部flash中,我没仔细看,如果脱离了该开发板,那么可能需要再按照具体项目去更新cache配置。正点原子的cache配置写的也很详细,源码如下:
/**
* @brief 设置某个区域的MPU保护
* @param baseaddr: MPU保护区域的基址(首地址)
* @param size:MPU保护区域的大小(必须是32的倍数,单位为字节)
* @param rnum:MPU保护区编号,范围:0~7,最大支持8个保护区域
* @param de:禁止指令访问;0,允许指令访问;1,禁止指令访问
* @param ap:访问权限,访问关系如下:
* @arg 0,无访问(特权&用户都不可访问)
* @arg 1,仅支持特权读写访问
* @arg 2,禁止用户写访问(特权可读写访问)
* @arg 3,全访问(特权&用户都可访问)
* @arg 4,无法预测(禁止设置为4!!!)
* @arg 5,仅支持特权读访问
* @arg 6,只读(特权&用户都不可以写)
* @note 详见:STM32H7编程手册.pdf,4.6.6节,Table 91.
* @param sen:是否允许共用;0,不允许;1,允许
* @param cen:是否允许cache;0,不允许;1,允许
* @param ben:是否允许缓冲;0,不允许;1,允许
* @retval 0, 成功; 1, 错误;
*/
uint8_t mpu_set_protection(uint32_t baseaddr, uint32_t size, uint32_t rnum, uint8_t de, uint8_t ap, uint8_t sen, uint8_t cen, uint8_t ben)
{
MPU_Region_InitTypeDef mpu_region_init_handle; /* MPU初始化句柄 */
HAL_MPU_Disable(); /* 配置MPU之前先关闭MPU,配置完成以后在使能MPU */
mpu_region_init_handle.Enable = MPU_REGION_ENABLE; /* 使能该保护区域 */
mpu_region_init_handle.Number = rnum; /* 设置保护区域 */
mpu_region_init_handle.BaseAddress = baseaddr; /* 设置基址 */
mpu_region_init_handle.Size = size; /* 设置保护区域大小 */
mpu_region_init_handle.SubRegionDisable = 0X00; /* 禁止子区域 */
mpu_region_init_handle.TypeExtField = MPU_TEX_LEVEL0; /* 设置类型扩展域为level0 */
mpu_region_init_handle.AccessPermission = ap; /* 设置访问权限 */
mpu_region_init_handle.DisableExec = de; /* 是否允许指令访问 */
mpu_region_init_handle.IsShareable = sen; /* 是否允许共用 */
mpu_region_init_handle.IsCacheable = cen; /* 是否允许cache */
mpu_region_init_handle.IsBufferable = ben; /* 是否允许缓冲 */
HAL_MPU_ConfigRegion(&mpu_region_init_handle); /* 配置MPU */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); /* 开启MPU */
return 0;
}
/**
* @brief 设置需要保护的存储块
* @note 必须对部分存储区域进行MPU保护,否则可能导致程序运行异常
* 比如MCU屏不显示,摄像头采集数据出错等等问题
* @param 无
* @retval nbytes以2为底的指数值
*/
void mpu_memory_protection(void)
{
/* 保护整个DTCM,共128K字节,允许指令访问,禁止共用,允许cache,允许缓冲 */
mpu_set_protection(0x20000000, MPU_REGION_SIZE_128KB, MPU_REGION_NUMBER1, MPU_INSTRUCTION_ACCESS_ENABLE,
MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
/* 保护整个AXI SRAM,共512K字节,允许指令访问,禁止共用,允许cache,允许缓冲 */
mpu_set_protection(0x24000000, MPU_REGION_SIZE_512KB,MPU_REGION_NUMBER2, MPU_INSTRUCTION_ACCESS_ENABLE,
MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
/* 保护整个SRAM1~SRAM3,共288K字节,允许指令访问,禁止共用,允许cache,允许缓冲 */
mpu_set_protection(0x30000000, MPU_REGION_SIZE_512KB,MPU_REGION_NUMBER3, MPU_INSTRUCTION_ACCESS_ENABLE,
MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
/* 保护整个SRAM4,共64K字节,允许指令访问,禁止共用,允许cache,允许缓冲 */
mpu_set_protection(0x38000000, MPU_REGION_SIZE_64KB, MPU_REGION_NUMBER4, MPU_INSTRUCTION_ACCESS_ENABLE,
MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
/* 保护MCU LCD屏所在的FMC区域,,共64M字节,允许指令访问,禁止共用,禁止cache,禁止缓冲 */
mpu_set_protection(0x60000000, MPU_REGION_SIZE_64MB, MPU_REGION_NUMBER5, MPU_INSTRUCTION_ACCESS_ENABLE,
MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_NOT_CACHEABLE, MPU_ACCESS_NOT_BUFFERABLE);
/* 保护SDRAM区域,共64M字节,允许指令访问,禁止共用,允许cache,允许缓冲 */
mpu_set_protection(0XC0000000, MPU_REGION_SIZE_64MB, MPU_REGION_NUMBER6, MPU_INSTRUCTION_ACCESS_ENABLE,
MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
/* 保护整个NAND FLASH区域,共256M字节,禁止指令访问,禁止共用,禁止cache,禁止缓冲 */
mpu_set_protection(0X80000000, MPU_REGION_SIZE_256MB, MPU_REGION_NUMBER7, MPU_INSTRUCTION_ACCESS_DISABLE,
MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_NOT_CACHEABLE, MPU_ACCESS_NOT_BUFFERABLE);
}
资源
参考文章:HAL库移植正点原子屏幕显示和触摸驱动_正点原子屏幕驱动-CSDN博客
文章下载链接:
通过网盘分享的文件:HAL库移植正点原子屏幕显示和触摸驱动_正点原子屏幕驱动-CSDN博客.mhtml
链接: https://pan.baidu.com/s/1blf8HbvqSc-d7j3mB6I6Jg?pwd=ug33 提取码: ug33
更多推荐



所有评论(0)