基于STM32+CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(下篇)

发布者:DelightfulGaze最新更新时间:2024-05-27 来源: elecfans关键字:STM32  NAND  FATFS 手机看文章 扫描二维码
随时随地手机看文章

四、移植FATFS文件系统

前面第3章,完成了SD NAND的驱动代码编写,这一章节实现FATFS文件的移植。


4.1 FATFS文件系统介绍

(1)介绍

FatFs 是一种完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C 语言编写,所以具有良好的硬件平台独立性,可以移植到 8051、 PIC、 AVR、 SH、 Z80、 H8、 ARM 等系列单片机上而只需做简单的修改。它支持 FATl2、 FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。


(2)特点

【1】Windows兼容的FAT文件系统

【2】不依赖于平台,易于移植

【3】代码和工作区占用空间非常小

【4】多种配置选项

【5】多卷(物理驱动器和分区)

【6】多ANSI/OEM代码页,包括DBCS

【7】在ANSI/OEM或Unicode中长文件名的支持

【8】RTOS的支持

【9】多扇区大小的支持

【10】只读,最少API,I/O缓冲区等等


(3)移植性

fatfs模块是ANSI C(C89)编写的。 没有平台的依赖, 编译器只要符合ANSI C标准就可以编译。


fatf模块假设大小的字符/短/长8/16/32位和int是16或32位。 这些数据类型在integer.h文件中定义。这些数据类型在大多数的编译器中定义都符合要求。 如果现有的定义与编译器有任何冲突发生时,需要自己解决。


4.2 下载源码

13.png

FATFS有两个版本,一个大版本,一个小版本。小版本主要用于8位机(内存小)使用。

下载图:

14.png



4.3 源码结构介绍

将下载的源码解压后可以得到两个文件夹: doc 和 src。 doc 里面主要是对 FATFS 的介绍(离线文档—英文和日文),而 src 里面才是我们需要的源码。

其中,与平台无关的是:

ffconf.h FATFS配置文件

ff.h 应用层头文件

ff.c 应用层源文件

diskio.h 硬件层头文件

interger.h 数据类型定义头文件

option 可选的外部功能(比如支持中文等)


与平台相关的代码:


diskio.c 底层接口文件(需要用户提供)



FATFS 模块在移植的时候,我们一般只需要修改 2 个文件,即 ffconf.h 和 diskio.c。

FATFS模块的所有配置项都是存放在 ffconf.h 里面,我们可以通过配置里面的一些选项,来满足自己的需求。

15.png


最顶层是应用层,使用者无需理会 FATFS 的内部结构和复杂的 FAT 协议,只需要调用FATFS 模块提供给用户的一系列应用接口函数,如 f_open, f_read, f_write 和 f_close 等,就可以像在 PC 上读写文件那样简单。


中间层 FATFS 模块, 实现了 FAT 文件读/写协议。 FATFS 模块提供的是 ff.c 和 ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。


需要我们编写移植代码的是 FATFS 模块提供的底层接口,它包括存储媒介读/写接口 ( disk、I/O) 和供给文件创建修改时间的实时时钟。


4.4 下载源码并加入到工程

先准备好一个有SD NAND驱动代码的STM32工程(代码前面第3章已经贴了),接着就完成下面的步骤。

16.png

打开KEIL工程,添加FATFS文件源码:

17.png18.png



加入.h文件主要是方便配。cc936.c 用于支持中文。

4.5 修改代码进行移植

(1)修改diskio.c文件

19.png




注释掉现在不需要的用到的文件,因为我们现在用的是SD卡,与USB,ATA,MMC卡没关系。


并加入一个新的宏 :


#define SD 0


定义SD卡的物理驱动器号为0。


修改 disk_status函数,该函数主要是用来获取磁盘状态。现在未用到,可以直接函数体内代码删除。


修改截图:

20.png

代码示例:


#include 'diskio.h' /* fatf底层API */

#include 'sd.h' /* SD卡驱动头文件 */

/* 定义每个驱动器的物理驱动器号*/

#define SD 0


/*-----------------------------------------------------------------------*/

/* 获取设备(磁盘)状态 */

/*-----------------------------------------------------------------------*/


DSTATUS disk_status (

BYTE pdrv /* 物理驱动识别 */

)

{

return 0; //该函数现在无需用到,直接返回0

}


