自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(138)
  • 收藏
  • 关注

原创 17_LinuxLCD驱动

设置好以后保存退出,重新编译Linux内核,编译完成以后使用新编译出来的imx6ull-alientek-emmc.dtb和zImage镜像启动系统,如果LCD驱动工作正常的话就会在LCD屏幕左上角出现一个彩色的小企鹅logo,屏幕背景色为黑色,如图所示。第4行,设置背8级背光(0-7),分别为0、4、8、16、32、64、128、255,对应占空比为0%、1.57%、3.13%、6.27%、12.55%、25.1%、50.19%、100%,如果嫌少的话可以自行添加一些其他的背光等级值。

2023-07-24 23:13:55 453

原创 16_LinuxINPUT子系统

比如按键输入、键盘、鼠标、触摸屏等等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息,鼠标和触摸屏代表坐标信息,因此在应用层的处理就不同,对于驱动编写者而言不需要去关心应用层的事情,我们只需要按照要求上报这些输入事件即可。所有的输入设备以文件的形式供用户应用程序使用。卸载input 驱动的时候需要先使用input_unregister_device函数注销掉注册的input_dev,然后使用input_free_device函数释放掉前面申请的input_dev。

2023-07-22 15:41:22 264

原创 15_LinuxMISC杂项驱动

随着Linux字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号,MISC设备驱动就用于解决此问题。第109-145行, platform框架的probe函数,当驱动与设备匹配以后此函数就会执行,首先在此函数中初始化BEEP所使用的IO。所有的mis设备都属于同一个类, /sys/class/misc目录下就是misc这个类的所有设备,每个设备对应一个子目录。在使用的时候可以从这些预定义的子设备号中挑选一个,当然也可以自己定义,只要这个子设备号没有被其他设备使用接口。

2023-07-20 21:16:08 206

原创 14_Linux设备树下的platform驱动编写

第120-164行, platform驱动的probe函数,当设备树中的设备节点与驱动之间匹配成功以后此函数就会执行,原来在驱动加载函数里面做的工作现在全部放到probe函数里面完成。第11行,设置platform_driver中的of_match_table匹配表为上面创建的leds_of_match,至此我们就设置好了platform驱动的匹配表了。第203-206行,驱动模块加载函数,在此函数里面通过platform_driver_register向Linux内核注册led_driver驱动。

2023-07-16 14:28:53 337

原创 13_Linux无设备树Platform设备驱动

在实际的驱动开发中,一般12C主机控制器驱动已经由半导体厂家编写好了,而设备驱动一般也由设备器件的厂家编写好了,我们只需要提供设备信息即可,比如12C设备的话提供设备连接到了哪个12C接口上, I2C的速度是多少等等。第10行, match函数,此函数很重要,单词match的意思就是“匹配、相配”,因此此函数就是完成设备和驱动之间匹配的,总线就是使用match函数来根据注册的设备来查找对应的驱动,或者根据注册的驱动来查找相应的设备,因此每一条总线都必须实现此函数。简单介绍一下驱动的分层。

2023-07-15 19:22:17 486

原创 12_Linux异步通知

驱动中的信号处理异步通知简介在使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的,对于非阻塞方式来说还需要应用程序通过poll函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知,报告自己可以访问,然后应用程序在从驱动程序中读取或写入数据,类似于我们在裸机例程中讲解的中断。Linux提供了异步通知这个机制来完成此功能。

2023-07-09 18:44:37 623

原创 11_Linux阻塞与非阻塞

参数q就是要唤醒的等待队列头,这两个函数会将这个等待队列头中的所有进程都唤醒。第52-73行,这段代码使用 poll函数来实现非阻塞访问,在while循环中使用poll函数不断的轮询,检查驱动程序是否有数据可以读取,如果可以读取的话就调用read函数读取按键数据。noblockioApp的CPU占用率也低至0.0%,和图中的blockioApp一样,这里的0.0%并不是说noblockioApp这个应用程序不使用CPU了,只是因为使用率太小了,而图中只能显示出小数点后一位,因此就显示成了0.0%。

2023-07-09 15:06:19 450

原创 10_Linux中断

