自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 IMX6EPIT定时器

EPIT 定时器简介EPIT 的全称是: Enhanced Periodic Interrupt Timer,直译过来就是增强的周期中断定时器,它主要是完成周期性中断定时的, I.MX6U 的 EPIT 定时器只是完成周期性中断定时的,仅此一项功能!至于输入捕获、 PWM 输出等这些功能, I.MX6U 由其它的外设来完成。EPIT 是一个 32 位定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能以后 EPIT 就会开始运行, EPIT 定时器有如下特点:①、时钟源可选的 32 位向下

2021-03-07 00:30:55 319

原创 GNU汇编语法基础

GNU汇编语法GNU 汇编语法适用于所有的架构,并不是 ARM 独享的, GNU 汇编由一系列的语句组成,每行一条语句,每条语句有三个可选部分,如下:label: instruction @ commentlabel 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。instruction 即指令,也就是汇编指令或伪指令。@符号,表示后面的是注释,就跟 C

2021-02-22 10:19:22 1391

原创 Cortex-A7 MPCore 架构基本知识

ARM 处理器运行模型:Cortex-A7 处理器有 9 种处理模式除了 User(USR)用户模式以外,其它 8 种运行模式都是特权模式。这几个运行模式可以通过软件进行任意切换,也可以通过中断或者异常来进行切换。大多数的程序都运行在用户模式,用户模式下是不能访问系统所有资源的,有些资源是受限的,要想访问这些受限的资源就必须进行模式切换。但是用户模式是不能直接进行切换的,用户模式下需要借助异常来完成模式切换,当要切换模式的时候,应用程序可以产生异常,在异常的处理过程中完成处理器模式切换。当中断或者异

2021-02-22 09:44:42 349

原创 STM32cubemx_H750_TIM

STM32cubemx_H750_TIM基本定时器定时器配置(开启中断)200M/20000(分频)=10000Hz 5000/10000=0.5sHAL_TIM_Base_Start_IT(&htim6);//开启定时器中断每隔0.5s进入中断回调函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)高级定时器高级定时器有repet counter 重复计数器中断是update interrupt

2021-02-22 09:00:19 969

原创 Linux常用命令

目录信息查看命令 lsls 命令主要用于显示指定目录下的内容,列出指定目录下包含的所有的文件以及子目录,它的主要参数有:-a 显示所有的文件以及子目录,包括以“.”开头的隐藏文件。-l 显示文件的详细信息,比如文件的形态、权限、所有者、大小等信息。-t 将文件按照创建时间排序列出。-A 和-a 一样,但是不列出“.” (当前目录)和“…” (父目录)。-R 递归列出所有文件,包括子目录中的文件。目录切换命令 cdcd [路径]cd / //进入到根目录“/”下, Linux 系统的根目录

2021-02-22 08:59:43 1331

原创 Makefile基础

Makefile 语法目标…… : 依赖文件集合……命令 1命令 2……例如main : main.o input.o calcu.o gcc -o main main.o input.o calcu.o这条规则的目标是 main, main.o、 input.o 和 calcu.o 是生成 main 的依赖文件,如果要更新目标 main,就必须先更新它的所有依赖文件,如果依赖文件中的任何一个有更新,那么目标也必须更新,“更新”就是执行一遍规则中的命令列表。命令列表中的每条命令必须以 T

2021-02-22 08:59:25 141

原创 STM32_I2S&SAI