修改disk_initialize函数,添加SD卡的初始化,其他不用到的代码直接删掉,该函数成功返回0,失败返回1。

修改截图:

21.png


代码示例:


/*-----------------------------------------------------------------------*/

/* 初始化磁盘驱动 */

/*-----------------------------------------------------------------------*/


DSTATUS disk_initialize (

BYTE pdrv /* 物理驱动识别 */

)

{

DSTATUS stat;

int result;


switch (pdrv) {

case SD : //选择SD卡

stat=SD_Init(); //初始化SD卡-用户自己提供

}

if(stat)return STA_NOINIT; //磁盘未初始化

return 0; //初始化成功

}


修改disk_read函数,加入SD卡读任意扇区的函数(需要用户自己提供),其他不用到的选项可以删掉。

22.png


修改代码如下:


/*-----------------------------------------------------------------------*/

/* 读扇区 */

/*-----------------------------------------------------------------------*/

DRESULT disk_read (

BYTE pdrv, /* 物理驱动编号 - 范围0-9*/

BYTE *buff, /* 数据缓冲区存储读取数据 */

DWORD sector, /* 扇区地址*/

UINT count /* 需要读取的扇区数*/

)

{

DRESULT res;

int result;

switch (pdrv) {

case SD:

res=SD_Read_Data((u8*)buff,sector,count); //读SD扇区函数--用户提供

return res; //在此处可以判错误

}

return RES_PARERR; //无效参数

}


修改disk_write 函数,添加写扇区函数:

23.png

代码:

/*-----------------------------------------------------------------------*/

/* 写扇区 */

/*-----------------------------------------------------------------------*/


#if _USE_WRITE

DRESULT disk_write (

BYTE pdrv, /* 物理驱动号*/

const BYTE *buff, /* 要写入数据的首地址 */

DWORD sector, /* 扇区地址 */

UINT count /* 扇区数量*/

)

{

DRESULT res;

int result;


switch (pdrv) {

case SD:

res=SD_Write_Data((u8*)buff,sector,count); //写入扇区

return res;

}

return RES_PARERR; //无效参数

}

#endif


修改disk_ioctl 函数,填充ioctl命令功能。这些功能是标准的命令,在diskio.h有定义。

24.png

代码如下:


/*-----------------------------------------------------------------------*/

/* 其他函数 */

/*-----------------------------------------------------------------------*/


#if _USE_IOCTL

DRESULT disk_ioctl (

BYTE pdrv, /* 物理驱动号 */

BYTE cmd, /* 控制码 */

void *buff /* 发送/接收数据缓冲区地址 */

)

{

DRESULT res;

int result;


switch (pdrv) {

case SD:

switch(cmd)

{

case CTRL_SYNC: //等待写过程

SD_CS(0); //选中SD卡

if(SD_Wait_Ready())result = RES_ERROR;/*等待卡准备好*/

else res = RES_OK; //成功

SD_CS(1); //释放SD卡

break;


case GET_SECTOR_SIZE://获取扇区大小

*(DWORD*)buff = 512;

res = RES_OK; //成功

break;


case GET_BLOCK_SIZE: //获取块大小

*(WORD*)buff = 8; //块大小(扇区为单位),一块等于8个扇区

res = RES_OK;

break;


case GET_SECTOR_COUNT: //获取总扇区数量

*(DWORD*)buff = SD_Get_Sector_Count();

res = RES_OK;

break;


default: //命令错误

res = RES_PARERR;

break;

}

return res;

}

return RES_PARERR; //返回状态

}


(2)修改ffconf.h文件

需要注意的一些宏配置:


#define _CODE_PAGE 936 //采用中文GBK编码 (64行)

#define _USE_LFN 3 //动态的堆上工作 (93行)

#define _MAX_LFN 255 /*_USE_LFN选项开关LFN(长文件名)特性。

#define _VOLUMES 1 /* 支持的磁盘数量(逻辑驱动器)。 */ (142行)

#define _MIN_SS 512 (165行)

#define _MAX_SS 512 /*这些选项配置支持扇区大小的范围。(512,1024, 4096*/

#define _FS_NORTC 0 /*启用RTC时间功能*/ (202行)

#define _NORTC_MON 1

#define _NORTC_MDAY 1

#define _NORTC_YEAR 2015 //年

/*需要实现:get_fattime()函数*/


