自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 资源 (9)
  • 收藏
  • 关注

原创 汽车充电协议OpenV2G的平替cbexigen!!

此外,开发者目前十分活跃,希望有需求的同行可以一起加入进来,为开发者提供建议一起完善这个项目!纵所周知,开源欧规协议 CCS 的 OpenV2G 协议不支持 ISO15118-20:2022 协议,并且软件维护者已经明确不在进行该软件的维护。我按照下面说明,安装了 python3.12.0 版本,运行了编译器成功生成了 codec 代码!注意事项:如果使用 python3.12版本,也就是最新版本运行这个软件会有点问题,具体可以看。这个 issue,里面也有我的提问哈哈哈哈!

2023-12-15 09:25:51 981 7

原创 移植 NetXDuo 到 STM32F4 芯片

ST 提供了一套 Azrtos 的软件包,里面切好有基于 ST 芯片以太网的 netxduo 驱动实现,软件包位于 GitHub 或者在 ST 的官网搜索 Cube Azrtos f4 找到软件包。文件,这个是 threadx 需要的用于获取堆栈指针和中断向量表的实现函数,这个文件可以使用。ThreadX 的移植不是本篇的重点,这里只是简要说明大致流程,详细请参考其它资料。由于本篇使用的是以太网,因此拷贝以太网的代码。下的所有 *.s 文件,除了。文件是芯片相关的文件,导入。函数,以便进行线程调度。

2023-10-08 10:53:36 687 5

原创 MCP2515调试心得

采用 STM32 硬件 SPI 时注意使用软件去控制 NSS 的输出,硬件控制操作 MCP2515 芯片会有问题。在某次项目,使用 STM32 的 MCO 直接输出 8M 的 HSE 连接进 MCP2515 的 OSC1 出现无法驱动的情况,可见很需要加一个。网上大部分的 MCP2515 芯片驱动是发送一个字节,先发送该字节要写入的寄存器地址,这种方式在操作连续地址的多个寄存器时的效率很低。Filter 寄存器的设置也可以采用连续传输的方式实现。

2023-09-08 10:15:54 1977

原创 配置 RT-Thread 的工程目录

rt-thread 工程目录配置

2023-04-28 14:58:25 1640 2

原创 圈圈教你玩转USB第三版 光盘资料

下载官网:

2023-03-13 20:34:06 1682

原创 STM32 GPS模块输出控制实现

本文是对 ATGM336H-5N GNSS模块的发送功能实现,已经验证过功能,供大家参考配置的目标:说明:配置发送帧使用CAS03标识:设置更新频率使用GAS02标识:配置使用的定位系统使用CAS04标识:发送函数GPS配置其它省略实现省略。最后效果如下:

2023-02-04 16:18:09 1669

原创 STM32H7 DMA阅读笔记

stm32h7 系统总线架构如下:在上图中可以看到有 MDMA、DMA、BDMA 三种 DMA,其实本质上三者都是差不多的,只是位于的域不同。一个 DMA 控制器有 8 个 streams,每个 stream 最多支持 115 个通道(请求)。每个 stream 拥有 4 字位宽 32 个大小的先进先出缓存区。这个缓存区可以被配置为循环缓存区。stream 可以被配置为 FIFO 模式和 Direct 模式两种:传输的单次传输的数据数量可以由软件设置(DMA flow controller),也可以由外

2022-11-02 16:05:36 2040

原创 STM32H7 DMAMUX 阅读笔记

当同步信号(dmamux_syncx)达到时,输入的 dmamux_reqx 会立刻被传播到 dmamux_req_outx 作为输出信号,同时通道内部的 DMA request counter 会开启计数,初始值是设置在 DMA_CxCR 寄存器的 NBERQ 位中。当 counter 递减到零时,会触发一次 dmamux_evtx 的事件,同时断开输入信号 dmamux_reqx 到输出 dmamux_req_outx 的连接。DMA 请求是一个源即来自外设或也可来自 DMAMUX 请求产生器。

2022-11-02 15:30:26 991

原创 STM32H7 USART 时钟初始化

使用芯片 STM32H750XB,板子使用的是 安富莱的 stm32-V7 开发板。