假如A任务调用local_irq_disable关闭全局中断10S,当关闭了2S的时候B任务开始运行, B任务也调用local_irq_disable关闭全局中断3S, 3秒以后B任务调用 local_irq_enable 函数将全局中断打开了。按键释放了的话就将imx6uirq结构体的keyvalue成员变量的最高位置1,表示按键值有效,也就是将keyvalue与0x80进行或运算,表示按键松开了,并且设置imx6uirq结构体的releasekey成员变量为1,表示按键释放,一次有效的按键过程发生。

2023-07-08 23:13:41 521

原创 09_Linux内核定时器

运行测试Linux时间管理和内核定时器简介学习过UCOS或FreeRTOS的同学应该知道, UCOS或FreeRTOS是需要一个硬件定时器提供系统时钟,一般使用Systick作为系统时钟源。同理Linux要运行也是需要一个系统时钟的至于这个系统时钟是由哪个定时器提供的在CortexA7内核中有个通用定时器。

2023-07-08 21:30:00 717

原创 08_Linux按键输入

第56-74行,函数keyio_init用于初始化按键,从设备树中获取按键的gpio信息,然后设置为输入。第36-46行,结构体key_dev为按键的设备结构体,第45行的原子变量keyvalue用于记录按键值。第104-120行, keyread函数,应用程序通过read函数读取按键值的时候此函数就会执行。第83-94行, key_open函数通过调用keyio_init函数来始化按键所使用的。按键释放以后标记按键值为KEYOVALUE。O,应用程序每次打开按键驱动文件的时候都会初始化一次按键IO。

2023-07-02 19:03:53 513

原创 07_Linux并发与竞争

此时你到了电话亭门口,因为里面有人,所以你不能进去打电话,相当于没有获取自旋锁,这个时候你肯定是站在原地等待,你可能因为无聊的等待而转圈圈消遣时光,反正就是哪里也不能去,要一直等到里面的人打完电话出来。终于,里面的人打完电话出来了。所谓的临界区就是共享数据段,对于临界区必须保证一次只有一个线程访问,也就是要保证临界区是原子访问的,都知道,原子是化学反应不可再分的基本微粒,这里的原子访问就表示这一个访问是一个步骤,不能再进行拆分。可以看出,小王打印出来的文档中电话号码错误了,变成小李的了,这是绝对不允许的。

2023-07-01 20:59:37 219

原创 06_pinctr子系统与gpio子系统

gpio子系统顾名思义,就是用于初始化GPIO并且提供相应的API函数,比如设置GPIO为输入输出,读取GPIO的值等。当设备和驱动匹配成功以后platform_driver的probe成员变量所代表的函数就会执行,在353行设置probe成员变量为imx6ul_pinctrl_probe函数,因此在本章实验中imx6ul_pinctrl_probe这个函数就会执行,可以认为 imx6ul_pinctrl_probe函数就是I.MX6ULL这个SOC的PIN配置入口函数。gpio子系统提供的常用的AP。

2023-06-30 23:19:30 337

原创 05_Linux设备树下的LED驱动

驱动文件中定义有关寄存器物理地址,然后使用io_remap函数进行内存映射,得到对应的虚拟地址,最后操作寄存器对应的虚拟地址完成对GPIO的初始化。第169-174行,通过of_find_property函数获取alphaled节点的compatible属性,返回值为property结构体类型指针变量, property的成员变量value表示属性值。通过of_property_read_u32_array函数获取alphaled节点的reg属性所有值,并且将获取到的值都存放到 regdata 数组中。

2023-06-25 20:18:42 529

原创 04_Linux设备树DTB文件OF函数

图中框起来的部分就是函数do_bootm_linux函数的执行流程,也就是说do_bootm_linux函数会通过一系列复杂的调用,最终通过fdt_chosen函数在chosen节点中加入了bootargs属性。在图中,根节点属性属性表现为一个个的文件(图中细字体文件),比如图中的“#address-cells"、"#size-cells"、"compatible”、"model”和"name”这5个文件,它们在设备树中就是根节点的5个属性。因此ocram节点应该是soc节点的子节点。

2023-06-18 00:35:15 1393

原创 03_Linux设备树与设备树语法