ffconf.h 文件源码:


/*---------------------------------------------------------------------------/

/ FatFs - FAT文件系统模块配置文件 R0.11a (C)ChaN, 2015

/---------------------------------------------------------------------------*/


#define _FFCONF 64180 /* 版本识别*/


/*---------------------------------------------------------------------------/

/ 功能配置

/---------------------------------------------------------------------------*/


#define _FS_READONLY 0

/* 这个选项开关只读配置。(0:读/写或1:只读)

/只读配置删除编写API函数,f_write(),f_sync(),

/ f_unlink(),f_mkdir(),f_chmod(),f_rename(),f_truncate(),f_getfree()

/写和可选的功能. */



#define _FS_MINIMIZE 0

/*此选项定义删除一些基本的API函数极小化水平。

/

/ 0:所有基本功能都是激活的。

/ 1:f_stat(),f_getfree(),f_unlink(),f_mkdir(),f_chmod(),f_utime(),

/ f_truncate()和f_rename()函数删除。

/ 2:f_opendir(),f_readdir()和f_closedir()中除了1。

/ 3:f_lseek()函数删除除了2。*/



#define _USE_STRFUNC 1

/*这个选项开关字符串函数,f_gets(),f_putc(),f_puts()和

/ f_printf()。

/

/ 0:禁用字符串函数。

/ 1:启用没有LF-CRLF转换。

/ 2:启用LF-CRLF(回车换行)转换。*/



#define _USE_FIND 0

/*这个选项开关过滤目录读取特性和相关功能,

/ f_findfirst()和f_findnext()。(0:禁用或1:启用)*/



#define _USE_MKFS 1

/* 这个选项开关f_mkfs()函数。(0:禁用或1:启用) */



#define _USE_FASTSEEK 1

/* 这个选项开关快速寻求功能。(0:禁用或1:启用) */



#define _USE_LABEL 1

/* 磁盘卷标这个选项开关功能,f_getlabel()和f_setlabel()。

/(0:禁用或1:启用) */



#define _USE_FORWARD 0

/* 这个选项开关f_forward()函数。(0:禁用或1:启用)

/启用它,也_FS_TINY需要设置为1. */



/*---------------------------------------------------------------------------/

/ 语言环境和名称空间配置

/---------------------------------------------------------------------------*/


#define _CODE_PAGE 936 //采用中文GBK编码

/*这个选项指定OEM代码页在目标系统上使用。

/不正确的代码页的设置会导致文件打开失败.

/

/ 1 - ASCII (没有扩展字符。Non-LFN cfg。只有)

/ 437 - U.S.

/ 720 - 阿拉伯语

/ 737 - 希腊语;

/ 771 - 阿富汗

/ 775 - 波罗的海

/ 850 - 拉丁1

/ 852 - 拉丁2

/ 855 - 西里尔字母

/ 857 - 土耳其语

/ 860 - 葡萄牙语

/ 861 - 冰岛语

/ 862 - 希伯来人

/ 863 - 加拿大法语

/ 864 - 阿拉伯语

/ 865 - 日耳曼民族的

/ 866 - 俄语

/ 869 - 希腊 2

/ 932 - 日本人 (DBCS)

/ 936 - 简体中文(DBCS)

/ 949 - 韩国人 (DBCS)

/ 950 - 繁体中文(DBCS)

*/



#define _USE_LFN 3 //动态的堆上工作

#define _MAX_LFN 255

/*_USE_LFN选项开关LFN(长文件名)特性。

/

/ 0:禁用LFN特性。_MAX_LFN没有影响。

/ 1:启用LFN BSS静态工作缓冲区。总是不是线程安全的。

/ 2:启用LFN与动态缓冲栈上的工作。

/ 3:使LFN与动态缓冲区在堆上工作。

/

/ 当启用LFN(长文件名)特性,Unicode(选项/ unicode.c)必须处理功能

/被添加到项目中。LFN工作缓冲区占用(_MAX_LFN + 1)* 2字节。

/当使用堆栈缓冲区,照顾堆栈溢出。当使用堆

/工作缓冲区内存,内存管理功能,ff_memalloc()和

/ ff_memfree(),必须添加到项目中。 */



#define _LFN_UNICODE 0