2022-10-31 09:30:58 1392 1

原创 使用RS485芯片进行串口通讯

该程序源码来源于 安富莱V7开发板的第13个程序。

2022-10-29 18:39:39 4164

转载 RS232协议

RS232标准采用的接口常用的一般是9针D型插头。编号信号方向缩写名称描述1调制解调器DCD(又名CD)载波检测2调制解调器RXD接收数据3PCTXD发送数据4PCDTR数据终端准备5GND信号地线6调制解调器DSR通讯设备准备好7PCRTS请求发送8调制解调器CTS允许发送(发送清除)9调制解调器RI响(振)铃指示器。

2022-10-28 15:00:49 8852

转载 RS485协议

采用共模传输方式时,共模噪声将会叠加在最终的输出信号上面,污染了原始的信号。

2022-10-28 11:13:15 1986

原创 USART发送与接收

当 USART_RDR 寄存器中的数据还未被读取(RXNE 未被置位),而此时又有新的数据到达 RX Shift Reg 寄存器,导致 RX Shift Reg 寄存器中的数据无法转移到 USART_RDR 寄存器就会发送 Overrun error。如果我们启动了 TxFIFO,那么该数据就会从 USART_TDR 被缓存到 TxFIFO 里,然后我们就可以接着往 USART_TDR 寄存器中写入数据,而不用担心覆盖 USART_TDR 中的数据。只要 TxFIFO 最终没有满,TXE 就会被设置为1。

2022-10-26 15:33:49 3070

原创 MPU 配置实战

M7 处理器的内存映射:(标准来源于 ARM)ARM 划定了一个大致的内存分配区间,如上图所示。各个厂商再根据自己芯片的实际情况进行详细的划分。如 STM32H750XB 芯片的划分如下。H750XB 芯片的内存划分:(来源于H750XB参考手册第二章第二节)

2022-10-16 15:30:15 1410

转载 write-back/write-through/write-allocate/write-no-allocate说明

write-back:将数据更新到 cache,并不更新到内存(DRAM),待后续 flush cache 时存入内存;write-allocate:将要写入的位置从内存读到cache,然后按照上述write hit继续操作;write-no-allocate:不会将要写入的数据从内存读到cache,直接将要写的数据写入内存。Read allocate,先把数据读取到 Cache 中,再从 Cache 中读数据。write-through:数据同时会更新到 cache 和内存;

2022-10-16 11:51:52 1806

转载 STM32操控外设为什么要先使能时钟

你要使用它,当然需要enable了。**只不过,在51单片机一个时钟系统把一切都包了,在STM32中,我们很明确地做好了分工,让大家各司其职,其实这样还有一个好处就是,不是每个外设都需要系统时钟那么高的频率,就像是高射炮打蚊子一个道理。可是随着电子产品集成度越来越高,功耗和发热越来越严重,芯片厂商非常无奈也在开始想办法避免这个问题,而最直接的思路当然就是用多少功能就使能多少功能,对每个外设的时钟都设置了开关,让用户可以精确地控制,关闭不需要的设备,达到节省供电的目的。我也是,就是所谓的”时钟问题“。

2022-10-13 11:39:42 960

原创 STM32 MPU 阅读笔记

MPU 可以将 memory map 内存映射区分为多个具有一定访问规则的区域,通过这些规则可以实现如下功能:防止不受信任的应用程序访问受保护的内存区域。防止用户应用程序破坏操作系统使用的数据。通过阻止任务访问其它任务的数据区。允许将内存区域定义为只读,以便保护重要数据。检测意外的内存访问。内存映射就是 32 位的 CM7 内核整体可以寻址的 0 到 2^32 -1 共计 4GB 的寻址空间。通过这些地址可以访 问 RAM、Flash、外设等。

2022-10-03 23:11:30 713

原创 使用 CubeMX 配置 RCC 时钟

