本帖最后由 xld0932 于 2022-4-27 14:52 编辑
#申请原创# @21小跑堂
介绍 MM32F3270系列是灵动在2021年3月中旬发布的一款全新的主流MCU型号。MM32F3270系列使用高性能的ARM Cortex-M3作为内核,最高工作频率可以达到120MHz,带有512KB的FLASH和128KB的SRAM,具有2.0V~5.5V的宽工作电压和-40℃~105℃的宽工作温度,并配有丰富的外设,适用于要求高集成度的高性能控制领域,如工业控制、安防监控、家电领域、通讯等应用。
功能 MM32F3270系列MCU配有丰富的外设,支持多达8路的UART、1路CAN接口、3路SPI/I2S接口等等;其中UART还支持红外IrDA、智能卡、多机通讯、波特率自动检测、LIN通讯等功能。本文主要结合CAN、SPI和UART这3个外设功能来实现CAN通讯、RS-232通讯、RS-485通讯、LIN Master和LIN Slave通讯、以及SPI读写TF卡操作的功能;通过SPI对TF卡底层的操作,结合开源的FatFs0.14b,来实现对TF卡的文件管理系统。
硬件原理图设计 MM32F3270系列MCU支持2.0V~5.5V的宽范围工作电压,所以整个系统的电源我们使用MiniUSB接口进行供电,通过LDO(ASM1117-3.3V)将USB的5.0V电源转变成3.3V的系统工作电压,使用JTAG接口对芯片进行程序烧录和调试,同时还支持SWD接口模式。支持按键复位的复位电路,支持按键切换的BOOT模式选择,以及MCU电源旁路电容、RTC和MCU时钟晶振电路,组成了MM32F3270的最小工作系统。
MM32F3270系列MCU带有一路CAN接口,我们使用SN65HVD230DR作为外部CAN收发器,终端电阻通过两个60欧姆串联再并一个电容到地的连接方式,可以增加系统的稳定性和抗共模干扰的能力,并在CAN_H和CAN_L端增加了ESD防护。
MM32F3270系列MCU带有8路UART,我们使用其中一路连接CH340芯片,通过USB转UART来实现程序在运行过程中的调试信息交互;其中一路通过连接SP3232ECY芯片来实现RS-232的收发电路;其中一路通过使用TP8485E芯片来实现RS-485的收发电路,同时将UART的TX引脚通过SN74LVC1G14DBVR反相器连接到RE和DE引脚上,实现RS-485的硬件自动收发控制电路,在AB两端放置了120欧姆的终端电阻以及相应的防护器件,可以达到ESD三级防护效果;另外两路通过TJA1021T芯片结合不同外围应用电路来分别实现LIN主机和LIN从机的通讯电路。
具体原理图参考设计如下图所示:
硬件PCB绘制 PCB的绘制使用了立创EDA设计软件,对于习惯使用AD的小伙伴来说,立创EDA软件上手相当容易;软件易于操作,可以将原理图转换成PDF或者图片格式,可以自动生成BOM表,在立创商场上购买元器件、可以将绘制好的PCB用2D或者3D的效果承现出来,通过DRC检测生成Gerber生产文件,在嘉立创直接下单打样PCB板子。
回板焊接调试 需要注意的是整个板子的系统工作电压是3.3V,所以在调试LIN通讯功能的时候,VBAT是需要外接电源供电的,在LIN主从机接口上已经预留了VBAT引脚位。
调试底层驱动 我们从官网上下载MM32F3270库函数和例程,将底层库驱动程序提取出来创建一个新工程,在新工程中添加之前的TASK任务调试和LETTER-SHELL开源代码功能,参考官方的CAN、UART、SPI示例程序完成对CAN通讯、RS-232通讯、RS-485通讯以及SPI接口的初始化操作,通过参考MM32F3270的数据手册和用户手册完成了对LIN主机、LIN从机的配置和通讯测试,通过参考TF卡的手册,通过SPI接口完成了对TF卡的初始化以及对块的读写、格式化等操作。在调试过程中我们使用到了TF卡、USB转RS-232线、USB转RS-485线、以及图莫斯的CAN&LIN Analyser调试工具、J-LINK等工具。具体的底层驱动程序可以参考附件中的软件工程源代码。
移植FatFs文件系统 FatFs是一个用于小型嵌入式系统的通用FAT/exFAT文件系统。FatFs软件代码遵循ASCI C(C89)进行编写,与磁盘接口层完全分离。因此它具有很好的移植性,适用于资源有限的微控制器中,也是我们常用的文件系统之一。当前FatFs最新的版本为0.14b,可以到官网上下载得到。对于FatFs文件系统的移植,其实也比较简单,一是配置ffconf.h文件中的宏开关定义,通过这些宏定义来使能或关闭相应的文件系统操作功能;二是移植操作磁盘的底层接口实现,磁盘可以是SPI FLASH、可以是U盘、可以是TF卡等等其它存储介质;我们这里在diskio.c文件中实现相应的功能函数接口,调用的是SPI底层操作TF卡的代码,具体接口函数代码如下所示: #include "ff.h" /* Obtains integer types */
#include "diskio.h" /* Declarations of disk functions */
#include "config.h"
/*-----------------------------------------------------------------------*/
/* Get Drive Status */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
return (DSTATUS)TFCARD_Disk_Status();
}
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
return 0;//(DSTATUS)TFCARD_Disk_Initialize();
}
/*-----------------------------------------------------------------------*/
/* Read Sector(s) */
/*-----------------------------------------------------------------------*/
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE *buff, /* Data buffer to store read data */
LBA_t sector, /* Start sector in LBA */
UINT count /* Number of sectors to read */
)
{
if(TFCARD_Disk_Read(buff, sector, count))
return RES_PARERR;
else
return RES_OK;
}
/*-----------------------------------------------------------------------*/
/* Write Sector(s) */
/*-----------------------------------------------------------------------*/
#if FF_FS_READONLY == 0
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE *buff, /* Data to be written */
LBA_t sector, /* Start sector in LBA */
UINT count /* Number of sectors to write */
)
{
if(TFCARD_Disk_Write(buff, sector, count))
return RES_PARERR;
else
return RES_OK;
}
#endif
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions */
/*-----------------------------------------------------------------------*/
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
DRESULT res = RES_OK;
switch(cmd)
{
case CTRL_SYNC:
break;
case GET_SECTOR_COUNT:
*(WORD *)buff = TFCARD_Disk_Sectors();
break;
case GET_SECTOR_SIZE:
*(WORD *)buff = 512;
break;
case GET_BLOCK_SIZE:
*(WORD *)buff = 1;
break;
default:
res = RES_PARERR;
break;
}
return res;
}
DWORD get_fattime(void)
{
DWORD ret_val = 0;
/* 2020-10-12 18:05:10 */
ret_val = (20 << 25)
+ (10 << 21)
+ (12 << 16)
+ (18 << 11)
+ (05 << 5)
+ (10 / 2);
return ret_val;
}
FatFs文件系统示例及运行结果 我们这边只是例举了一个简单的功能:预先在TF卡中存放一个HELLO.TXT文件,在芯片上电后运行程序,初始化TF卡及FatFs文件系统,从TF卡中打开并读取HELLO.TXT文件中的内容,在SHELL终端上进行打印输出。
附件
后续 在后面会基于这套硬件环境,根据每一个接口的应用做相应的内容分享帖子。那为什么第一篇就要移植FatFs文件系统呢?那是因为在后面的分享帖中需要使用到哈
|