/* 这个选项开关字符编码的API。(0:ANSI / OEM或1:Unicode)

路径名/使用Unicode字符串,并设置_LFN_UNICODE启用LFN特性

/1。这个选项也会影响行为的字符串的I / O功能。

*/



#define _STRF_ENCODE 3

/* 当_LFN(长文件名)_UNICODE是1,这个选项选择文件的字符编码

/通过字符串读取/写入I /O功能,f_gets(),f_putc(),f_puts和f_printf().

/

/ 0: ANSI/OEM

/ 1: UTF-16LE

/ 2: UTF-16BE

/ 3: UTF-8

/

/ 当_LFN_UNICODE = 0时,该选项没有影响。*/


#define _FS_RPATH 0

/*这个选项配置相对路径的功能。/

/ 0:禁用相对路径特性和删除相关功能。

/ 1:启用相对路径特性。f_chdir()和f_chdrive()是可用的。

/ 2:f_getcwd()函数可用除了1。/

/注意,目录项读通过f_readdir()这个选项。

*/


/*---------------------------------------------------------------------------/

/ 驱动/卷配置

/---------------------------------------------------------------------------*/



#define _VOLUMES 1

/* 支持的磁盘数量(逻辑驱动器)。 */



#define _STR_VOLUME_ID 0

#define _VOLUME_STRS 'RAM','NAND','CF','SD1','SD2','USB1','USB2','USB3'

/* STR_VOLUME_ID选项开关卷ID字符串功能。

/当_STR_VOLUME_ID设置为1时,也可以使用预先定义的字符串在路径名称/数量。

为每个_VOLUME_STRS定义驱动ID字符串

/逻辑驱动器。条目的数量必须等于_VOLUMES。有效字符

/驱动ID字符串:a - z和0 - 9。*/



#define _MULTI_PARTITION 0

/* 这个选项开关多分区的特性。在默认情况下(0),每个逻辑驱动器

/号绑定到相同的物理驱动器号

/物理驱动器将被安装。当启用分区特性(1),

/每个逻辑驱动器号是绑定到任意物理驱动器和分区

/中列出VolToPart[]。还f_fdisk()函数可用. */



#define _MIN_SS 512

#define _MAX_SS 512

/* 这些选项配置支持扇区大小的范围。(512,1024,

/ 2048或4096)总是为大多数系统设置两个512,卡和所有类型的内存

/硬盘。但是可能需要更大的值为车载闪存和一些

/类型的光学媒体。当_MAX_SS大于_MIN_SS,fatf配置

/变量扇区大小和GET_SECTOR_SIZE命令必须执行disk_ioctl()函数. */



#define _USE_TRIM 0

/* 这个选项开关ATA-TRIM特性。(0:禁用或1:启用)

/启用削减特性,也应该实现CTRL_TRIM命令

/ disk_ioctl()函数。*/



#define _FS_NOFSINFO 0

/*

如果你需要知道正确的自由空间体积FAT32,设置一些0

/选项,f_getfree()函数在第一次后体积将迫使山

/全脂肪扫描。位1控制使用的集群数量分配。/

/ bit0 = 0:使用免费的集群计算FSINFO如果可用。

/ bit0 = 1:不相信自由FSINFO集群计算。

/ bit1 = 0:最后使用集群可用FSINFO如果数量分配。

/ bit1 = 1:不相信最后分配FSINFO集群数量.

*/




/*---------------------------------------------------------------------------/

/ 系统配置列表

/---------------------------------------------------------------------------*/


#define _FS_TINY 0

/* 这个选项开关小缓冲区配置。(0:正常或1:小)

/小配置,文件对象的大小(FIL)_MAX_SS减少字节。而不是私人部门从文件对象,缓冲了

/公共部门缓冲文件系统中的对象(fatf)是用于该文件

/数据传输. */



#define _FS_NORTC 0

#define _NORTC_MON 1

#define _NORTC_MDAY 1

#define _NORTC_YEAR 2015 //年

/* _FS_NORTC选项开关时间戳的特性。如果系统没有/

RTC函数或不需要有效的时间戳,_FS_NORTC 1设置为禁用/

时间戳的特性。所有对象修改fatf将有一个固定的时间戳。/

固定的时间定义为_NORTC_MON _NORTC_MDAY _NORTC_YEAR。


/当启用时间戳特性(_FS_NORTC = = 0),需要实现get_fattime()函数。/

添加到项目RTC读当前时间形式。_NORTC_MON, /

_NORTC_MDAY和_NORTC_YEAR没有效果。

/这些选项没有影响只读配置(_FS_READONLY = = 1)。 */