优势是低成本,无需外部时钟,快速启动(仅需几个微秒),缺点是精度差,即使经过校准。LSI 是内部的低速 RC 振荡器,频率约是 32KHz,主要用于独立看门狗和自动唤醒,也可以用于 RTC实时时钟。优势是精度高,缺点是增加成本。函数,该函数就是对 RCC 时钟的配置,只需要将其复制黏贴到我们的工程中就可以了。,通过外接时钟源,有源或者无源晶振驱动,一般接 32.768KHz,,频率约是 4MHz,相比 64MHz 的 HSI,主要用于低功耗。,频率约是 48MHz,用于给特定的外设提供时钟,比如 USB。

2022-10-03 11:17:59 2526

原创 WSL2 Linux内核开发环境搭建

今天尝试在 WSL2 上安装 Linux 开发环境。

2022-08-20 11:39:11 1201

原创 jz2440_LCD驱动程序(非标准)

cfb_fillrect、cfb_copyarea、cfb_imageblit已经由内核实现好了,它们会根据fb_info中设置的fb_fix_screeninfo和fb_var_screeninfo两个结构体中的信息,帮助我们往LCD屏幕上绘制图像。上面我们就大致完成了fb_info的设置,下面是对S3C2440LCD控制器的设置,同时还有要配置一些GPIO引脚工作为LCD使用的引脚模式。然后还需要设置LCD的显存,是的LCDCDMA可以访问到我们的显存地址。......

2022-07-30 19:57:13 380

原创 jz2440_LCD硬件分析

TheLCDcontrollersupportsmonochrome(黑白色),2-bitperpixel(4-levelgrayscale)or4-bitperpixel(16-levelgrayscale)modeonamonochromeLCD,usinga(基于时间的混色算法)andFrameRateControl(FRC)methodLCDcontroller支持monochrome和color两种色彩显示方式。......

2022-07-30 19:45:46 627

转载 Linux内核 LCD 驱动程序框架

framebuffer帧缓冲设备(简称fb)是Linux内核中虚拟出的一个设备,属于字符设备;它的主设备号为FB_MAJOR=29,次设备号用来区分内核中不同的framebuffer。Linux内核中最多支持32个framebuffer,设备文件位于/dev/fb*。...

2022-07-30 11:07:19 1504

原创 Linux内核LCD驱动程序框架

答案内核中的LCD驱动程序是有很多相同的代码,例如应用程序可以通过ioctl来获取屏幕的参数,如分辨率大小等信息;而这些操作需要应用程序与驱动程序进行协商,提高一个所有LCD驱动程序统一接口,因此在LCDdriver程序和应用程序之间又引入了一层fbmem层,由fbmem层提供一个统一的接口给应用程序调用。从上面的fd_read和fd_open函数,我们可以看到,无论是打开文件,还是读取操作,都需要用到fb_info这个结构体。了解平台设备模型的我们知道。......

2022-07-28 23:37:42 456

原创 Linux内核总线系统 —— 通用总线和平台设备

device.h>/*兄弟结点链表中的结点*/structklist_nodeknode_driver;/*在父总线上的位置*//*...省略...*/structbus_type*bus;/*所在总线设备的类型*/structdevice_driver*driver;/*分配当前device实例的驱动程序*/void*driver_data;/*驱动程序的私有数据*/void*platform_data;层次关系。...

2022-07-27 21:42:29 961

原创 jz2440_基于平台设备的LED驱动程序

当平台设备加载进内核后,会与platform_device_bus总线上的platform_device进行匹配,若匹配成功则会调用platform_driver中的.probe函数。在释放structdevice设备时,device_release函数会调用device中的release函数,如果没有实现该函数,就会产生如下图的错误。原因是platform_device_bus的.match函数的匹配机制是对比二者的名字是否相同,相同则算匹配。......

2022-07-27 20:54:46 406

转载 Linux内核 struct resource 结构体

但是CPU通常并没有为这些已知的外设I/O的物理地址分配虚拟地址,所以驱动程序并不能直接通过物理地址来访问I/O的地址资源,而必须将它们映射到核心虚拟地址空间(通过页表),然后才能根据映射所得到的核心虚拟地址范围,通过访问指令来访问这些I/O内存资源。典型地,如x86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如x86的IN和OUT指令)来访问这一空间中的地址单元。......

2022-07-27 20:46:49 2796

原创 jz2440_输入子系统驱动程序

对于handler程序由于我们实现的是输入子系统,而内核中已经用现成的输入系统的handler程序。包括evdev.c文件中实现的事件驱动程序、keyboard.c中实现的按键驱动程序等等,因此我们只需要实现dev程序即可。s3c2440_timer_handler是定时器的处理函数,其所需要做的就是对事件进行上报,最终由evdev.c实现的evdev驱动程序来完成。用于获取引脚的值。对于输入子系统驱动的编写,我们可以参考gpio_keys.c文件的实现。...

2022-07-27 00:13:59 213

转载 Linux内核输入子系统事件分析

输入系统协议用类型types和编码codes来表示输入设备的值并用此来通知用户空间的应用程序。这篇文档对这些类型和编码进行了说明并且指出什么时候和如何使用这些类型和编码。一个单一的硬件事件可以产生多个输入事件,每个输入事件包含一个单一数据项的新的数据值。EV_SYN是一个特别的事件类型,它用来把同一时刻产生的多个输入数据分割为多个数据包。在下面的描述中,术语事件(event)是指一个涵盖类型,编码和参数值的单一输入事件。...

2022-07-26 21:53:57 1173

原创 Linux内核输入子系统框架

整个输入子系统的框架就如上图所示输入子系统分为两层,上层为input层,也就是核心层。应用程序操作时与核心层进行交互。核心层会将自己的file_operations结构体替换成下层input_handler中的file_operations。从而使应用程序可以间接访问到input_handler的file_operations。handler该部分负责完成驱动的处理操作;dev该部分负责与硬件设备进行交互工作;它们之间通过一个handle的数据结构相连在一起。......

2022-07-26 11:43:13 376

原创 jz2440_按键驱动程序的防抖机制

在这篇文章中,我们描述了使用按键驱动程序的几种方法。不过在实际操作后,我们可能会出现下面的问题当我们连续快速按下按键,或者因为某些原因机器的按键发生了抖动,就会导致,在某些特定情况中会出现一些程序问题。为了解决上述的问题。我们可以使用内核中的机制。...

2022-07-25 20:27:17 297

原创 驱动程序之同步阻塞互斥

目的:使得同时只有一个应用程序可以打开驱动程序。基于 buttons_irq 驱动程序的基础上进行修改。原子操作指的是在执行过程中,不会被别的代码路径所中断的操作。常用的原子操作函数:驱动程序初始化一个原子变量:修改 open 函数:修改 close 函数:1.2 使用信号量信号量(semaphore)是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区代码。当获取不到信号量时,进程进入休眠等待状态。定义信号量/互斥锁:初始化信号量:获取信号量:释放信号量

2022-07-25 11:18:28 202

原创 jz2440_字符设备按键驱动程序

本程序基于《字符设备驱动程序》的基础上进行改进。三个程序。

2022-07-18 21:32:44 325

原创 Linux内核中断系统结构——软中断

其实现实际上等同于sleep_on。

2022-07-18 21:15:37 1282

原创 Linux异常(中断)处理体系结构

通过上面的分析我们大致弄明白了ARM架构下Linux整个的异常处理流程。Linux系统启动时,会在函数中调用一些列初始化函数包括trap_init函数。trap_init函数完成的工作将中断向量表拷贝到0xffff0000处,这个地址是我们在编译内核时指定的。也不一定是0xffff0000,根据不同的芯片可能会选择中断向量表的存放地址。例如s3c2440芯片就规则了中断向量表存放的地址为0x00000000或0xffff0000两个地址,通过配置寄存器来选择不同的地址。...

2022-07-17 21:39:05 1555

原创 jz2440_简单字符设备LED驱动程序

在Linux系统上,应用层的应用程序,如App1、App2通过Clibrary(C库)提供的open、write、read的读写操纵接口,间接调用systemcall的接口。C库调用systemcall是通过SWI指令来实现的。SWI是一个异常中断,SWI通过提供的val,从而转到相应的内核接口sys_open、sys_read、sys_write等,去执行对应的函数。.........

2022-07-16 10:07:38 349

原创 uboot对环境变量和命令行的分析

在了解了uboot的启动流程(uboot启动流程分析)之后,我们详细得来看uboot的环境变量在内存的组织方式和命令行是如何被执行的。我们知道在uboot的命令行输入命令可以打印出uboot的环境变量信息,这些环境变量是如何存储的?已及是怎么设置的?在内存中的组织方式是怎么样的?是我们这篇要研究明白的。在uboot 第一次烧入进开发板时,环境变量是整合进uboot 程序里面的。我们在命令行使用命令后,会将环境变量保存进我们划定环境变量的存储器,位于Flash中(可以指定为Nor Flash或者是Nand

2022-07-13 19:25:42 949

原创 s3c2440_uboot烧录

ubuntu下tftp的安装、配置、使用(1)普通版本1、安装2、配置建立配置文件。建立/etc/xinetd.d/tftp文件,写入如下内容:命令:其中 server_args为tftp目录,根据实际情况填写若目录不存在,最好创建下:mkdir /var/tftpboot4、重启服务...

2022-07-12 19:54:55 337

原创 s3c2440_uboot移植(六)添加DM9000网卡

在drivers/net/Makefile文件中找到,如下面的:可知,要支持DM9000,我们需要在配置文件里添加的宏定义:然后我们make一下进行编译:发现编译出错,原因是有一个DM9000_DATA 的宏未定义,我们使用 命令查看一下其的定义:可以看到这些configs文件里面的头文件都定义了相应的DM9000_DATA 的宏,我们打开其中一个参考一下:例如上面的pm9261.h 文件中,我们看到还需要定义、 这些宏,我们把这些宏补充到我们的配置文件中:我们再重新make一下:

2022-07-11 21:53:00 552

原创 s3c2440_uboot移植(四)添加NorFlash

在前面中,我们完成了Nand启动代码的编写。启动后会出现Flash 错误的问题,我们在Source insight 里面进行搜索:在532行除,当检测不到Nor Flash 时uboot会被 挂起,这是不应该的。同时,结合我们Nor Flash检测错误,可以确定一点的是 函数肯定需要进行修改。修改后我们重新烧入,替换掉Nand 启动的代码,发现可以正常启动uboot 了。由于我们的开发板上使用Nand 启动时,无法操作Nor Flash,因此后续的测试需要使用Nor 启动。上面为flash_init

2022-07-10 10:53:48 317

转载 UART 协议

Universal Asynchronous Receiver Transmitter即通用异步收发器,是一种通用的串行、异步通信总线该总线有两条数据线,可以实现全双工的发送和接收在嵌入式系统中常用于主机与辅助设备之间的通信。**累积误差:**在使用串口通信时,一次只能发送一个字节。原因是通信双方采用的时钟可能不一样,导致采样时可能出现微小的误差,相差个微小时间单位。如果一次性可以发送多个字节,那么这些微小的时间误差就可能累积成一个大误差,从而导致比特丢失。为了解决这个问题,UART 规定一次性只能发送一个

2022-07-07 09:23:40 2097

单线程下ThreadX线程调度问题

这个资源与文章配套使用

2023-03-07

《DDC/CI Standard》 DDC/CI标准协议文档

DDC/CI标准协议文档

2022-11-03

基于平台设备实现的驱动程序

jz2440_led程序_基于平台设备实现的驱动程序

2022-07-27

输入子系统完整的驱动程序

输入子系统完整的驱动程序

2022-07-27

按键驱动程序防止抖动的源代码

按键驱动程序防止抖动的源代码

2022-07-25

驱动程序之同步阻塞互斥的源码

使得同时只有一个应用程序可以打开驱动程序。

2022-07-25

jz2440 按键驱动程序

韦东山的 jz2440 开发板的按键驱动程序,支持中断方式和轮询方式两种方式。

2022-07-18

简单字符设备驱动程序——jz2440V3

基于jz2440V3的驱动程序代码。 可以点亮LED,详细参考《字符设备驱动程序》一文

2022-07-16

K9F2G08U0C(NAND FLASH)芯片手册

K9F2G08U0C(NAND FLASH)芯片手册

2022-06-28

Linux驱动开发——异步通知驱动程序

Linux驱动开发——异步通知驱动程序

2022-05-01

空空如也

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

TA关注的人

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