说明

在使用正点原子的 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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