#define _FS_LOCK 0

/* _FS_LOCK选项开关控制复制的文件打开的文件锁定功能

/和非法操作打开对象。这个选项_FS_READONLY时必须是0

/是1。/

/ 0:禁用文件锁定功能。为了避免体积腐败、应用程序

/应该避免非法打开,删除和重命名的开放对象。

/ > 0:启用文件锁定功能。值定义了多少文件/子目录

可以同时打开的/文件锁的控制之下。注意,这个文件独立于re-entrancy /锁功能。 */




#define _FS_REENTRANT 0

#define _FS_TIMEOUT 1000

#define _SYNC_t HANDLE

/* _FS_REENTRANT选项开关re-entrancy fatf的(线程安全)

/模块本身。注意,不管这个选项,文件访问不同

/体积始终是凹角和音量控制功能,f_mount(),f_mkfs()

/和f_fdisk()函数,总是不凹角。只有文件/目录的访问

/相同的体积是这个功能的控制。

/

/ 0:禁用re-entrancy。_FS_TIMEOUT和_SYNC_t没有效果。

/ 1:启用re-entrancy。还提供用户同步处理程序,

/ ff_req_grant(),ff_rel_grant(),ff_del_syncobj()和ff_cre_syncobj()

/函数,必须添加到项目中。样品中可用

/选项

/ syscall.c。

/

/ _FS_TIMEOUT定义超时时间单位的滴答声。

/ _SYNC_t定义了O

/ S依赖同步对象类型。例如处理、ID、OS_EVENT *

/ SemaphoreHandle_t等. .O / S的头文件定义需要

/包括在ff.c的范围。 */



#define _WORD_ACCESS 0