找到匹配的machine_desc的过程就是用设备树根节点的compatible属性值和Linux内核中machine_desc下.dt_compat的值比较,看看那个相等,如果相等的话就表示找到匹配的machine_desc, arch_get_next_mach函数的工作就是获取Linux内核中下一个machine desc结构体。使用2440这个芯片的板子有很多。设备节点的compatible属性值是为了匹配Linux内核中的驱动程序,那么根节点中的compatible属性是为了做什么工作的?

2023-06-17 22:50:09 991

原创 02_LinuxLED驱动开发

第47-59行, led_switch函数,用于控制开发板上的LED灯亮灭,当参数sta为LEDON(1)的时候打开LED灯, sta为LEDOFF(0)的时候关闭LED灯。第47-59行, led_switch函数,用于控制开发板上的LED灯亮灭,当参数sta为LEDON(1)的时候打开LED灯, sta为LEDOFF(0)的时候关闭LED灯。第192-202行,驱动出口函数led_exit,首先使用函数iounmap取消内存映射,最后使用函数unregister_chrdev注销led这个字符设备。

2023-06-10 20:45:59 827

原创 01_Linux字符设备驱动开发

"/lib/modules”是通用的,不管你用的什么板子、什么内核,这部分是一样的。不一样的是后面的“4.1.15”,这里要根据你所使用的Linux内核版本来设置,比如ALPHA开发板现在用的是4.1.15 版本的Linux内核,因此就是"/lib/modules/4.1.15"。在Linux中一切皆为文件,驱动加载成功以后会在"/dev”目录下生成一个相应的文件,应用程序通过对这个名为"/dev/xxx”(xxx是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。如果要获取led 灯的状态。

2023-06-10 16:19:56 2166 1

原创 17_Linux根文件简介与Busybox构建文件系统

所以要设置的nfs服务器目录中创建一个名为rootfs的子目录(名字大家可以随意起,为了方便就用了rootfs),比如我的电脑中"/home/zuozhongkai/linux/nfs"就是我设置的NFS服务器目录,使用如下命令创建名为 rootfs的子目录。盒子是用来放东西的,忙碌的是因为它要提供根文件系统所需的文件,所以忙碌。系统启动以后此目录作为sysfs文件系统的挂载点, sysfs是一个类似于proc文件系统的特殊文件系统, sysfs也是基于ram的文件系统,也就是说它也没有实际的存储设备。

2023-06-04 15:49:33 757

原创 16_Linux内核启动流程

Linux内核启动流程就分析到这里, Linux内核最终是需要和根文件系统打交道的,需要挂载根文件系统,并且执行根文件系统中的init程序,以此来进去用户态。第963-966行,如果ramdisk_execute_command和execute_command都为空,那么就依次查找"/sbin/init"、"/etc/init"、"/bin/init"和"/bin/sh",这四个相当于备用init程序,如果这四个也不存在。接下来重点看一下init进程, kernel_init就是init进程的进程函数。

2023-06-02 23:16:42 453 1

原创 15_Linux工程目录与顶层Makefile

而 vmlinux-deps=$(KBUILD_LDS)$(KBUILD_VMLINUX_INIT)$(KBUILD_VMLINUX_MAIN), KBUILD_LDS是链接脚本,这里不考虑,剩下的KBUILD-VMLINUX-INIT和KBUILD-VMLINUX-MAIN就是各个子目录下的 built-in.o、a等文件。最终 vmlinux-deps 的值如下。但是链接是需要链接脚本的,vmlinux的依赖arch/arm/kernel/vmlinux.lds就是整个Linux的链接脚本。

2023-05-27 23:05:21 1026

原创 14_Uboot图形化配置

Kconfig语法简介U-Boot图形化配置体验uboot或Linux内核可以通过输入"make menuconfig"来打开图形化配置界面menuconfig是一套图形化的配置工具,需要ncurses库支持。ncurses库提供了一系列的API函数供调用者生成基于文本的图形界面因此需要先在Ubuntu中安装ncurses库命令如下menuconfig重点会用到两个文件config和Kconfig,.config文件前面已经说了这个文件保存着uboot的配置项。

2023-05-25 21:01:38 698

原创 13_Uboot移植

