- 博客(66)
- 收藏
- 关注
原创 PIXHAWK(ardupilot4.52)新增自定义mavlink消息
mavlink的定义在ardupilot\modules\mavink\message_ defnitions\v1.0\common.xml文件中。在头文件中可以看到mavlink的发送函数。在程序中调用该发送函数即可发送自定义的mavlink消息了。注意自定义的ID不要跟原有的ID冲突了,且定义在255后的ID需要用mavlink2协议才能有输出。可以直接效仿原有的定义新增一个自定义的mavlink消息;
2025-04-08 14:04:57
172
原创 Linux学习笔记18---串口格式化函数移植实验
上一章实验我们实现了 UART1基本的数据收发功能,虽然可以用来调试程序,但是功能太单一了,只能输出字符。如果需要输出数字的时候就需要我们自己先将数字转换为字符,非常的不方便。学习 STM32串口的时候我们都会将printf函数映射到串口上,这样就可以使用printf 函数来完成格式化输出了,使用非常方便。本章我们就来学习如何将printf这样的格式化函数移植到 I.MX6U-ALPHA开发板上。
2025-02-13 10:15:45
1070
原创 Linux学习笔记19---DDR3 实验
因此只要做好硬件,可以在不需要修改硬件 PCB 的前提下,随意的更换不同容量、不同品牌的 DDR3L 芯片,极大的方便了我们的芯片选型。因此就有行地址和列地址之分,行地址和列地址共同复用同一组地址线,要访问某一个地址区域,必须要发送行地址和列地址,指定要访问哪一行?就讲解到这里,因为牵扯到的寄存器太多了,因此没有详细的去分析这些寄存器,大家感兴趣的可以对照着参考手册去分析各个寄存器的含义以及配置值。只 是写起来比较麻烦,要先进行擦除,然后再发送要写的地址或扇区,最后才是要写入的数据,学习过 STM32。
2025-02-13 10:15:30
1110
原创 Linux学习笔记17---UART 串口通信实验
不管是单片机开发还是嵌入式 Linux开发,串口都是最常用到的外设。可以通过串口将开发板与电脑相连,然后在电脑上通过串口调试助手来调试程序。还有很多的模块,比如蓝牙、 GPS、GPRS等都使用的串口来与主控进行通信的,在嵌入式Linux中一般使用串口作为控制台,所以掌握串口是必备的技能。本章我们就来学习如何驱动 I.MX6U上的串口,并使用串口和电脑进行通信。
2025-02-07 17:58:14
828
原创 Linux学习笔记16---高精度延时实验
学过 STM32的同学应该知道,在使用STM32的时候可以使用SYSTICK来实现高精度延时。I.MX6U没有SYSTICK定时器,但是I.MX6U有其他定时器啊,比如第十五章讲解的EPIT定时器。本章我们使用 I.MX6U的GPT定时器来实现高精度延时,顺便学习一下GPT定时器, GPT 定时器全称为。GPT 定时器是一个32位向上定时器也就是从0X00000000开始向上递增计数GPT。
2025-02-06 18:11:48
1051
原创 Linux学习笔记15---定时器按键消抖实验
按键消抖的原理在第十一章已经详细的讲解了,其实就是在按键按下以后延时一段时间再去读取按键值,如果此时按键值还有效那就表示这是一次有效的按键,中间的延时就是消抖的。但是这有一个缺点,就是延时函数会浪费 CPU性能,因为延时函数就是空跑。如果按键是用中断方式实现的,那就更不能在中断服务函数里面使用延时函数,因为中断服务函数最基本的要求就是快进快出!上一章我们学习了 EPIT定时器,定时器设置好定时时间,然后CPU就可以做其他事情去了,定时时间到了以后就会触发中断,然后在中断中做相应的处理即可。
2025-02-06 16:06:15
983
原创 PIXHAWK(ardupilot4.52)单ic通道输出pwm
搜索查找后可以找到void AP_MotorsUGV::output(bool armed, float ground_speed, float dt)这个函数,看名称可以判断为输出函数。_throttle在这个函数中使用了,但是最终都汇聚在SRV_Channels::output_ch_all();在这个函数中可以看到形参desired_throttle最终是递给了_throttle这个参数。该函数下,前面的都是验证每个通道分别需要多少的pwm输出,函数的最后才是控制单独通道的单独输出。
2024-11-18 09:51:15
710
原创 STM32CubeMX学习笔记33---芯片因未选serial debug被锁住
利用STM32CubeMX配置了一个工程,下载到芯片后,芯片能够正常工作,但是在第二次通过SWD却怎么都连接不上芯片,偶尔按住复位键能够连接上芯片,但是无法读取也无法擦除flash。在配置STM32CubeMX时,sys设置中,选择了Disable才导致了芯片被锁死,需要配置成serial debug(由于之前用的是103,没有这个设置,所以一直没注意到)。2、boot0和boot1都接高电平,然后给芯片擦除flash并烧录一个正常的固件,boot0和boot1都恢复正常的工作状态即可。
2024-11-14 11:11:30
989
原创 Linux学习笔记14---EPIT 定时器实验
EPIT的全称是:,直译过来就是增强的周期中断定时器,它主要是完成周期性中断定时的。学过 STM32的话应该知道,STM32里面的定时器还有很多其它的功能,比如输入捕获、PWM输出等等。但是I.MX6U的EPIT定时器只是完成周期性中断定时的,仅此一项功能!至于输入捕获、PWM输出等这些功能,I.MX6U由其它的外设来完成。EPIT是一个32位定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能以后 EPIT就会开始运行,EPIT定时器有如下特点:
2024-10-23 15:04:22
1173
原创 Linux学习笔记13---GPIO 中断实验
中断系统是一个处理器重要的组成部分,中断系统极大的提高了CPU 的执行效率,本章会将I.MX6U的一个IO作为输入中断,借此来讲解如何对 I.MX6U的中断系统进行编程。
2024-09-23 18:07:50
1326
原创 Linux学习笔记12---主频和时钟配置实验
I.MX6U 的所有外设时钟源都是从这7路PLL和有些PLL的 PFD 而来的,这些外设究竟是如何选择PLL或者PFD的?这个就要借助《IMX6ULL参考手 册》里面的时钟树了,在“Chapter 18 Clock Controller Module (CCM)”的18.3小节给出了I.MX6U 详细的时钟树图,如图所示:在图中一共有三部分:和SYSTEM CLOCKS。其中左边的就是我们上一小节讲解的那7路PLL和 8 路PFD,右边的。
2024-09-06 17:10:24
1276
原创 维度不固定的多维数组形参笔记
假如我有多个元素个数都不一致的多维数组都需要调用这个函数进行处理,这个形参问题就凸显出来了,总不能创建N个不同的函数来进行处理吧?这样也太繁琐了,而且也适用度不高。这个函数可以传入多维数组,但元素个数必须是固定的,假如传入一个str[][20],元素个数不一样的数组,那么这个函数就不适用了,且会报错。所有数据在存储空间里面都是有地址的,那么就可利用指针寻址来获取到相应的数据。在查找了一些资料后受到了一点启发。而这里也可利用指针来指向多维数组。
2024-09-05 11:32:26
304
原创 Linux学习笔记11---按键输入
I.MX6U 的 IO 不仅能作为输出,而且也可以作为输入。I.MX6U-ALPHA 开发板上有一个按键,按键连接了一个 IO,将这个 IO 配置为输入功能,读取这个 IO 的值即可获取按键的状态(按下或松开)。本章通过这个按键来控制蜂鸣器的开关。
2024-08-30 11:24:18
787
原创 Linux学习笔记10---蜂鸣器
beep.c 文件一共有两个函数:beep_init 和 beep_switch,其中 beep_init 用来初始化 BEEP 所使用的 GPIO,也就是 SNVS_TAMPER1,将其复用为 GPIO5_IO01,和上一章的 LED 灯初始化函数一样。前几章试验中的驱动 LED 灯亮灭属于 GPIO 的输出控制,本章再巩固一下 I.MX6U 的 GPIO输出控制,在 I.MX6U-ALPHA 开发板上有一个有源蜂鸣器,通过 IO 输出高低电平即可控制蜂鸣器的开关,本质上也属于 GPIO 的输出控制。
2024-08-07 20:23:21
945
原创 Linux学习笔记9---BSP 工程管理实验
一个工程的功能越多,所需要的功能文件就越多,那么文档就会更大,显得很混乱,所以我们需要对这个工程进行整理,将源码文件分模块、分功能整理。
2024-05-13 11:51:22
1479
原创 Linux学习笔记8---官方 SDK 移植实验
在上一章中,我们参考 ST 官方给 STM32 编写的 stm32f10x.h 来自行编写 I.MX6U 的寄存器定义文件。自己编写这些寄存器定义不仅费时费力,没有任何意义,而且很容易写错,幸好NXP 官方为 I.MX6ULL 编写了 SDK 包,在 SDK 包里面 NXP 已经编写好了寄存器定义文件,所以我们可以直接移植 SDK 包里面的文件来用。虽然 NXP 是为 I.MX6ULL 编写的 SDK 包,但是 I.MX6UL 也是可以使用的!
2024-05-11 15:54:31
1009
原创 Linux学习笔记7---仿STM32自建寄存器库
根据结构体 GPIO_Type的定义,其第一个成员变量为DR,也就是 DR寄存器,I.MX6U 一共有通过上面三步我们就可以通过“GPIO1->DR”来访问 GPIO1的DR寄存器了。同样的,其他的外设寄存器都可以通过这三步来定义。
2024-05-11 15:53:55
986
原创 Linux学习笔记5---WSL2编译裸机程序并烧录至SD卡
此时,生成了.imx (可在Linux下用dd命令烧录), img (可在windows下用Win32DiskImager烧录SD卡)。load.img的内容是在load.imx基础上偏移了1K 字节,这样可以直接烧录到SD卡。正点原子的imxdownload由于包含了烧录的功能,但在WLS上无法识别SD卡,因此无法使用,所以可以将imxdownload的烧录功能都取消,让程序生成一个可烧录的镜像文件即可。那程序不就不能烧录到SD卡上了?写入成功后将SD卡插回开发板上,选择SD卡启动,程序成功运行。
2024-05-10 10:09:34
1102
2
原创 Linux学习笔记4---点亮LED灯(汇编裸机)
本系统学习利用的是正点原子的阿尔法mini开发板,本系列的学习笔记也是按照正点原子的教程进行学习,但并不是利用虚拟机进行开发,而是使用Windows下的子系统WSL进行学习。因为 Cortex-A 芯片一上电 SP 指针还没初始化,C 环境还没准备好,所以肯定不能运行 C 代码,必须先用汇编语言设置好 C 环境,比如初始化 DDR、设置 SP指针等等,当汇编把 C 环境设置好了以后才可以运行 C 代码。所以 Cortex-A 一开始肯定是汇编代码。
2024-05-09 17:43:52
1500
原创 Linux学习笔记3---WSL2交叉编译
ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,在上一章里面已经讲解了如何在 Liux 进行 C 语言开发,里面使用 GCC 编译器进行代码编译,但使用的 gcc 编译器是针对 X86 架构的!交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。交叉编译器有很多种,我们使用 Linaro 出品的交叉编译器,Linaro 是一间非营利性质的开。
2024-05-09 17:43:18
721
原创 Linux学习笔记2---Makefile
一个工程中的源文件不计其数,按期类型、功能、模块分别放在若干个文件中,MakeFile文件定义了一系列的规则来制定哪些文件需先要编译、哪些文案需要后编译、哪些文件需要重新编译、甚至于进行更加复杂的操作,因为Makefile文件就像是一个shell脚本一样,也可以执行操作系统的命令。
2024-05-08 08:55:17
1243
原创 Linux学习笔记1---Windows上运行Linux
在正点原子的教程中学习linux需要安装虚拟机或者在电脑上安装一个Ubuntu系统,但个人觉得太麻烦了,现在linux之父加入了微软,因此在Windows上也可以运行linux 了。
2024-05-08 08:54:52
2581
原创 STM32CubeMX学习笔记32---FreeRTOS资源管理
CPU 使用率其实就是系统运行的程序占用的 CPU 资源,表示机器在某段时间程序运行的情况,如果这段时间中,程序一直在占用 CPU 的使用权,那么可以人为 CPU 的利用率是 100%。CPU 的利用率越高,说明机器在这个时间上运行了很多程序,反之较少。
2024-05-07 08:49:14
999
原创 STM32CubeMX学习笔记31---FreeRTOS中断管理
异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果不及时进行处理, 轻则系统出错,重则会导致系统毁灭性瘫痪。所以正确地处理异常,避免错误的发生是提 高软件鲁棒性(稳定性)非常重要的一环,对于实时系统更是如此。异常是指任何打断处理器正常执行,并且迫使处理器进入一个由有特权的特殊指令执 行的事件。异常通常可以分成两类:同步异常和异步异常。
2024-05-07 08:48:49
1596
原创 STM32CubeMX学习笔记30---FreeRTOS内存管理
FreeRTOS 操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的,所以在 FreeRTOS 中提供了多种内存分配算法(分配策略),但是上层接口(API)却是统一的。这样做可以增加系统的灵活性:用户可以选择对自己更有利的内存管理策略,在不同的应用场合使用不同的内存分配策略。
2024-05-06 16:41:00
1371
原创 STM32CubeMX学习笔记29---FreeRTOS任务通知
FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能,每个任务都有 一个 32 位 的通知值,在大多数情况下,任务通知可以 替代二值信号量、计数信号量、事件组,也可以替代长度为 1 的队列(可以保存一个 32 位整数或指针值)。相对于以前使用 FreeRTOS 内核通信的资源,必须创建队列、二进制信号量、计数信号量或事件组的情况,使用任务通知显然更灵活。
2024-05-06 16:40:28
1325
原创 STM32CubeMX学习笔记28---FreeRTOS软件定时器
定时器,是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户 可以自定义定时器的周期与频率。类似生活中的闹钟,我们可以设置闹钟每天什么时候响, 还能设置响的次数,是响一次还是每天都响。定时器有硬件定时器和软件定时器之分:硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯 片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产 生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。软件定时器。
2024-03-28 20:41:26
1984
原创 STM32CubeMX学习笔记27---FreeRTOS事件
事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。与信号量不同的是,它可以实现一对多,多对多的同步。即一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。每一个事件组只需要很少的 RAM 空间来保存事件组的状态。事件组存储在一个 EventBits_t 类型的变量中,该变量在事件组结构体中定义。
2024-03-28 15:23:13
1805
原创 STM32CubeMX学习笔记26---FreeRTOS互斥量
1、互斥量用于互锁,可以充当资源保护的令牌,当一个任务希望访问某个资源时,它必须先获取令牌,当任务使用完资源后,必须返还令牌,以便其他任务可以访问该资源。2、互斥量一般用于临界资源保护。
2024-03-20 20:52:02
1859
原创 STM32CubeMX学习笔记25---FreeRTOS信号量
信号量用于同步,任务间或者任务和中断间同步互斥量用户互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁。二值信号量:同步。如果存在两个线程,为线程1和线程2,如果线程1发送了信号量,线程2接收到了信号量,这两个线程同步工作,如果线程1没有发送信号量,那么线程2也就不工作(前提线程2中有信号量接收等待函数)。相当于一个标志位。计数信号量:资源使用统计互斥量:互斥信号是一个拥有优先级继承的二值信号量递归互斥:互斥中嵌套互斥。
2024-03-20 17:28:53
2542
原创 STM32CubeMX学习笔记24---FreeRTOS(消息队列)
队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中 断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之 间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的 长度,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以 也称为消息队列。FreeRTOS 中的信号量的也是依据队列实现的!所以有必要深入的了解 FreeRTOS 的队列。
2024-03-19 23:21:11
2985
原创 STM32CubeMX学习笔记23---FreeRTOS(任务的挂起与恢复)
注:在不同任务(任务优先级相同)中同时使用同一个中断会导致任务轮流使用该中断,如LED1和LED2都延时1000ms后同时使用printf,则会出现以下情况,即两个任务轮流使用printf,就导致了中间的遗漏了。程序编译无误后下载到板子上,可以看到LED1计数到10时挂起LED2,当计数到15时恢复LED2。本实验通过freertos创建两个任务来分别控制LED2和LED3的亮灭,需要用到的硬件资源。在任务函数中编写程序,让LED1计数到10时挂起LED2,当计数到15时恢复LED2.
2024-03-19 11:08:38
1390
原创 STM32CubeMX学习笔记22---FreeRTOS(任务创建和删除)
FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制。FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。FreeRTOS 是用 C 和汇编来写的,其中绝大部分都是用 C 语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的,FreeRTOS 结构简洁,可读性很强!最主要的是非常适合初次接触嵌入式实时操作系统学生、嵌入式系统开发人员和爱好者学习。
2024-03-18 20:29:58
3201
原创 STM32CubeMX学习笔记21--- FLASH应用(Bootloader+APP)
在16章我们学习了FLASH的读写操作,FLASH内的数据是断电可保存的,而且stm32的运行程序也是存放在内部FLASH当中,那么可以编写一段程序A,将另一段程序B写入FLASH中并引导单片机运行程序B。在专业的角度上程序A称为引导/启动程序(Bootloader),简称Boot。程序B叫应用程序,简称APP。
2024-03-18 10:07:41
3174
3
原创 STM32CubeMX学习笔记20——SD卡FATFS文件系统
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构(即在存储设备上组织文件的方法)。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统;不带文件系统的SD卡仅能实现简单的读写扇区操作,要真正应用SD卡必须要使用文件系统FATFS文件存储原理(以FAT32为例),下图为FAT32文件系统布局:分区空间大小簇空间大小每个簇包含的扇区数< 8GB4KB88KB1616KB32>= 32GB32KB64。
2024-03-11 21:17:05
4685
2
原创 STM32CubeMX学习笔记19——SD卡(SDIO接口)
很多单片机系统都需要大容量存储设备,以存储数据(常用的有U盘、FLASH芯片、SD卡等),比较而言SD卡是单片机大容量外部存储的首选,只需要少数几个IO口即可外扩一个容量从几十M到几十G的,且有多种体积尺寸可选(标准SD卡、TF卡等)的外部存储器SD卡(Secure Digital Memory Card)即:安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。
2024-03-11 15:08:38
3087
原创 STM32CubeMX学习笔记17--- FSMC
TFT-LCD(thin film transistor-liquid crystal display)即薄膜晶体管液晶显示器。液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),每个像素都可以通过点脉冲直接控制,因而每个节点都相对独立,并可以连续控制,不仅提高了显示屏的反应速度,同时可以精确控制显示色阶,所以TFT液晶的色彩更真,因此TFT-LCD也被叫做真彩液晶显示器 常用的TFT液晶屏接口有8位、9位、16位、18位,这里的位数表示的是彩屏数据线的数量。
2024-03-08 11:12:00
2660
原创 STM32CubeMX学习笔记16--- STM32内部FLASH
之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是STM32F103ZET6,其FLASH容量为512K字节,属于大容量产品,大容量产品的闪存模块组织图如下图示STM32F1的闪存模块由:主存储器、信息块和闪存存储器接口寄存器3部分组成。
2024-03-07 20:51:15
1674
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人