STM32F407通过STM32CubeMX建立工程、移植驱动

一. 建立STM32CubeMX工程

(1)根据型号选择芯片

STM32F407通过STM32CubeMX建立工程、移植驱动_第1张图片

(2)配置RCC,如果板载外部高速/低速晶振,High Speed Clock (HSE)/Low Speed Clock (HSE)选择Crystal/Ceramic Resonator。

STM32F407通过STM32CubeMX建立工程、移植驱动_第2张图片

(3)配置时钟频率,Clock Configuration。选择HSE,STM32F407ZETx最高支持168M

STM32F407通过STM32CubeMX建立工程、移植驱动_第3张图片

(4)保存和配置工程,Project Manager。保存路径必须完全英文,否则可能造成无法生成Keil代码。

Toolchain / IDE

STM32F407通过STM32CubeMX建立工程、移植驱动_第4张图片

分开生成 .c/.h 文件

STM32F407通过STM32CubeMX建立工程、移植驱动_第5张图片

 (5) GENERATE CODE

二. 配置串口

(1)Connectivity -> USART1,Mode 选择 Asynchronous,生成代码

STM32F407通过STM32CubeMX建立工程、移植驱动_第6张图片

(2) printf重定向

usart.c 

/* USER CODE BEGIN 0 */ 后

#if 1
//#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重映射fputc
int fputc(int ch,FILE *f)
{
	uint8_t temp[1] = {ch};
	HAL_UART_Transmit(&huart1, temp, 1, 2);
	return ch;

}
#endif 

 usart.h 

/* USER CODE BEGIN Includes */ 后

#include "stdio.h"

/* USER CODE BEGIN Private defines */ 后

typedef struct __FILE FILE;

三. 配置TFT LCD

(1)Connectivity -> FSMC,开启FSMC LCD1

片选 NE4 CS
内存类型 LCD接口
数据/地址 选择线 根据原理图,此处为A6

D/C 

数据线宽 16 bits 16位数据线

STM32F407通过STM32CubeMX建立工程、移植驱动_第7张图片

开启扩展模式(写时序),设置时序

 STM32F407通过STM32CubeMX建立工程、移植驱动_第8张图片

(2)配置背光GPIO LCD_BL

STM32F407通过STM32CubeMX建立工程、移植驱动_第9张图片

(3)开启 FREERTOS 操作系统

MiddleWare -> FREERTOS, CMSIS_V1

System Core -> SYS, Timebase Source 需要设置为SysTick(默认值,原子驱动只支持SysTick时基,但是STM32CubeMX保存会提示可能出现问题)

(4)复制delay(LCD延时,使用SysTick)和sys(定义常用的数据类型短关键字 u16 u32等)

SYSTEM\delay\delay.c&delay.h

SYSTEM\sys\sys.c&sys.h

(5)复制LCD驱动

 HARDWARE\LCD\font.h&lcd.c&lcd.h

屏蔽lcd.c中GPIO FSMC初始化代码:30、586-620、627-688

(6)初始化LCD,main.c   /* USER CODE BEGIN 2 */后(需要在GPIO初始化后)

 LCD_Init();           			//初始化LCD FSMC接口

(6)屏幕方向

lcd.c 2099 LCD_Display_Dir(1)可修改屏幕默认方向

四. 配置LCD 触摸

(1)24C02 IIC

STM32CubeMX配置24C02 IIC GPIO模式(原子使用模拟IIC)

AT24C_IIC_SCL
AT24C_IIC_SDA

复制模拟IIC

HARDWARE\IIC\myiic.c&myiic.h 

屏蔽myiic.c中GPIO初始化代码:19-29

复制24cxx驱动

HARDWARE\24CXX\24cxx.c&24cxx.h 

触摸屏校准数据地址 SAVE_ADDR_BASE 40
x校准参数 SAVE_ADDR_BASE
y校准参数 SAVE_ADDR_BASE+4
x偏移量 SAVE_ADDR_BASE+8
y偏移量 SAVE_ADDR_BASE+10
标记字 SAVE_ADDR_BASE+13 0X0A

(2)触摸Touch

STM32CubeMX配置触摸屏GPIO模式

T_CS

T_SCK

T_PEN

T_MISO

T_MOSI

复制触摸屏驱动

HARDWARE\TOUCH\ctiic.c&ctiic.h&ft5206.c&ft5206.h>9147.c>9147.h&ott2001a.c&ott2001a.h&touch.c&touch.h

屏蔽touch.c中GPIO初始化代码:484-506

 (3)初始化触摸屏,main.c   /* USER CODE BEGIN 2 */后,已包含24cxx初始化(需要在GPIO初始化后)

tp_dev.init();				    //触摸屏初始化 

五. 移植EMWIN

(1)STM32CubeMX Computing -> CRC 开启

(2)STM32CubeMX FREERTOS LCD进程内存不可太小(512)(如果使用FATFS改为1024)

(3)启用DSP库(F4及以上)

所有lib文件复制到工程目录下

STM32F407通过STM32CubeMX建立工程、移植驱动_第10张图片

Keil添加文件

Drivers\CMSIS\DSP\Include\arm_math.h

Drivers\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib

 Keil Define加入(HAL库新版本=1U,老版本=1)

USE_STDPERIPH_DRIVER,__FPU_PRESENT = 1U,__FPU_USED=1U,ARM_MATH_CM4,__CC_ARM

(4)复制MALLOC(动态内存分配)、XMRAM(外部RAM)

MALLOC\malloc.c&malloc.h

XMRAM\XMRAM.h&XMRAM.lib

(5)复制EMWIN

EMWIN\STemWin\Config&inc&Lib&OS

EMWIN\STemWin\Config 下新建 LCDConf.h(可直接为空)

#ifndef LCDCONF_H
#define LCDCONF_H

#endif 

STM32F407通过STM32CubeMX建立工程、移植驱动_第11张图片

(6)外部SRAM GUIConf.c 配置

未使用

#define USE_EXRAM  0//使用外部RAM
//设置EMWIN内存大小
#define GUI_NUMBYTES  (40*1024)

使用

#define USE_EXRAM  1//使用外部RAM
//设置EMWIN内存大小
#define GUI_NUMBYTES  (500*1024)

 (7)触摸翻转

GUIDRV_Template.c  88

if(lcddev.dir == 0) //竖屏
{				
    GUI_TOUCH_SetOrientation(GUI_MIRROR_Y);	 //设置反转Y
	GUI_TOUCH_Calibrate(GUI_COORD_X,0,lcddev.width,155,3903);
	GUI_TOUCH_Calibrate(GUI_COORD_Y,0,lcddev.height,188,3935);
}else //横屏
{
	//GUI_TOUCH_SetOrientation(GUI_SWAP_XY|GUI_MIRROR_Y); 
    GUI_TOUCH_SetOrientation(GUI_SWAP_XY);  //取消反转Y
	GUI_TOUCH_Calibrate(GUI_COORD_X,0,240,155,3903); 	
	GUI_TOUCH_Calibrate(GUI_COORD_Y,0,320,188,3935);
}

 (8)如果出现花屏,可尝试在 GUI_Init() 前添加延时

HAL_Delay(100);                 //延时等待LCD初始化,否则可能会花屏
GUI_Init();  					//STemWin初始化

五. 移植FATFS

(1)STM32CubeMX Connectivity -> SDIO -> SD 4 bits Wide bus

(2)开启DMA

STM32F407通过STM32CubeMX建立工程、移植驱动_第12张图片

(3)STM32CubeMX System Core -> NVIC 修改DMA中断优先级在SDIO之后

STM32F407通过STM32CubeMX建立工程、移植驱动_第13张图片

(4)STM32CubeMX Middleware -> FATFS -> Mode 选择SD卡

STM32F407通过STM32CubeMX建立工程、移植驱动_第14张图片

(5)如果板子没有TF卡插入检测脚,无需设置,无视警告即可

(6)将FREERTOS进程堆栈调大,否则可能造成死机

 (7)读取TF中 a.txt 示例

FRESULT f_res;
FATFS fs;
FIL fp;
BYTE work[_MAX_SS]; /* Work area (larger is better for process time) */

GUI_SetBkColor(GUI_WHITE);
GUI_SetColor(GUI_BLACK);
GUI_Clear();					//清屏
GUI_DispStringAt("FATFS TEST", 30, 30);
	 
f_res = f_mount(&fs, "0:",1); 					//挂载SD卡 
// 	f_res = f_mount(fs[1],"1:",1); 				//挂载FLASH.	
if(f_res == FR_NO_FILESYSTEM)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
{
	GUI_DispStringAt("Flash Disk Formatting...", 30, 50);	//格式化FLASH
	f_res = f_mkfs("0:", FM_ANY, 0, work, sizeof work);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
	if(f_res==FR_OK)
	{
//		f_setlabel((const TCHAR *)"1:ZYX-TF");	//设置Flash磁盘的名字为:ZYX-TF
		f_res = f_mount(NULL, "0:", 1);
		/* 重新挂载 */
        f_res = f_mount(&fs, "0:", 1);
		GUI_DispStringAt("Flash Disk Format Finish", 30,50);	//格式化完成
	}
	else{
		GUI_DispStringAt("Flash Disk Format Error ", 30,50);	//格式化失败
		while(1){
			GUI_Delay(100);
		}
	}
}else if(f_res != FR_OK){
	GUI_DispStringAt("Mount Error ", 30,70);	//格式化失败
	GUI_DispHex(f_res, 2);
	while(1){
		GUI_Delay(2000);
	}
}
else
{
	GUI_DispStringAt("Mount Success ", 30,70);	//格式化成功
}									    	

f_res = f_open(&fp, "a.txt", FA_READ );
if(f_res == FR_OK)
{
	UINT br=1;
    uint16_t a=0;
	char buff[256];
	GUI_DispStringAt("Open File Success", 30,90);
    for(;;)
    {
       for(a=0;a<256;a++) buff[a]=0;
       f_res=f_read(&fp,buff,sizeof(buff),&br);
       GUI_DispString(buff);
       if(f_res||br

你可能感兴趣的:(STM32,stm32,单片机,arm)