大功基本上告成,还差最后一步, uboot中的LAN8720A驱动有点问题,打开文件drivers/net/phy/phy.c,找到函数genphy_update_link,这是个通用PHY驱动函数,此函数用于更新PHY的连接状态和速度。第335行为ENET1的PHY地址,默认是0X2,第339行为ENET2的PHY地址,默认为0x1。第29-39行,设置DRAM 的大小,宏PHYS_SDRAM_SIZE就是板子上DRAM 的大小,如果用的NXP官方的9X9 EVK开发板的话DRAM大小就为256MB。

2023-05-24 22:43:53 1089

原创 12_Uboot启动流程_4

boot_selected_os函数在调用do_bootm_linux的时候会将flag设置为BOOTM。第639行,调用函数do bootm states来执行不同的BOOT阶段,这里要执行的BOOT阶段有: BOOTM_STATE_OS_PREP 、BOOTM_STATE_OS_FAKE_GO和BOOTM_STATE_OS_GO。在do_bootz函数中会用到BOOTM_STATE_OS_PREP、BOOTM_STATE_OS_FAKE_GO和BOOTM_STATE_OS_GO这三个BOOT状态。

2023-05-09 22:27:22 533

原创 11_Uboot启动流程_3

run_main_loop函数详解run_main_loop函数详解uboot启动以后会进入3秒倒计时如果在3秒倒计时结束之前按下按下回车键那么就,会进入uboot的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动Linux内核,这个功能就是由run_main_loop函数来完成的。run_main_loop函数定义在文件common/board r.c中函数内容如下:第759行和第760行是个死循环, "for(;;

2023-05-09 21:34:11 1190

原创 10_Uboot启动流程_2

重新设置环境(sp和 gd)、获取 gd->start_addr_sp的值赋给sp,在函数 board_init_f中会初始化gd的所有成员变量,其中gd->start_addr_sp-0X9EF44E90,所以这里相当于设置sp-gd->start_addr_sp-0X9EF44E90。第4行,initf_console_record,如果定义了宏CONFIG_CONSOLE-RECORD和宏CONFIG_SYS_MALLOC_F_LEN的话此函数就会调用函数console_record_init。

2023-05-07 19:10:39 909

原创 09_Uboot启动流程_1

链接脚本u-boot.lds详解要分析uboot的启动流程,首先要找到“入口”,找到第一行程序在哪里。程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入口。如果没有编译过uboot的话链接脚本为arch/arm/cpu/u-boot.lds。但是这个不是最终使用的链接脚本,最终的链接脚本是在这个链接脚本的基础上生成的。编译一下 uboot,编译完成以后就会在 uboot 根目录下生成 u-boot.lds文件如图所示打开u-boot.lds内容如下。

2023-05-07 16:02:28 504

原创 08_Uboot顶层Makefile分析_make过程

的描述,根据描述,在一些先决条件比目标新的时候,或者命令行 有改变的时候,if_changed就会执行一些命令。里面的配置参数的含义,这些参数其实都是变量,后面跟着变量值,会在 顶层 Makefile。文件的时候,需要使用此选项。产生可重定向的输出,比如,产生一个输出文件它可再次作为‘ld。’的输入,这经常被叫做“部分链接”,当我们需要将几个小的。函数引用的变量比较多,也比较绕,我们只需要知道它可以从。编译了,因为没有指明目标,所以会使用默认目标,主。”,没有找到,说明条件不成立。

2023-05-04 22:27:11 500

原创 07_Uboot顶层Makefile分析_make xxx_defconfig

MAKECMDGOALS是make的一个环境变量,这个变量会保存你所指定的终极目标列表,比如执行"make mx6ull_alientek_emme_defconfig",那么MAKECMDGOALS就为 mx6ull_alientek_emme_defconfig。只有 scripts_basic是有效的。第440行将MAKECMDGOALS中不符合"config"和“%config"的部分过滤掉,如果剩下的部分不为空条件就成立,很明显此处条件成立,变量config-targets=1。

2023-05-04 21:49:19 780

原创 06_Uboot顶层Makefile分析_前期所做内容

