(1)根据型号选择芯片
(2)配置RCC,如果板载外部高速/低速晶振,High Speed Clock (HSE)/Low Speed Clock (HSE)选择Crystal/Ceramic Resonator。
(3)配置时钟频率,Clock Configuration。选择HSE,STM32F407ZETx最高支持168M
(4)保存和配置工程,Project Manager。保存路径必须完全英文,否则可能造成无法生成Keil代码。
Toolchain / IDE
分开生成 .c/.h 文件
(5) GENERATE CODE
(1)Connectivity -> USART1,Mode 选择 Asynchronous,生成代码
(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;
(1)Connectivity -> FSMC,开启FSMC LCD1
片选 | NE4 | CS |
内存类型 | LCD接口 | |
数据/地址 选择线 | 根据原理图,此处为A6 | D/C |
数据线宽 | 16 bits | 16位数据线 |
开启扩展模式(写时序),设置时序
(2)配置背光GPIO LCD_BL
(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)可修改屏幕默认方向
(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(); //触摸屏初始化
(1)STM32CubeMX Computing -> CRC 开启
(2)STM32CubeMX FREERTOS LCD进程内存不可太小(512)(如果使用FATFS改为1024)
(3)启用DSP库(F4及以上)
所有lib文件复制到工程目录下
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
(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
(3)STM32CubeMX System Core -> NVIC 修改DMA中断优先级在SDIO之后
(4)STM32CubeMX Middleware -> FATFS -> Mode 选择SD卡
(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