基于STM32H743设计UI界面心得(还没写完)
Posted showtime20190824
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于STM32H743设计UI界面心得(还没写完)相关的知识,希望对你有一定的参考价值。
原料
硬件:STM32H743最小系统板,显示屏(7寸,型号7016),SW下载器,PC,
软件:CUBEMX4.26.0 (软件包1.3.2), MDK5 (软件包版本2.3.1)
①环境配置
1-时钟配置
时钟来源是外部25MHZ的晶振,系统配置后,CPU运行主频400MHZ,其余各个外设的时钟如配置图所示
2-外设配置
根据我们需要用到的硬件设备,配置相应的外设。我们工程中需要用到的硬件设备有:超声波探针-输出模拟信号;7inch RGB显示屏(1024*600)-LTDC接口;wifi模块-UART;开发板自拓展的W9825G6KH(SDRAM)。因此需要用到的外设有:一个ADC,一个串口,FMC(扩展SDRAM),LTDC,其他一些IO口-用于指示灯之类的。OK,了解目标以后,我们的配置就明确多了:
(1)配置SDRAM:
首先在Pinout界面进行如下的配置
再进入configuration界面后,对FMC进行一定的配置(具体为什么这么配置参考FMC使用手册),IO映射没有问题,无需改动。点击Connectivity-FMC
这是CUBEMX帮我配置的驱动,但是对于具体的硬件使用,这是不够的,我们还要对工程添加自己的驱动,再工程中添加以下一些文件,SDRAM部分主要是发送初始化序列。
之后我们打开工程验证一下。我们定义一个1024*1024的u8类型数组(大小为1MB),地址分配在0XC00000000(SDRAM地址起始位置),并在main中对其使用(赋值即可),可以发现,如果不使用外扩的内存,仅仅依靠芯片本身的1056MB(其中包含仅CPU和DMA访问的内存,并且地址不连续)的SRAM,系统是无法运行的,因为运行内存不够,但是经过我们外扩SDRAM后,内存扩展了32MB,此时可以满足运行条件,系统正常工作。
至此,我们的SDRAM已经配置完成,可以将其用于液晶显示屏的显存运行内存。
(2)配置LTDC:
用CUBEMX帮我们配置的外设IO引脚和我们实际接口有出入(重映射),需要我们手动更改引脚配置以满足实际需求。我们对比正点原子写的驱动配置和CUBEMX的驱动配置:
发现主要需要改动的引脚有:
-
-
- 引脚转换 功能
- PA8 -> PG11 LTDC_B3
- PA5 -> PH10 LTDC_R4
- PA6 -> PH13 LTDC_G2
- PC9 -> PH14 LTDC_G3
- PB10 -> PH15 LTDC_G4
- PH4 -> PI0 LTDC_G5
- PI11->PI1 LTDC_G6
- PA10 -> PI4 LTDC_B4
- PA3 -> PI5 LTDC_B5
- PB8 -> PI6 LTDC_B6
- PB9 -> PI7 LTDC_B7
-
把所有的IO速度都配置为GPIO_SPEED_FREQ_VERY_HIGH,最后再添加PB5用于控制显示屏的背光,直接配置为OUTPUT即可
其实到这一步,我们的配置是不完整的,我们再添加正点原子官方写的驱动,稍作修改,即完成配置(这里解释一下既然用的是别人的驱动,为什么上面还要这么复杂的配置:是因为CUBEMX生成工程文件后,我们的初始化中用到HAL_LTDC_MspInit函数存在重复定义,因此我们舍弃原子哥写的函数,不然每次都要再fmc.c中添加__weak,太麻烦了,所以我们对上面的IO配置后,相当于让软件配置的HAL_LTDC_MspInit代替原子哥的函数)。
至此,我们完成了LTDC接口的全部配置,在atk_ltdc.c中,我们声明了一个长度为1024*600的u16类型的二维数组(2*600*1024B=1200KB=1.2MB),用于RGB显示屏的运行显存,这也就体现了为什么使用RGB显示屏一定要先拓展内存的理由。
(3)QSPI
(4)USB OTG
3-软件
(1)嵌入式操作系统
在一个复杂的嵌入式应用中,操作系统的使用可以极大提高系统运行的鲁棒性和效率,整个系统各任务的执行可以不用再拘泥于中断,事件等。本次实验是为了以后研发产品做基础,因此,操作系统的嵌入式是非常有必要的。小型嵌入式操作系统种类有很多,比如FREERTOS,UCOSII,UCOSIII,RTThread等,CUBEMX软件可以帮我们搭建FREERTOS的框架,只需要在图形配置界面简单操作,即可省区繁琐的系统驱动移植过程。下面就介绍如何在CUBEMX中配置我们的嵌入式操作系统。
我们在MiddleWares中Enable一下FREERTOS
将一个定时器配置为操作系统的滴答时钟,比如下面的配置中我们用的是TIM6,因为这个定时器功能最少,少一个也没什么影响
进入configuration界面,点开freertos,进入配置界面,配置如下:
红色框中的参数建议修改一下,这些分别是:单个任务配置的stack空间大小,任务名最大长度,是否使能计数信号量,操作系统总内存。其他参数按照默认的就行了,然后我们就可以开心的添加任务了,再配合信号量,计时器,互斥量等工具,就可以顺利地让操作系统运行起来了。
比如在我地另一个嵌入式应用中,我一共创建了十几个任务,通过共享一些信号量,可以保证整个进程有条不紊地运行,关于操作系统的工作原理,建议百度简单了解一下。
另外,我们还可以看到FreeRTOS中内存的分配情况,提醒一下,有些任务可能需要的运行内存较大,比如你在里面定义了一个长数组,如果分配的内存不足的话,系统运行会出现问题。
好了,现在我们添加两个任务,简单控制一下两个LED的Blink:
最后再生成工程文件,打开进入freertos.c中,再任务函数中简单加入控制LED的代码
void LED0Blink(void const * argument) { /* USER CODE BEGIN LED0Blink */ /* Infinite loop */ for(;;) { osDelay(500); LED1_Toggle; } /* USER CODE END LED0Blink */ } /* LED1Blink function */ void LED1Blink(void const * argument) { /* USER CODE BEGIN LED1Blink */ /* Infinite loop */ for(;;) { osDelay(200); LED0_Toggle; } /* USER CODE END LED1Blink */ }
可以看到整个框架已经帮我们搭好了,加深的代码就是我们添加的控制代码。
至此,我们的嵌入式操作系统已经配置完了。
(2)-FATFS文件系统
文件系统可以让我们数据规范化的保存和传递,对于一般的小型嵌入式应用,如果需要实现数据可视化,一个好的文件系统可以提供极大的帮助。举个例子,比如我们做了一个记录空气温度,湿度的设备,数据记录后上传给服务器,再在后台处理,传递的方式一种是直接通过一些通讯方式,比如USART,SPI,IIC等,但是这些都会涉及到通讯协议,还有一种方式是直接将存有数据的文件,比如CSV,TXT文件,传递给后台。显然,传递文件的形式肯定更受欢迎,相应的API也方便调用,这就是使用文件系统的必要性。
说起文件系统,就必须要谈到内存的问题了,这个内存不是我们之前说的运行内存(RAM),因为这些内存掉电以后数据就消失了,而是硬盘内存。然而,STM32H743自带的FLASH只有2M,还要考虑到程序和常量的存放问题,所以我们一般是需要外部扩展内存的。这里需要用到QSPI接口拓展一个32MB的FLASH(NAND FLASH和SD卡也是不错的选择,这里选择SPI FLASH的原因是我们的最小系统板已经帮我们扩展好了这样一块内存,就直接拿来用了,当然你再买一块SD卡插在SD卡槽里也是没有问题的,外设需要再相应的配置一下)
②硬件
我们再复习一下上面提到的各种硬件设备,并附图:
1-显示屏
我们用的显示屏类型为RGB显示屏,色彩配置为RGB565(如果是ARGB8888,那需要的运行内存就要大一倍,小的嵌入式应用没有这个必要,565色彩已经很丰富了),大小为7inch,型号为7016(像素1024*600),通过LTDC接口与CPU交流,接线中通过40-pin的软排线连接
2-内存
(1)SDRAM
该内存主要用于申请显示屏的运行内存,也是我们的最小系统板帮我们拓展好的(贴心),大小32MB(实际只用到1.2MB左右),内存地址0XC0000000,通过FMC接口与CPU交流
下图我们程序的运行内存,可以看到,运行内存差不多也就1.2MB多一点,和我们的理论值差不多
(2)SPI FLASH
这部分的内存是给我们的文件系统的,或者存放中文字库也可以,可以用SD Card或者其他内存盘代替。所用硬件为W25Q256,通讯方式为SPI,大小32MB
(3)SD Card
等我什么时候买了SD卡再更新吧
3-USB
4-传感器
③算法
以上是关于基于STM32H743设计UI界面心得(还没写完)的主要内容,如果未能解决你的问题,请参考以下文章
RT-Thread STM32H743 NUCLEO 以太网
STM32H743ZI Nucleo 似乎无法通过 FDCAN 2 传输?
懂c#的进!我设计了一个wpf程序。界面上有两个radiobutton控件,还有一个button控件。还没写完的部分代码