/* _WORD_ACCESS选项是一个只有依赖于平台的选择。

它定义了这个词/访问方法是用来体积上的数据。

/

/ 0:逐字节的访问。总是兼容所有平台。

/ 1:词的访问。不要选择这个,除非在下列条件。

/

/ *地址对齐内存访问总是允许所有指令。

/ *字节顺序的记忆是低位优先。

/

/如果是这样的情况,_WORD_ACCESS也可以减少代码的大小设置为1。

/下表显示允许设置某种类型的处理器。

/

/ ARM7TDMI 0 *2 ColdFire 0 *1 V850E 0 *2

/ Cortex-M3 0 *3 Z80 0/1 V850ES 0/1

/ Cortex-M0 0 *2 x86 0/1 TLCS-870 0/1

[1] [2]
关键字:STM32  NAND  FATFS 引用地址:基于STM32+CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(下篇)

上一篇:stm32单片机pwm设置与实际输出频率不一致
下一篇:STM32入门学习笔记之MPU6050传感器解析实验4

推荐阅读最新更新时间:2024-11-02 16:55

STM32学习笔记—DAC基础内容及常见问题
DAC,Digital-to-Analog Converter(数模转换器),DA转换和AD转换有着同样重要的作用,在许多场合都能看到DAC的应用。 今天是第8篇分享,《STM32学习笔记》之DAC基础内容及常见问题。 DA转换器是把数字量转变成模拟量的器件,按模拟量输出类型通常分为:电流和电压输出类型。常见的DAC是电压输出型,在STM32中集成的DAC转换模块为电压输出型数模转换器。 STM32 DAC 基础内容 STM32内部集成的DAC输出通道和功能与型号有关,一般有1到3个通道。 下面结合STM32F4描述一下DAC基本的参数信息: 1. DAC分辨率 分辨率决定了DAC的转换精度,目前STM32内部集成的DA
[单片机]
STM32 | STM32如何收发float类型数据?
实际应用中,我们可能需要两个设备通过串口传输浮点数据: 本篇笔记为了方便演示,使用串口助手模拟其中一个设备,本篇笔记内容如下: 我们创建一个用于管理float类型数据的共用体: union float_data { float f_data; uint8_t byte ; }; 数据的流向如: 本次使用串口助手模拟发送设备,省略了第一步,主要看第②、③步。 创建两个共用体变量,用于发送与接收: union float_data rx_float_data, tx_float_data; 收发相关代码: 左右滑动查看全部代码 if(HAL_UART_Receive(&huart3, rx_float_
[单片机]
<font color='red'>STM32</font> | <font color='red'>STM32</font>如何收发float类型数据?
STM32 RTC时钟晶振 调电RTC计数器不走的问题
在初始化配置的情况下,RTC 日历时间我们默认设置一个时间点,此时备份区设置一个默认参数,表示已经设置过,后期只需要更新读取RTC- CNT 即可,如果出现断电计数器不走的情况,在生产上遇到,晶振贴片没有贴好,导致出厂默认读取的外部高速晶振HSE,这样后期不去掉纽扣电池点的话,默认都是外部高速晶振,这样外币32.768kHZ的晶振实际是没有用的,借此希望给大家一点提示。
[单片机]
<font color='red'>STM32</font> RTC时钟晶振 调电RTC计数器不走的问题
stm32 g系列和f系列的区别
STM32 G系列和F系列都属于STMicroelectronics(意法半导体)旗下的STM32系列微控制器(MCU)。虽然它们都是针对嵌入式系统设计的,但G系列和F系列在架构、性能和特征方面存在一些区别。 1. 架构: - G系列: STM32 G系列采用Arm Cortex-M4处理器内核,内置DSP(FPU)运算单元,可执行高性能的数字信号处理任务。它支持单周期乘法和累加(MAC)指令,提供了一种高效的方式来处理混合信号和控制应用。 - F系列: STM32 F系列也采用Arm Cortex-M4内核,但没有内置DSP(FPU)运算单元。它主要用于通用用途的应用程序,适用于广泛的市场和应用,如消费电子、工业自动化等。 2.
[单片机]
SK hynix发布321层TLC NAND 1Tb闪存技术将于2025年上半年量产
在8月8日至10日于圣克拉拉举行的闪存峰会(FMS)2023上,SK海力士公司介绍了其321层1Tb TLC* 4D NAND闪存的开发进展,并展示了样品。SK hynix是业内首家详细公布300多层NAND开发进展的公司。该公司计划提高321层产品的完成度,并在2025年上半年开始量产。 该公司表示,已量产的全球最高 238 层 NAND 的成功为其积累了技术竞争力,为 321 层产品的顺利开发铺平了道路。 随着解决堆叠限制的又一次突破,SK hynix 将开启 300 层以上 NAND 的时代,引领市场潮流。 321层1Tb TLC NAND与早一代238层512Gb相比,生产率提高了59%,这得益于技术的发展,它可以在单个
[半导体设计/制造]
STM32学习笔记——TFT2.4彩屏显示图片
利用彩屏显示图片需要先完成彩屏的驱动程序,然后在驱动程序的基础上再编写应用程序。 彩屏的驱动程序如果写好的话,就可以一直使用了,精力主要集中在应用程序的编写就可以了,但是移植的话,要移植驱动程序。其实移植也只是改变那些很底层的靠近处理器的那部分代码。 因为STM32F103C8的片上只有64K的FLASH,所以不能存储太多的图片数据,也就不能显示太大的图片。 一下的程序注释的比较详细,看懂了基本上就可以用了。 彩屏驱动程序的头文件lcd.h如下: #define uchar unsigned char #define uint unsigned int #define Bus_16 //
[单片机]
STM32操作24位AD转换器AD7799芯片
  AD7799是早些前ADI公司推出的一款高精度低速24位ADC器件,主要应用于低功耗精密测量场合。最近开发与气压检测相关的产品,选择了这个芯片,经过PCB的合理布线,感觉这颗芯片的效果还不错。   AD7799内部数字部分和模拟部分的供电是分开的,数字部分由DVCC供电,模拟部分由AVCC供电,经过实验,在只有DVCC而不加AVCC的时候芯片的数字接口部分是可以工作的,这样就可以把AIN3+和AIN3-作为数字信号来启动模拟电源输出AVCC,不知道这样描述是否清楚,主要是为低功耗和省电考虑。   AD7799内部有三个差分通道,可以分别配置成为差分模式和单端模式,在单端模式下需要保证AINx(+)电压高于AIN(-)电压,否则
[单片机]
<font color='red'>STM32</font>操作24位AD转换器AD7799芯片
stm32之can总线过滤器研究
stm32的can总线的配置如下: CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式 CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失) CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved