- 博客(56)
- 收藏
- 关注
原创 FPGA初步学习之串口发送模块【单字节和字符串的发送】
UART 在发送或接收过程中的一帧数据由4部分组成,起始位、数据位、奇偶校验位和停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。通常用的串口数据帧格式是:8位数据位,无校验位,1位停止位。所以一帧数据有10个bit:1bit起始位,8bit数据位,1bit停止位。
2023-08-05 18:55:15
3184
原创 C语言中的几种关键字(修饰符)
register用 register 修饰的变量称为寄存器变量,与普通变量相比,处理、访问的速度更快,因为变量是存储在寄存器中;但是正因为它是存储在寄存器中的,所以无法获取寄存器变量的地址。并且在有的情况下对寄存器变量的处理速度会下降至和普通变量一样。并且可以用 register 来修饰的数据类型是有限的。static用 static 修饰的变量的作用域仅在变量所在文件内,其他文件无法访问、修改此变量。该类变量如果没有显示的初始化,则会被隐式的初始化为0。extern用于在当前文件中访问其它文件中
2022-05-17 20:07:18
921
原创 【IMX6ULL】Linux中的MISC设备驱动(搭配platform设备驱动)
Linux MISC驱动MISC驱动也叫杂项驱动,但是本质上就是一个字符设备驱动,通常嵌套在platform总线驱动中。MISC设备驱动的主设备号都为10,不同设备使用不同的从设备号,也就是说,这些不同的设备在设备树上的位置处于MISC设备节点的子节点的层次。即 根节点 --> MISC节点 --> 设备节点。miscdevice 结构体minor:子设备的设备号;name:设备名字;fops:操作函数集合,一个结构体变量,存放各种操作函数;注册MISC设备API/* @fu
2022-05-12 13:58:47
753
原创 【IMX6ULL】Linux中的platform驱动
Linux中的platform驱动platform 设备驱动,也叫做平台设备驱动。它来源于将驱动分离和分层的软件设计思路。驱动的分离 也就是将主机驱动和设备驱动分离,不同主机的同一类驱动提供统一的接口API,然后在写设备驱动的时候只要调用这些API函数就能完成驱动的编写。减少了编写驱动底层代码的时间。驱动的分层 分层即是将驱动分成不同的层次,每个层只要做自己的事。例如 input 子系统的最底层是设备原始驱动,负责获取输入设备的原始值,然后上传给核心层;核心层会处理这些数据,然后提供 file
2022-05-11 22:47:36
386
原创 【IMX6ULL】 Linux 的GPIO中断和定时器消抖配置按键驱动
Linux 中断驱动相关API函数request_irq用于申请中断,但不能在中断上下文或其它禁止睡眠的代码段中使用该函数。int request_irq( unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)irq:要申请中断的中断号。handler:中断处理函数,当中断发生以后就会执行此中断处理函数。flags:中断
2022-05-11 21:22:41
1906
原创 Linux内核的 pinctrl 和 gpio 子系统
IMX6ULL的pinctrl子系统驱动在 imx6ull.dtsi 文件中,有如下一个子节点,这个节点是在 根-> soc->aips1->iomuxc,用于IO复用功能。但是该节点的内容主要是追加在 imx6ull-alientek-emmc.dts 文件中,因为不同IO不同需求配置不同,所以就追加在 .dts 文件里。以下就是部分追加内容。而在 fsl,pins = < > 里的内容,就是具体的每一个IO复用功能的配置。MX6UL_PAD_XXX__XXX_XX
2022-05-11 17:21:35
1136
1
原创 IMX6ULL的定时器驱动(搭配pinctrl和gpio子系统,自旋锁)
自旋锁自旋锁顾名思义就是一个一直在旋转循环忙等待的锁,哪个线程有锁就是哪个线程在访问共享资源。而其它线程只能在那等待,当锁被释放了之后,才轮到其它线程占有这个锁。自旋锁只适用于线程持有锁的时间不算太长的情况下,否则会浪费处理器时间,降低系统性能。自旋锁API函数适用于线程和线程之间。需要注意的是:被自旋锁保护的临界区绝对不能调用任何能够引起睡眠或阻塞的API函数,不然可能导致死锁现象。如果在线程之间的并发访问时,中断也要参与的话,在中断里可以使用自旋锁,但是在获取锁之前要先禁止本地中断(本CPU中
2022-05-11 17:12:39
500
原创 Linux驱动开发中的中间件:设备树
Linux设备树设备树的产生是为了解决内核源码的arch/arm目录下代码混乱和臃肿的问题(过去每个厂商出个板子就要提供外设硬件和平台硬件信息,这些信息以.c和.h文件的形式呈现)。在使用设备树之后,就使得每个硬件平台的硬件资源仅需要一个设备树文件来描述了,而不用在内核源码的arch/arm下以.c 或 .h 文件来定义。Linux内核则在启动过程中,通过解析设备树中的硬件资源来初始化某个具体的平台。DTS、DTB、DTC三者的关系DTS是设备树源码文件;DTB是DTS编译后得到的二进制文件;DT
2022-05-06 15:29:07
1530
1
原创 Linux驱动开发【一】:字符设备驱动
[驱动文件内容]对设备的操作函数打开设备从设备文件中读取数据向设备文件内写入数据关闭设备文件三个组件设备操作函数结构体设备初始化(作为驱动的入口函数)设备注销(作为驱动的出口函数)其他信息LICENSE作者信息…驱动文件包含的函数打开设备static int chrdevbase_open(struct inode *inode, struct file *filp)从设备读取数据static ssize_t chrdevbase_read(struct f
2022-05-05 04:16:44
749
原创 IMX6ULL驱动开发前奏三:根文件系统构建步骤明细
Linux搭建根文件系统根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。使用BusyBox构建根文件系统先在NFS服务器目录下创建一个rootfs文件夹,用于通过NFS挂载根文件系统。(存放在NFS下的文件夹)获取的busybox压缩包放入任意文件夹中并解压。(存放在自定义任意文件夹)/*命令*/mkdir rootfstar -vxjf bus
2022-05-03 20:28:55
894
原创 IMX6ULL驱动开发前奏二:Linux内核移植步骤明细
Linux内核移植获取源码和修改Makefile先从NXP获取官方源码,添加到自定义的目录下,然后解压tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2修改顶层Makefile,也就是内核根目录下的Makefile。给ARCH和CROSS_COMPILE变量赋值编译Linux内核先清理下内核make clean再配置内核make imx_v7_mfg_defconfig最后编译make -j16编译成功后如下图
2022-05-03 20:25:11
2018
原创 对FreeRTOS的task.c文件源码的分析笔记(一)
task.c文件TCB结构体分析typedef struct tskTaskControlBlock{ volatile StackType_t *pxTopOfStack; #if ( portUSING_MPU_WRAPPERS == 1 ) xMPU_SETTINGS xMPUSettings; #endif ListItem_t xStateListItem; //状态列表项 ListItem_t xEventListItem; //事件列
2022-04-29 12:26:28
771
原创 IMX6ULL驱动开发前奏一:u-boot移植步骤明细
U-boot移植uboot实际上就是一个裸机程序,但它是用来引导linux内核启动的,就像电脑上的bios。本文只要是记录利用NXP官方的uboot进行改造,适配正点原子IMX6ULL阿尔法开发板的过程涉及到的文件(可能不全)/home/swiler/uboot_official/uboot-imx-rel_imx_4.1.15_2.1.0_ga_alientek/configs/mx6ull_14x14_evk_defconfig/home/swiler/uboot_official/uboo
2022-04-24 17:15:29
1890
原创 IMX6ULL裸机开发之硬件SPI分析及配置过程
裸机配置硬件SPI详细的SPI时序介绍可看我的另外一篇文章:STM32之SPI详细解析ESPI介绍IMX6U 自带的 SPI 外设叫做 ECSPI,全称是 Enhanced Configurable Serial Peripheral Interface,ECSPI包含一个64x32接收缓冲区(RXFIFO)和一个64x32传输缓冲区(TXFIFO)。通过数据FIFOs,ECSPI允许以更少的软件中断快速进行数据通信。IMX6U有4个ESPI。下图是ECSPI的框图。由一堆寄存器,时钟产生器,外部引脚
2022-04-21 21:05:08
2013
原创 IMX6ULL裸机开发之硬件IIC分析及配置过程
裸机配置硬件I2C关于I2C的具体介绍,可以参考我的另一篇文章STM32之IIC详细解析IMX6U的硬件I2C特性兼容标准I2C总线;软件可配置64个不同的串行时钟频率;软件可选的应答信号;start/end信号生成和检测;重复start信号生成;确认位生成;总线busy检测。I2C的两种模式标准模式:在该模式下I2C传输速率可达100kb/s;高速模式:在该模式下I2C传输速率可达400kb/s;外部引脚MAPIMX6U有4组IIC,这里举个例子,另外的参考《IMX6
2022-04-21 17:39:57
1502
原创 IMX6ULL裸机开发之配置eLCDIF点亮RGB液晶屏分析及配置过程
裸机配置RGB液晶屏显示接口eLCDIF主要特性总线主接口到源帧缓冲区数据进行显示刷新。这个接口也可以用于驱动显示器的数据。PIO接口,以管理显示器和SoC之间的数据传输。8/16/18/24位LCD数据总线支持可用,具体取决于I/Omux选项。可编程定时和参数的MPU、VSYNC和DOTCLKLCD接口,以支持多种显示器。外部接口LCD_DATA0~LCD_DATA23:24根数据线,用来传输数据。双向IO口。LCD_BUSY:忙信号线。LCD_CLK:时钟信号线。LCD_CS:
2022-04-21 15:41:36
1665
原创 IMX6ULL裸机开发之GPT通用定时器分析及配置过程
IMX6U裸机配置通用定时器GPT介绍先来看看GPT(General Purpose Timer)即通用定时器的概述图:绿色方框部分是时钟源,它有一个12位的分频器,分频系数范围为 1 ~ 4096;蓝色高亮处是一个32位的计数器,并且是向上计数的;红色方框是两个输入捕获通道;橙色方框是三个输出比较通道;其中输出比较通道比较的是 Timer Output Regx 寄存器和 Timer Counter 寄存器的值,输出口则是三个GPT_COMPAREx;无论输入输出,都有对应的中断事件,这
2022-04-20 18:50:44
1355
原创 IMX6ULL裸机开发之EPIT周期性定时器分析及配置过程
周期中断定时器关于EPIT定时器的内容位于《IMX6UL参考手册》的1013页。Enhanced Periodic Interrupt Timer (EPIT):增强型周期中断定时器,这个定时器的计数方式是向下计数。即计数一次就减一。并且这个定时器主要工作是完成周期性中断定时。EPIT的组成EPIT由五个部分组成:时钟源,12位分频器,三个32位的寄存器,中断,输出引脚。时钟源可以来自:ipg_clk、ipg_clk_32、ipg_clk_highfreq。12位预分频器的分频系数为:1~409
2022-04-20 13:51:05
677
原创 IMX6ULL裸机开发之时钟树分析及配置过程
时钟时钟树时钟树由三部分组成:时钟切换控制器,根时钟产生器,系统时钟一个外设的时钟信号的产生途径:晶振向芯片输入时钟信号,信号进入时钟切换控制器,经过用户配置,产生PLL时钟信号,该信号进入根时钟产生步骤,经过分频或倍频,最终成为系统某个外设的时钟信号。(这个时钟树难度不大,但是分支太多,需要配置的寄存器也多,所以看起来会比较费劲,但是其原理都是大体一致的)橙色梯形的是选择器,可以选择不同的PLL时钟作为时钟源;矩形就是分频器(2位,3位,6位)。黄色高亮的就是用来配置选择器的各种寄存器时钟切
2022-04-19 19:02:09
2810
原创 IMX6ULL裸机开发之点亮LED灯
裸机点亮LED灯该实验使用正点原子的linux开发板和下载工具知识储备GPIO时钟控制器在《IMX6ULL用户手册》中,时钟控制器模块介绍在第18章首先看CCM Clock Gating Register 0 (CCM_CCGR0) ~ CCM Clock Gating Register 6 (CCM_CCGR6) ,这7个寄存器是用来控制每个模块的时钟。这些寄存器都是32位的,每两个位控制一个外设的时钟。如下是配置效果:00:所有模式下都关闭外设时钟。01:只有在运行模式下打开外设时钟,等
2022-04-18 17:40:55
1039
4
原创 对FreeRTOS的task.h文件源码的分析笔记
慢慢从源码来理解FreeRTOS的工作原理版本信息//大版本.小版本.构建版本#define tskKERNEL_VERSION_NUMBER "V10.0.1"#define tskKERNEL_VERSION_MAJOR 10#define tskKERNEL_VERSION_MINOR 0#define tskKERNEL_VERSION_BUILD 1两个引用的函数原型/* 任务引用的类型,是一个void*型的指针,作为任务句柄 *//* void*型指针是一个特殊的指针,任何指
2022-04-16 15:45:22
970
1
原创 对FreeRTOS的List.c和.h文件源码的分析笔记
List.h文件列表项结构体(节点)struct xLIST_ITEM{ listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< 检查列表项完整性 */ configLIST_VOLATILE TickType_t xItemValue; /*< 列表项的值 */ struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< 指向下一个列表项 */ struct xLIST_ITEM *
2022-04-16 01:35:18
3084
原创 STM32之RTC时钟,闹钟,日历
RTC时钟的一些功能介绍RTC时钟即实时时钟,它提供了用于管理所有低功耗模式的自动唤醒单元,还提供了具有可编程闹钟中断功能的日历时钟/日历。并且可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。并且还可以进行夏令时补偿。中断屏蔽事件:有两个闹钟,时间戳,入侵检测,唤醒中断。硬件上需要注意的部分若要使用rtc功能,并且能够掉电继续工作,那么要外接纽扣电池或其他电池电源。这里参考的是STM32F767芯片及正点的底板的设计原理图(用BAT54C做多电源供电电路,当单片机上电时,使
2022-04-13 13:15:19
9036
1
原创 FatFs文件系统移植过程及中度分析
FatFs 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 组件的编写遵循ANSI C(C89),完全分离于磁盘 I/O 层,因此不依赖于硬件平台。它可以嵌入到资源有限的微控制器中,如 8051, PIC, AVR, ARM, Z80, RX等等,不需要做任何修改。如果要进行移植的话可以直接看后面的移植步骤,前面是对文件系统中的一些常见的代码进行简单介绍。本文比较长,可以先收藏再看。首先大致看看文件系统源码的目录结构。在下载好文件系统的源码包解压
2022-04-10 20:58:30
3920
原创 STM32之SPI详细解析
SPI介绍SPI协议,用来传输数据的一种标准化协议。SPI包括这些独特的特点:主模式和从模式双向模式从模式选择输出模式故障错误标志与CPU中断能力双缓冲数据寄存器具有可编程极性和相位的串行时钟在等待模式下对SPI操作的控制引脚描述: MOSI:此引脚用于在配置为主主模块时从SPI模块中传输数据,并在配置为从主模块时接收数据。(主出从入) MISO:在配置为SPI模块时从SPI模块中传输数据,在配置为主模块时接收数据。(主入从出) SS:(低有效
2022-03-13 15:36:14
29694
1
原创 STM32之IIC详细解析
原理介绍不多说,直接分析先看IIC的一些特性由下图可以知道,IIC的传输是同步传输的,具有强制性的起始信号、停止信号、ACK响应信号、7位的从机地址。但是时钟拉伸(每一个时钟脉冲的时间)、软件复位等可以用户自定义,还可以选择10位从机地址的设备,这解决了IIC只能接128个设备的限制问题。并且在挂载多个从机的情况下,可以设置起始字节(start byte)。关于总线的逻辑0和逻辑1由于可以连接各种各样的设备,总线的逻辑上的“0”(LOW)和“1”(HIGH)的级别不是固定的,而是依赖于VDD的相关
2022-03-12 01:47:12
15635
1
原创 STM32之简易GUI(多级菜单进阶版)
很久之前,写过一个简易的多级菜单,如今回头看,我都不敢承认那玩意是自己写的,于是打算重新写过一个,并且做成一个简易的GUI。原来用的OLED,现在改成了TFT(ST7789驱动)。但是答题的思路还是不变的。先说说思路,由于选择的是一个没有触摸的屏幕,于是就要加上物理按键。这样才能操作屏幕嘛。按照面向对象的思想,我将整个GUI结构分为三类:按键,显示,动作。按键用来控制屏幕,进行上滑下滑切入切出菜单;显示则作为每一级菜单的背景,并且将菜单设置为静态显示(即每次切换只显示一次);动作则用来链接各种显
2022-03-10 11:25:47
17972
15
原创 FreeRTOS(四)任务管理
任务的基本概念 FreeRTOS 的任务可认为是一系列独立任务的集合。每个任务在自己的环境中运行。在任何时刻,只有一个任务得到运行,FreeRTOS 调度器决定运行哪个任务。调度器会不断的启动、停止每一个任务,宏观看上去所有的任务都在同时在执行。 调度器做的事情就是,再任务切入切出的时候保存上下文环境信息(寄存器值、堆栈内容等),所以每一个任务都需要有自己的栈空间。当任务切出时,它的执行环境会被保存在该任务的栈空间中,这样当任务再次运行时,就能从堆栈中正确的恢复上次的运行环境,任务越多,需要的堆
2022-02-27 00:30:04
963
原创 FreeRTOS(三)启动流程
启动流程FreeRTOS的主要两种启动流程在 main 函数中将硬件初始化,RTOS 系统初始化,所有任务的创建这些都弄好。最后启动 RTOS 的调度器,开始多任务的调度。(先创建,再调度)int main (void){ /* 硬件初始化 */ HardWare_Init(); /* RTOS 系统初始化 */ RTOS_Init(); /* 创建任务 1,但任务 1 不会执行,因为调度器还没有开启 */ RTOS_TaskCreate(
2022-02-27 00:26:51
1556
原创 十、Linux开发板控制LED灯设备
控制LED灯设备驱动程序本质:为硬件设备创建相应的设备节点文件创建设备文件时,规定好设备文件的使用方式。应用程序根据驱动程序规定的设备文件使用方式去控制硬件控制硬件设备步骤1、找出硬件设备所对应的设备节点文件两个地方:/dev目录下对驱动程序熟悉的工程师可以使用,一个设备节点文件控制硬件全部特性/sys目录下业余工程师使用,一个设备节点文件只控制硬件的一个特性严格来说,它下面的文件是Linux内核导出到用户空间的硬件操作接口2、找出驱动程序规定的设备文件使用方式LE
2022-02-26 19:03:21
2052
原创 STM32之LCD液晶屏(ILI9341)模拟8080时序
配置8080时序的LCD液晶屏8080的控制线有四根:RD 写使能,WR 读使能,DC数据/命令,CS 片选8080总线存在许多接口:8/9/16/18位接口8080通用时序读时序LCD_CS = 0; //片选选中 LCD_DC = 1; //读数据 LCD_WR = 1; //禁止写 LCD_RD = 0; //开始读data = DATAIN(); //读取数据 LCD_RD = 1; //结束读LCD_CS = 1; //结束片选写时序DC =
2022-02-26 18:54:23
11610
5
原创 FreeRTOS(二)创建任务
任务一. 任务的基本概念FreeRTOS的任务可以认为是一系列独立的任务的集合。每个任务在自己的环境中运行,并且每个时刻只有一个任务在运行,但从宏观上看,所有的任务都在同时执行;不同任务的切换与任务本身无关,这是由调度器来实现的。调度器负责在任务切入、切出时保存上下文环境(寄存器值、栈内容);所以每个任务都有自己独立的栈空间,任务切出时,其执行环境会被保存在该任务的栈空间中,当任务再次运行时,就能从栈中恢复上次的运行环境。任务越多,需要的栈空间就越大,一个系统能运行多少个任务,取决于
2022-02-23 17:20:36
1715
原创 FreeRTOS(一)移植FreeRTOS到STM32
FreeRTOS 的编程风格数据类型 FreeRTOS中的数据类型重定义。在 FreeRTOS 中,使用的数据类型虽然都是标准 C 里面的数据类型,但是针对不同的处理器,对标准 C 的数据类型在文件portmacro.h这个头文件中进行重定义#define portCHAR char#define portFLOAT float#define portDOUBLE double#define portLONG long#define portSHORT short#define
2022-02-23 17:17:45
695
原创 STM32之三种定时器的不同功能
配置定时器定时器分类(STM32F103RCT6)定时器相关结构①时钟源定时器时钟 TIMxCLK,即内部时钟 CK_INT,经 APB1 预分频器后分频提供,如果APB1 预分频系数等于 1,则频率不变,否则频率乘2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M。②计数器时钟定时器时钟经过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。PSC 是一个16 位的预分频器,可以对定时器时钟 TIMxCLK 进行
2022-02-23 13:18:48
8693
原创 STM32之串口相关配置
配置串口串口简介 通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UA
2022-02-23 12:59:48
8189
原创 STM32之DS18B20温度传感器
10.配置DS18B20温度传感器配置初始化函数DS18B20的通信协议为单总线通信协议首先由主机发送一个复位脉冲约480960us;然后总线被拉高;在1560us之后传感器向单片机发送一个约60~240us的存在脉冲,然后总线被拉高。uint8_t DS18B20_Rst(void){ DS18B20_GPIO_Config (); DS18B20_DQ_1; DS18B20_Mode_Out_PP(); DS18B20_DQ_0; Delay_us(7
2022-02-22 22:49:44
5517
3
原创 九、文件描述符和打开模式
文件描述符和打开模式文件描述符一种特殊的索引,实际上就是进程中file_struct结构体成员fd_array的数组下标文件打开模式主模式:O_RDONLY:只读模式O_WRONLY:只写模式O_RDWR:读写,模式副模式:O_CREAT:当文件不存在,需要去创建文件O_APPEND:追加模式O_DIRECT:直接IO模式O_SYNC:同步模式O_NOBLOCK:非阻塞模式open_close函数OPEN函数头文件:#include <sys/types.h&
2022-02-21 23:10:54
359
原创 八、从0开始编写一个Makefile
MakefileMakefile简介make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。eg:一个工程有8个c文件,和3个头文件,我们要写一个makefile来告诉make命令如何编译和链接这几个文件。规则是:如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的c文件,并链接目标程序。只要我
2022-02-21 23:10:33
751
原创 七、安装NFS服务器
安装NFS服务器什么是NFS服务器 NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利。客户端可以将本地挂载目录下的文件挂载到服务端的共享目录中去。服务端就可以读取这些文件。NFS服务的优缺点1、优点(1)节省本地存储空间将常用的数据存放在一台
2022-02-20 20:59:25
1221
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人