imx6u的串口通信
UART 通信格式
串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。
空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输。数据位:数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。奇偶校验位:这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。停止位:数据传输完成标志位,停止位的位数可以选择 1 位、1.5 位或 2 位高电平,一般都选择 1 位停止位。波特率:波特率就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 9600、19200、115200 等。
UART 一般的接口电平有 TTL 和 RS-232,一般开发板上都有 TXD 和 RX ...
imx6u的EPIT定时器
EPITEPIT的全称是:Enhanced Periodic Interrupt Timer,直译过来就是增强的周期中断定时器,它主要是完成周期性中断定时的。
EPIT 是一个 32 位定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能以后 EPIT 就会开始运行,EPIT 定时器有如下特点:
①、时钟源可选的 32 位向下计数器。②、12 位的分频值。③、当计数值和比较值相等的时候产生中断。
①、这是个多路选择器,用来选择 EPIT 定时器的时钟源,EPIT 共有 3 个时钟源可选择,ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq。②、这是一个 12 位的分频器,负责对时钟源进行分频,12 位对应的值是 04095,对应着14096 分频。③、经过分频的时钟进入到 EPIT 内部,在 EPIT 内部有三个重要的寄存器:计数寄存器(EPIT_CNR)、加载寄存器(EPIT_LR)和比较寄存器(EPIT_CMPR),这三个寄存器都是 32 位的。EPIT 是一个向下计数器,也就是说给它一个初值,它就会从这个给定的初值开始递减,直到减为 0,计 ...
imx6u的GPIO中断
中断过程STM32 的中断系统主要有以下几个关键点:①、中断向量表。②、NVIC(内嵌向量中断控制器)。③、中断使能。④、中断服务函数
而在imx6ul中的NVIC中断管理机构叫做GIC。
中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。
Cortex-A7中断系统简介跟 STM32 一样,Cortex-A7 也有中断向量表,中断向量表也是在代码的最前面。CortexA7 内核有 8 个异常中断,这 8 个异常中断的中断向量表如表 :
①、复位中断(Rest),CPU 复位以后就会进入复位中断,我们可以在复位中断服务函数里面做一些初始化工作,比如初始化 SP 指针、DDR 等等。②、未定义指令中断(Undefined Instruction),如果指令不能识别的话就会产生此中断。③、软中断(Software Interrupt,SWI),由 SWI 指令引起的中断,Linux 的系统调用会用 SWI指令来引起软中断,通过软中断来陷入到内核空间。④、指令预取中止中断(Prefetch Abort),预取指令的出错的时候 ...
imx6u时钟配置
系统时钟来源
开发板的系统时钟来源于两部分:32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源,24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。
I.MX6U 的外设有很多,不同的外设时钟源不同,这些外设的时钟源分了7组,这 7 组时钟源都是从 24MHz 晶振 PLL 而来的,因此也叫做 7 组 PLL.
时钟树由下面的时钟切换图可知,IMX6U总共有7组PLL:
PLL1(996M)、PLL2(528M)、PLL3(480M)、PLL4、PLL5、PLL6、PLL7
其中PLL2、PLL3各自有4组PFD,这些PFD以PLL为基础,经过不同的分频系数可以产生不同频率的时钟,在参考手册的相关寄存器的地方,可以看到官方有推荐的配置参数。(《IMX6UL参考手册》
①、 ARM_PLL(PLL1),此路 PLL 是供 ARM 内核使用的,ARM 内核时钟就是由此 PLL生成的,此 PLL 通过编程的方式最高可倍频到 1.3GHz。②、528_PLL(PLL2),此路 PLL 也叫做 System_PLL,此路 PLL ...
GPIO寄存器配置原理
i.MX6ULL也有多种点灯方式:(究其本质,最终都是要操作i.MX6ULL的寄存器)
裸机系统:汇编操作寄存器点灯、C语言操作寄存器点灯
跑Linux系统:字符驱动LED点灯、设备树驱动LED点灯
IO与GPIO是两个概念,GPIO是属于IO的一部分。IO: Input Output,用于CPU与外界进行信息交互。例如CPU 读内存数据需要 I/O 系统,CPU 输出数据到屏幕显示出来也需要 I/O 系统,信息在 I/O 系统上传输有串行或并行。GPIO: General-Purpose IO ports,即通用I/O口,在微控制器芯片上一般都会提供一个“通用可编程I/O接口”。接口至少有两个寄存器——数据寄存器与控制寄存器。数据寄存器的各位直接引到芯片外部,控制寄存器则是对数据寄存器中每一位进行独立的设置。
imx6ul的GPIO硬件结构
① PAD:它代表了i.MX6ULL芯片的一个GPIO引脚。
② IOMUX复用选择器:与STM32的引脚复用功能类似,i.MX6ULL芯片的每个IO通过IOMUXC中的MUX寄存器和PAD寄存 ...
bsp工程管理
BSP管理所有完成同一个功能的代码提取出来放到一个单独的文件中,也就是对程序分功能管理。
所谓bsp管理就是按照各个功能函数模块化放入各自文件夹进行保存管理,使用时到各自的路径中进行调用。
类似于stm32的工程管理格式来存储。
首先以led实验为例子,其中 bsp 用来存放驱动文件;imx6ul 用来存放跟芯片有关的文件,比如 SDK库文件;obj 用来存放编译生成的.o 文件;project 存放 start.S 和 main.c 文件,cc.h、fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h 这四个文件拷贝到文件夹 imx6ul 中;将 start.S 和 main.c 这两个文件拷贝到文件夹 project 中。前面的实验中所有的驱动相关的函数都写到了 main.c 文件中,比如函数 clk_enable、led_init 和 delay,这三个函数可以分为三类:时钟驱动、LED 驱动和延时驱动。因此我们可以在 bsp 文件夹下创建三个子文件夹:clk、delay 和 led,分别用来存放时钟驱动文件、延时驱动文件和 LED 驱动文件,这样ma ...
C语言点亮led
Cortex-A 处理器运行模型
Cortex-A7 处理器有 9 种处理模式。如下图:
所有的处理器模式都共用一个 CPSR 物理寄存器,因此 CPSR 可以在任何模式下被访问。CPSR 是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志等一些状态位以及一些控制位。所有的处理器模式都共用一个 CPSR 必然会导致冲突,为此,除了 User 和 Sys 这两个模式以外,其他 7 个模式每个都配备了一个专用的物理状态寄存器,叫做 SPSR(备份程序状态寄存器),当特定的异常中断发生时,SPSR 寄存器用来保存当前程序状态寄存器(CPSR)的值,当异常退出以后可以用 SPSR 中保存的值来恢复 CPSR。
N(bit31):当两个补码表示的 有符号整数运算的时候,N=1 表示运算对的结果为负数,N=0表示结果为正数。Z(bit30):Z=1 表示运算结果为零,Z=0 表示运算结果不为零,对于 CMP 指令,Z=1 表示进行比较的两个数大小相等。C(bit29):在加法指令中,当结果产生了进位,则 C= ...
汇编点亮led
I.MX6ULL的IO分为SNVS域值和通用的。
点亮led的GPIO需要以下设置:
①、使能 GPIO 对应的时钟。②、设置寄存器 IOMUXC_SW_MUX_CTL_PAD_XX_XX,设置 IO 的复用功能,使其复用为 GPIO 功能。③、设置寄存器 IOMUXC_SW_PAD_CTL_PAD_XX_XX,设置 IO 的上下拉、速度等等。④、第②步已经将 IO 复用为了 GPIO 功能,所以需要配置 GPIO,设置输入/输出、是否使用中断、默认输出电平等。
1.首先是定义全局标号_start,代码是从这开始续写。
2.像stm32一样使能时钟,首先是查询手册查找每一个CCGR的地址并将其进行置1,为点亮led,使GPIO进行复用。查询手册寻找SW_MUX_GPIO_IO103_BASE的地址,并且查看手册MUX_MODE将其设置为GPIO的输出。
会是ALT5模式置0101来调为GPIO输出,GPIO1_IO00有两个书签:
12IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00//配置复用模式IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO ...
arm汇编
GNU 汇编语法GNU汇编语法适用于所有架构,每条语句有三个可选部分。
1label:instruction @ comment
label 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。instruction 即指令,也就是汇编指令或伪指令。@符号,表示后面的是注释。comment 就是注释内容。
注意!ARM 中的指令、伪指令、伪操作、寄存器名等可以全部使用大写,也可以全部使用小写,但是不能大小写混用。
用户可以使用.section 伪操作来定义一个段,汇编系统预定义了一些段名:.text 表示代码段。.data 初始化的数据段。.bss 未初始化的数据段。.rodata 只读数据段。
常见的伪操作有:.byte 定义单字节数据,比如.byte 0x12。.short 定义双字节数据,比如.short 0x1234。.long 定义一个 4 字节数据,比如.long 0x12345678。.equ 赋值语句,格式为:.equ 变量名,表 ...
线程
进程线程是参与系统调度的最小单位。它被包含在进程之中,是进程中的实际运行单位。一个线程指的是进程中一个单一顺序的控制流(或者说是执行路线、执行流),一个进程中可以创建多个线程,多个线程实现并发运行,每个线程执行不同的任务。
任何一个进程都包含一个主线程,只有主线程的进程称为单线程进程.
那自然就存在多线程进程,所谓多线程指的是除了主线程以外,还包含其它的线程,其它线程通常由主线程来创建(调用pthread_create 创建一个新的线程),那么创建的新线程就是主线程的子线程。
主线程的重要性体现在两方面:⚫ 其它新的线程(也就是子线程)是由主线程创建的;⚫ 主线程通常会在最后结束运行,执行各种清理工作,譬如回收各个子线程。
线程是程序最基本的运行单位,而进程不能运行,真正运行的是进程中的线程。同一进程中的多个线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack,我们称为线程栈),自己的寄存器环境(register context)、自己的线程本地存储(thread-local storage)。
多进程编 ...