STM32_I2S&SAI音频传输过程SAI接口音频数据传输协议标准I2S左对齐标准右对齐标准PCM脉冲编码调制使用WM8978音频编解码器 使用I2C控制WM8978。WM8978寄存器长度16bit,高7位用于表示寄存器地址,低9位有实际意义,所以在控制器向芯片发送控制命令时,必须传输长度为16bit,芯片会根据接收命令高7位值寻址。WAV格式文件WAV格式是微软公司开发的一种音频格式文件,用于保存Windows平台的音频信息资源,它符合资源互换文件格式(RIF

2021-02-20 10:28:48 6441

原创 有刷电机电机应用开发总结

有刷电机电机应用开发总结电机应用主要就是PWM波的一些控制,就是对定时器的应用。有刷电机驱动:小功率的驱动器使用直流有刷电机驱动芯片例如L298N大功率的一般使用分立元件形式的H桥,主要有MOSFET或者IGBT晶体管组成直流有刷电机几个重要参数:1 空载转速 2 空载电流 3 负载转速 4 负载力矩 5 负载电流 6 堵转力矩 7堵转电流 8 减速比 9功率最关键的是H桥电路分析...

2021-02-19 15:40:05 1410

原创 STM32CUBEMX_H750_NAND_FLASH

STM32CUBEMX_H750_NAND_FLASHNAND FLASH信号线NAND FLASH存储结构需要确定plane block page个数 NAND FLASH最小擦除单位是blockNAND FLASH 由2部分组成:数据存储区(data area)和备用区域(spare area)数据存储区大小为 2K 字节,备用区域大小为 64 字节。我们存储的有效数据,一般都是存储在数据存储区( data area)。备用区域( spare area),一般用来存放 ECC( Error

2021-02-19 15:39:43 1489

原创 STM32_H750_IWDG

STM32_H750_IWDG__HAL_IWDG_START(&hiwdg1);HAL_IWDG_Refresh(&hiwdg1);iwdg时钟32k 4096/(32k/4)=512ms实测延时506ms可以正常喂狗HAL_Delay(506);

2021-02-19 15:39:20 325

原创 STM32H750_NANDFLASH

STM32H750_NANDFLASH#define NAND_ADDRESS 0X80000000 //nand flash访问地址:0X8000 0000#define NAND_CMD 1<<16 //发送命令#define NAND_ADDR 1<<17 //发送地址这部分可以在h750手册中找到//NAND FLASH命令#define NAND_READID 0X90 //读ID指令#define NAND

2021-02-19 15:38:44 1280

原创 步进电机总结

步进电机总结步进电机分为单极性和双极性单极性,COM端一直通电,通过另外四相的组合,实现正反转(电流方向),半步等功能双极性,通过各相位的通电组合实现转动,半步等功能,细分器是通过改变各相的电流大小,使得转子在一个整步中的不同位置(64细分等)静态指标术语:相数:相数越多,步距角越小拍数:指电机转过一个齿轮角所需脉冲数步距角:一个脉冲信号所对应电机转动的角度定位转矩:电机在不通电状态下,电机转子自身的锁定力矩静转矩:电机在额定静态电压作用下,电机不作旋转运动时,电机转轴的锁定力矩,动态

2021-02-19 15:37:22 390

原创 直流无刷减速电机

直流无刷减速电机直流无刷减速电机参数:额定电压KV值:实际转速=KV只*工作电压转矩与转速最大电流和最大功率三相六臂全桥驱动电路(6拍工作方式)需要知道第一步应该导通哪两个MOS管,所以需要知道转子的位置信息。(霍尔传感器或者不使用传感器)配套电机霍尔传感器输出值在对 MOS 管的控制有中两个特殊情况需要注意一下:当按真值表中对应霍尔值导通 MOS 管后,就保持导通状态不变时,此时电机就会旋转到对应位置保持不变,此时电路中的电能将只能转换为热能,不能转换为机械能,而我们的电机绕组时候

2021-02-19 15:36:49 2416

原创 FreeRTOS函数

FreeRTOS函数列表项初始化由函数 vListInitialiseItem()列表项的插入操作通过函数 vListInsert()来完成,函数原型如下:void vListInsert( List_t * const pxList,ListItem_t * const pxNewListItem )列表末尾插入列表项的操作通过函数 vListInsertEnd ()来完成,函数原型如下:void vListInsertEnd( List_t * const pxList,ListItem_

2021-02-19 15:36:16 467

原创 FreeRTOS空闲任务与阻塞延时的实现

FreeRTOS空闲任务与阻塞延时的实现RTOS 中的延时叫阻塞延时,即任务需要延时的时候, 任务会放弃 CPU 的使用权, CPU 可以去干其它的事情,当任务延时时间到,重新获取 CPU 使用权, 任务继续运行,这样就充分地利用了 CPU 的资源.当任务需要延时,进入阻塞状态,如果没有其它任务可以运行, RTOS 都会为 CPU 创建一个空闲任务,这个时候 CPU 就运行空闲任务。 在FreeRTOS 中,空闲任务是系统在【启动调度器】 的时候创建的优先级最低的任务,空闲任务主体主要是做一些系统内存

2021-02-19 15:35:48 282

原创 FreeRTOS中断管理

FreeRTOS中断管理异常与中断的基本概念异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果不及时进行处理,轻则系统出错,重则会导致系统毁灭性瘫痪。所以正确地处理异常,避免错误的发生是提高软件鲁棒性(稳定性)非常重要的一环,对于实时系统更是如此。异常是指任何打断处理器正常执行,并且迫使处理器进入一个由有特权的特殊指令执行的事件。 异常通常可以分成两类:同步异常和异步异常。由内部事件(像处理器指令运行产生的事件)引起的异常称为同步异常,例如造成被零除的算术运算引发一个异常,又如在某些处理器体

2021-02-19 15:35:17 555

原创 FreeRTOS内存管理

FreeRTOS内存管理FreeRTOS 内存管理模块管理用于系统中内存资源,它是操作系统的核心模块之一。主要包括内存的初始化、分配以及释放。在嵌入式实时操作系统中,调用 malloc()和 free()却是危险的,原因有以下几点:这些函数在小型嵌入式系统中并不总是可用的,小型嵌入式设备中的 RAM 不足。它们的实现可能非常的大,占据了相当大的一块代码空间。他们几乎都不是安全的。它们并不是确定的,每次调用这些函数执行的时间可能都不一样它们有可能产生碎片。这两个函数会使得链接器配置得复杂如果

2021-02-19 15:34:49 318

原创 STM32 HAL库读写内部Flash

STM32 HAL库读写内部Flash读写内部Flash需要实现 根据输入地址给出它所在的sector,根据扇区编号获取扇区大小步骤:1.解锁flash2.根据地址获取需要擦除的扇区,扇区数目,配置擦除结构体,使用擦除函数3.使用flash写函数将数据写入flash4.锁flash读过程:定义指针 指向地址(需要注意的是存储数据的类型,和读取的类型一致)...

2021-02-01 21:30:19 797

原创 FreeRTOS链表总结

FreeRTOS总结裸机系统和多任务系统区别FreeRTOS中存在着大量的基础数据结构列表和列表项的操作,单向链表单向链表携带信息上面这种做法用的少,通常是节点里面只包含一个用于指向下一个节点的指针。要通过链表存储的数据内嵌一个节点即可。链表操作链表最大的作用就是通过节点把离散的数据链接在一起,组成一个表。链表常规的操作就是节点的插入和删除。通常一条链表我们会人为地规定一个根节点,这个根节点称为生产者。通常根节点还会有一个节点计数器,用于统计整条链表的节点个数。双向链表与单向链表

2021-02-01 21:29:31 351

原创 FreeRTOS临界段的保护

FreeRTOS临界段的保护临界段用一句话概括就是一段在执行的时候不能被中断的代码段。FreeRTOS 对临界段的保护就是对中断的开和关的控制关中断不带返回值的关中断函数,不能嵌套,不能在中断里面使用。不带返回值的意思是:在往 BASEPRI 写入新的值的时候,不用先将 BASEPRI 的值保存起来,即不用管当前的中断状态是怎么样的,既然不用管当前的中断状态,也就意味着这样的函数不能在中断里面调用带返回值的关中断函数,可以嵌套,可以在中断里面使用。 带返回值的意思是:在往 BASEPRI 写入新

2021-02-01 21:29:08 187

原创 FreeRTOS任务通知

FreeRTOS任务通知FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能,每个任务都有一个 32 位的通知值,在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组, 也可以替代长度为 1 的队列(可以保存一个 32 位整数或指针值) 。按照 FreeRTOS 官方的说法,使用任务通知比通过信号量等 ICP 通信方式解除阻塞的任务要快 45%,并且更加省 RAM 内存空间(使用 GCC 编译器, -o2 优化级别) ,任务通知的使用无需创建队列。 想要使用任务通知,必须将 Fre

2021-02-01 21:27:09 1186 1

原创 FreeRTOS任务

FreeRTOS任务在裸机系统中,系统的主体是main函数里面顺序执行的无限循环,这个无限循环里面CPU按照顺序完成各种事情,在多任务系统中,我们根据功能不同,把整个系统分割成一个个独立的且无法返回的函数,这个函数我们称为任务。创建任务定义任务栈在裸机系统中,全局变量,有子函数调用,有中断发生等都存放在栈,栈是单片机RAM里面一段连续的内存空间,栈的大小一般在启动文件或者链接脚本里面指定,最后由C库函数_main进行初始化。但是在多任务系统中,每个任务都是独立的,互不干扰的,所以要为每个任务都分

2021-02-01 20:29:00 315

原创 FreeRTOS常用任务函数——任务管理

FreeRTOS常用任务函数任务挂起函数vTaskSuspend()任务可以调用 vTaskSuspend()这个函数来挂起任务自身,但是在挂起自身的时候会进行一次任务上下文切换,需要挂起自身就将 xTaskToSuspend 设置为 NULL 传递进来即可。无论任务是什么状态都可以被挂起,只要调用了 vTaskSuspend()这个函数就会挂起成功,不论是挂起其他任务还是挂起任务自身将所有的任务都挂起vTaskSuspendAll()挂起所有任务就是挂起任务调度器。 调度器被挂起后则不能

2021-02-01 20:28:25 1670

原创 FreeRTOS消息队列

FreeRTOS消息队列队列又称消息队列,是一种常用于任务间通信的数据结构, 队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息,当队列中的消息是空时,读取消息的任务将被阻塞,用户还可以指定阻塞的任务时间 xTicksToWait,在这段时间中,如果队列为空,该任务将保持阻塞状态以等待队列数据有效。 当队列中有新消息时, 被阻塞的任务会被唤醒并处理新消息;当等待的时间超过了指定的阻塞时间,即使队列中尚无有效数据,任务也会自动从阻塞态

2021-02-01 20:27:59 1197

原创 FreeRTOS信号量

FreeRTOS信号量信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问, 常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。抽象的来讲,信号量是一个非负整数,所有获取它的任务都会将该整数减一(获取它当然是为了使用资源),当该整数值为零时,所有试图获取它的任务都将处于阻塞状态。通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数。其值的含义分两种情

2021-02-01 20:27:25 840

原创 FreeRTOS事件

FreeRTOS事件事件的基本概念事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。与信号量不同的是,它可以实现一对多,多对多的同步。即一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。在 STM32 中 , 我 们 一 般 将configUSE_16_BIT_TICKS 定义为 0,那么 uxEventBits 是 32 位的,有 2

2021-02-01 20:26:57 437

原创 FreeRTOS软件定时器

FreeRTOS软件定时器软件定时器定时器有硬件定时器和软件定时器之分:硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。软件定时器,软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,它实现的功能与硬件定时器也是类似的。使用硬件定时器时,每次在定时时间到

2021-02-01 20:26:00 1147

原创 STM32CUBEMX生成的程序如何使用野火的下载算法

STM32CUBEMX生成的程序如何使用野火的下载算法使用STM32CUBEMX生成程序打开 system_stm32h7xx.c 文件,找到第 267 行(具体多少行,看具体工程)代码,把其中的“FLASH_BANK1_BASE”改为“APPLICATION_ADDRESS”在定义中需要加上APPLICATION_ADDRESS的定义之后选择野火的下载算法就可以了不更改system_stm32h7xx.c文件的话表现为程序会卡死在HAL_Delay()或者系统timebase卡死。.

2021-01-31 21:15:47 300

原创 STM32_H750_ADC总结

STM32_H750_ADC总结DMA中断方式STM32cubemx的一些基础配置注意H750引脚,很多引脚有后缀例如PC3_C(不是PC3)DMA部分选择DMA,不要选择BDMA(网上查了下BDMA只能用在D3域)使能中断程序部分添加回调函数(DMA已经将数据放到ADC_ConvertedValue中,回调函数中不需要使用HAL_ADC_GetValue)void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle){ /*获

2021-01-10 21:43:17 5220 1

原创 STM32H750_FMC_SDRAM 初始化流程总结

STM32H750_FMC_SDRAM使用STM32CUBEMX 初始化FMC部分,SDRAM 关于延时部分参数模式寄存器#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000)#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001)#define SDRAM_MODEREG_BURST_LENGTH_4 ((uin

2021-01-10 21:42:33 2012

原创 STM32H750_HAL_SD

STM32H750_HAL_SDSDIO接口SDIO的传输只在CLK时钟的上升沿有效,SD卡操作过程中会使用两种不同频率的时钟同步数据,一个是卡识别阶段的时钟频率FOD,最高400KHz,另外一个是数据传输模式下的时钟频率FPP,默认最高25MHz,如果通过相关寄存器配置使SDIO工作在高速模式,此时数据传输模式最高频率50MHzSD数据是以块形式传输,SDHC卡数据长度一般为512字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要CRC位来保证数据传输成功,CRC位由SD卡系统硬件生成。

2021-01-10 21:41:33 1300 1

原创 STM32_H750串口接收不定长数据(IDLE+DMA)及初始化之后便进入idle中断的解决方法

STM32_H750串口接收不定长数据(IDLE+DMA)及初始化之后便进入idle中断的解决方法链接:https://pan.baidu.com/s/16RIVUMUN89Sxj-RmwkdFng 提取码:15irSTM32H750使用IDLE+DMA进行不定长数据的接收使用STM32cubemx进行一些初始化的工作,串口正常初始化,选上串口中断,添加DMA等。首先定义一些变量 uint8_t rx_len=0; uint8_t recv_end_flag=0;uint8_t rx_b

2020-11-25 23:39:05 3211 4

原创 STM32CUBEMX_HAL库 H750串口发送 接收固定长度

STM32CUBEMX_HAL库 H750串口发送 接收固定长度使用DMA和中断实现串口功能,接收固定长度字节。若要实现任意长度字节,需要使用idle中断,后续补充。使用stm32cubemx进行一些基础配置,生成初始化代码,HAL_UART_Transmit(&huart1,tx_buf,size,100 );发送函数,发送完直接接需要执行的操作,无需使用发送中断的函数HAL_UART_Transmit_IT();关于发送字符串,printf等函数,只需要重新写一下即可,网上例程很多

2020-11-25 22:22:20 1450

原创 STM32CUBEMX_H750_QSPI

STM32CUBEMX_H750_QSPI单片flash间接读写模式使用STM32cubemx配置串口,QSPI等(QSPI 配置初始化是gpio默认low speed,在qspi里面改不了,需要到gpio栏去修改speed,GPIO的引脚需对应原理图引脚)时钟页可以选择QSPI的时钟来源,void MX_QUADSPI_Init(void){ hqspi.Instance = QUADSPI; hqspi.Init.ClockPrescaler = 1;//二分频(H7最大100M)

2020-11-22 22:58:26 1770

原创 STM32cubemx_W5500_TCP和Modbus/TCP

STM32cubemx_W5500_TCP和Modbus/TCP以STM32f103zet6开发板为平台使用STM32cubemx进行一些串口,spi等接口的初始化。使用的是野火的w5500模块,以tcp sever为基础,进行移植。链接:https://pan.baidu.com/s/17wTbt6QHoRTLKayxPAgt9g 提取码:8z7z先对一些置位函数进行一些填写HAL库中没有,自己封装一些void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uin

2020-11-17 20:09:09 2425 2

原创 STM32_H750_I2C

STM32_H750_I2C读写EEPROM AT24C02I2C写函数HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);读函数HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C

2020-11-16 22:39:50 725

原创 STM32CUBEMX SYSTICK us延时

STM32CUBEMX SYSTICKHAL库中systick定时器默认1Khz 即1ms所以HAL_Delay()是ms延时main函数开始会调用HAL_Init()函数HAL_Init()函数中调用HAL_InitTick(TICK_INT_PRIORITY)HAL_InitTick()函数中调用HAL_SYSTICK_Config(SystemCoreClock / (1000UL / (uint32_t)uwTickFreq)设置为1ms进一次中断只需要使用HAL_SYSTICK_Co

2020-11-07 20:49:46 1585

原创 STM32cubemx 按键检测和扫描按键

STM32cubemx 按键检测和扫描按键stm32cubemx工程和keil工程程序源文件链接:https://pan.baidu.com/s/1v5H7udqiWnRr7qWO8N5i9w提取码:h57s使用的是stm32_h750#define KEY_SCAN//选择功能#ifdef KEY_SCAN i=Scan_key_A();#else i=Scan_key_B();#endif switch(i) { ....//按键按下对应的功能 }uin

2020-11-07 19:17:25 1328

原创 STM32CUBEMX EXTI外部中断

STM32CUBEMX EXTI外部中断STM32CUBEMX及Keil工程提取码:v47e使用stm32cubemx初始化选择下中断模式开启中断,在NVIC中选择中断优先级LED引脚的配置(GPIO初始电平,模式,上下拉,速度)void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin==GPIO_PIN_0) { HAL_GPIO_TogglePin(LED_B_GPIO_Port,LED_B_Pin); }

2020-11-07 19:16:44 463

空空如也

空空如也

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

TA关注的人

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