从图可以看出第一个单词是"xrRs",将$(filter %s ,$(firstword x$(MAKEFLAGS))展开就是$(filter %s, xrRs),而$(filter %s, xrRs)的返回值肯定不为空,条件成立, quiet-silent_第101行使用export导出变量quiet、Q和KBUILD_VERBOSE。sym命令分为"quiet_cmd_sym”和"cmd_sym”两个版本,这两个命令的功能都是一样的,区别在于make执行的时候输出的命令不同。

2023-05-03 17:10:20 1137

原创 05_Uboot源码目录分析

u-boot.cmd使用到了arm-linux-gnueabihf-ld.bfd,也就是链接工具,使用Id.bfd将各个 builtin.o文件链接在一起就形成了u-boot 文件。文件.u-boot.lds.cmd就是用于生成u-boot.lds链接脚本的,由于.u-bootlds.cmd文件内容太多,这里就不列出来了。u-boot.bin.cmd里面定义了一个变量: cmd u-boot.bin,此变量的值为“cp u-boot-nodtb.bin" u-boot.bin。

2023-05-02 16:53:34 981

原创 04_Uboot操作命令与其他命令

其中addr是ulmage在DRAM中的首地址, initrd是initrd的地址, fdt是设备树(.dtb)文件在DRAM中的首地址,如果initrd为空的话,同样是用“-”来替代。其中addr是ulmage在DRAM中的首地址, initrd是initrd的地址, fdt是设备树(.dtb)文件在DRAM中的首地址,如果initrd为空的话,同样是用“-”来替代。命令bootz有三个参数, addr是Linux镜像文件在DRAM中的位置, initrd是 initrd文件在DRAM中的地址。

2023-05-01 15:01:59 1168

原创 03_Uboot网络命令与MMC和文件操作命令

我们一般使用uboot中的nfs命令将Ubuntu中的文件下载到开发板的DRAM中,在使用之前需要开启Ubuntu主机的NFS服务,并且要新建一个NFS使用的目录,以后所有要通过NFS访问的文件都需要放到这个NFS目录中。从上图可以看出,分区0格式未知,因为分区0存放的uboot,并且分区0没有格式化,所以文件系统格式未知。从上图可以看出在225ms内读取了6785272个字节的数据,速度为28.8MiB/s,速度是非常快的,因为这是从EMMC里面读取的,而EMMC是8位的,速度肯定会很快的。

2023-04-29 20:05:35 2821

原创 02_Uboot基本命令与内存命令

上面命令设置bootargs的值为"console=ttymxc0,115200 root-/dev/mmeblk1p2 rootwaitrw",其中"console=ttymxc0,115200"、"root=/dev/mmeblk1p2"、"rootwait"和"rw"相当于四组"值",这四组值之间用空格隔开。上面说了, uboot命令里面的数字都是十六进制的,所以可以不用写“0x”前缀,十进制的20其十六进制为0x14,所以命令md后面的个数应该是14,如果写成20的话就表示查看32。

2023-04-17 21:47:22 1514 1

原创 01_什么是Uboot

uboot是个裸机程序,因此需要在其前面加上头部(IVT、DCD等数据)才能在I.MX6U上执行,图中的u-boot.imx文件就是添加头部以后的u-boot.bin, u-boot.imx就是我们最终要烧写到开发板中的uboot镜像文件。.MX6ULL开发板,那么就使用正点原子提供的uboot源码(也是在半导体厂商的uboot上修改的)。最常用的就是半导体厂商或者开发板厂商的uboot,如果你用的半导体厂商的评估板,那么就使用半导体厂商的uboot,如果你是购买的第三方开发板,比如正点原子的。

2023-04-16 20:31:23 575 1

原创 21_I.MX6ULL_PWM背光实验

从采样寄存器PWMx_PWMSAR读取一次数据, FIFO里面的数据就会减一,每产生一个周期的PWM信号, FIFO里面的数据就会减一,相当于被用掉了。设置为0的时候表示FIFO空余位置大于等于1的时候FIFO为空:设置为1的时候表示FIFO空余位置大于等于2的时候FIFO为空:设置为2的时候表示FIFO空余位置大于等于3的时候FIFO 为空。WAITEN(bit23):此位用来设置等待模式下PWM是否工作,为0的话表示在等待模式下PWM继续工作,为1的话表示等待模式下关闭PWM。

2023-04-14 21:20:20 805

原创 20_I.MX6ULL_多点电容触摸ICgt9147实验

多点电容触摸简介触摸屏很早就有了,一开始是电阻触摸屏,电阻触摸屏只能单点触摸,在以前的学习机、功能机时代被广泛使用。2007年1月9日苹果发布了划时代的第一代Iphone也就是 Iphone2G, Iphone 2G上使用了多点电容触摸屏,而当时的手机基本都是使用的电阻触摸屏。电容触摸屏优秀的触摸品质和手感瞬间征服了消费者带来了手机触摸屏的大变革后面新出的手机也都采用了多点电容触摸屏。和电阻触摸屏相比电容触摸屏最大的优点是支持多点触摸(后面的电阻屏也支持多点触摸但是为时已晚。

2023-04-12 23:24:12 1306

原创 19_I.MX6ULL_SPI实验

SPI简介同I2C一样SPI是很常用的通信接口也可以通过SPI来连接众多的传感器。相比I2C接口, SPI接口的通信速度很快, I2C最多400KHz,但是SPI可以到达几十MHz。I.MX6U也有4个SPI接口可以通过这4个SPI接口来连接一些 SPI外设。I2C是串行通信的一种只需要两根线就可以完成主机和从机之间的通信,但是I2C的速度最高只能到400KHz,如果对于访问速度要求比价高的话I2C就不适合了。

2023-04-10 23:33:39 665

原创 18_I.MX6ULL_I2C实验

寄存器I2Cx_IFDR也只有IC(bit5:0)这个位,用来设置I2C的波特率, I2C的时钟源可以选择IPG_CLK_ROOT=66MHz,通过设置IC位既可以得到想要的I2C波特率。这是一个8位的数据,其中高7位是设备地址,最后1位是读写位,为1的话表示这是一个读操作。寄存器就是I2Cx_I2DR,这是I2C的数据寄存器,此寄存器只有低8位有效,当要发送数据的时候将要发送的数据写入到此寄存器。MTX(bit4):传输方向选择位,用来设置是进行发送还是接收,为0的时候是接收,为1的时候是发送。

2023-04-09 18:33:04 569

原创 17_I.MX6ULL_内部RTC

包括一个安全的实时计数器(RTC)、一个单调计数器(monotonic counter)和一些通用的寄存器,使用实时计数器(RTC).SNVS里面的外设在芯片掉电以后由电池供电继续运行。因此在需要记录时间的场合就需要实时时钟,可以使用专用的实时时钟芯片来完成此功能,但是现在大多数的MCU或者MPU内部就已经自带了实时时钟外设模块。系统主电源断电以后SNVS_HP也会断电,但是在后备电源支持下, SNVS_LP是不会断电的,而且SNVS_LP是和芯片复位隔离开的。所以使用的是SNVS_LP内部的SRTC。

2023-04-08 23:33:51 527

原创 17_I.MX6ULL_LCD实验源码

【代码】17_I.MX6ULL_LCD实验源码。

2023-04-07 22:55:56 165

GD32F30x 用户手册-Rev2.7

AHB互联矩阵连接了几个主机,分别为:IBUS、 DBUS、SBUS、DMA0、DMA1和ENET。IBUS是Cortex-M4内核的指令总线,用于从代码区 域(0x0000 0000〜0x1FFF FFFF)中取指令和向量。DBUS是Cortex-M4内核的数据总线,用 于加载和存储数据,以及代码区域的调试访问。同样,SBUS是Cortex-M4内核的系统总线, 用于指令和向量获取、数据加载和存储以及系统区域的调试访问。系统区域包括内部SRAM区 域和外设区域。DMA0和DMA1分别是DMA0和DMA1的存储器总线。ENET是以太网。 AHB互联矩阵也连接了几个从机,分别为:FMC-I、FMC-D、SRAM、EXMC、AHB、APB1和 APB2。FMC-I是闪存存储器控制器的指令总线,而FMC-D是闪存存储器的数据总线。SRAM是 片上静态随机存取存储器。EXMC是外部存储器控制器。AHB是连接所有AHB从机的AHB总线, 而APB1和APB2是连接所有APB从机的两条APB总线。两条APB总线连接所有的APB外设。 APB1操作速度限制在60MHz,APB2操作于全速(这取

2023-02-21

48-fatfs移植源码

fatfs移植源码对应48篇博客源码

2022-12-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除