嵌入式软件
文章平均质量分 87
嵌入式软件
xiaobaibai_2021
这个作者很懒,什么都没留下…
展开
-
hex文件格式剖析,以及hex与bin文件互相转换
hex文件和bin文件有什么区别呢,为什么有时用hex格式有时用bin格式?本篇文章就带大家来了解一下。原创 2022-12-30 16:54:31 · 17979 阅读 · 1 评论 -
【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器
大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片——AD9833。原创 2022-12-23 22:35:04 · 12197 阅读 · 7 评论 -
陀螺仪与加速度计的姿态融合——互补滤波
本篇文章我们来讲讲如何将陀螺仪和加速度计的数据结合起来,获取更准确的姿态数据,使用的是互补滤波的方法。原创 2022-11-25 23:49:06 · 17175 阅读 · 13 评论 -
【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)
今天我们来学习电子磁力计HMC5883L的使用。先介绍磁力计的基础知识,再给一个获取磁力计数据的例子,最后讲解HMC5883L磁力计的校准,以及一些使用中的经验。原创 2022-11-16 23:04:54 · 6971 阅读 · 2 评论 -
多任务环境中如何喂看门狗?
那么在多任务系统中应该如何喂狗呢?我们知道,看门狗的目的是为了监测错误,那么我们只要将所有任务的状态都检查一下,如果都正常才执行喂狗操作。原创 2022-09-13 22:27:20 · 3024 阅读 · 4 评论 -
【FreeRTOS】03 任务的运行、就绪、阻塞、挂起
讲到操作系统的任务,就不得不提任务的状态和切换,这是操作系统的最核心功能。本节将会重点讲解freeRTOS任务的几种状态——运行、就绪、阻塞、挂起。原创 2022-05-08 23:52:47 · 12392 阅读 · 4 评论 -
【FreeRTOS】02 任务的创建
本节我们将分析一下FreeRTOS任务创建的过程,并结合创建时需要的参数讲解一下FreeRTOS任务的一些特性。原创 2022-05-07 00:53:43 · 6128 阅读 · 1 评论 -
【FreeRTOS】01 初识freertos操作系统,第一个任务
这一节我们开始写第一个程序,建立两个任务,每个任务控制一个LED灯闪烁。原创 2022-05-04 21:36:56 · 3134 阅读 · 4 评论 -
【STM32+cubemx】0028 HAL库开发:MPU6050官方DMP的移植和使用(续上节)
上一节我们使I2C总线获取了MPU6050的三轴加速度、三轴角速度,并且介绍了一种简单的初始状态校准方法;这一节我们继续,在已有的底层驱动基础上,移植MPU6050芯片官方的DMP库,来获取角度信息。原创 2022-03-07 00:24:11 · 14691 阅读 · 36 评论 -
【STM32+cubemx】0027 HAL库开发:MPU6050陀螺仪和加速度计数据的获取和校准
MPU6050集成了3轴陀螺仪和3轴加速度计,可以获取物体的姿态和运动信息。陀螺仪可测范围为±250,±500,±1000,±2000°/秒,加速度计可测范围为±2,±4,±8,±16g,使用16bitAD采样。使用I2C接口通信。本节我们就来使用STM32获取MPU6050的加速度和角速度数据,并介绍一种简单的初始校准方法,最后使用匿名四轴地面站来显示加速度和角速度的波形图。原创 2022-03-02 23:14:08 · 22984 阅读 · 12 评论 -
【STM32+cubemx】0026 HAL库开发:NRF24L01无线2.4G通信模块的应用
NRF24L01是NORDIC公司生产的一款无线通信通信芯片,可以工作在免费开放的2.4GHz频段;通信速率可以达到最高2Mbps;MUC可以使用SPI接口与它交互。本节我们就来使用stm32驱动NRF24L01实现无线通信,先实现简单的一对一通信,然后讲解一对多通信,最后实现在ack中返回数据的应用。1)NRF24L01模块硬件介绍直接使用nrf24L01芯片搭建电路需要比较高的射频功底,一般情况下推荐使用现成的电路模块,本文使用的是下图这种:类似的nrf24L01模块的对外引原创 2022-02-24 22:39:45 · 18235 阅读 · 11 评论 -
【STM32+cubemx】0025 HAL库开发:唯一ID获取和简单的程序加密
STM32内部有一个96bit的产品唯一ID,在出厂被固化在芯片中,是不能修改的,而且每个芯片不同,可以作为芯片的身份标识。可以利用芯片的唯一ID来实现一种简单的程序加密方法。原创 2022-01-27 02:12:21 · 4410 阅读 · 5 评论 -
【STM32+cubemx】0024 HAL库开发:IAP(在应用编程)的实现
本节我们通过一个简单的例子,来实现STM32的IAP功能。这个例子有两部分程序,boot部分包含IAP功能,运行后可在线升级;app部分则和普通的应用程序一样。我们使用boot程序来在本节我们通过一个简单的例子,来实现STM32的IAP功能。这个例子有两部分程序,boot部分包含IAP功能,运行后可在线升级;app部分则和普通的应用程序一样。我们使用boot程序来在线升级app部分的程序。程序运行的硬件环境为stm32f103c8t6最小系统。(本文中的所有代码都可通过文末关注公众号获取)原创 2022-01-12 00:45:58 · 4324 阅读 · 3 评论 -
【STM32+cubemx】0023 HAL库开发:EN28J60移植LwIP协议栈(裸机环境)
本节我们学习LwIP在裸机环境(无操作系统)下的移植。原创 2022-01-06 23:05:26 · 2406 阅读 · 0 评论 -
【STM32+cubemx】0022 HAL库开发:uIP的应用UDP、TCP通信(续上节)
上一节我们讲了uIP的移植过程,这一节我们使用移植好的uIP工程来实现UDP和TCP的通信。原创 2021-12-29 02:00:04 · 2848 阅读 · 2 评论 -
【STM32+cubemx】0021 HAL库开发:EN28J60芯片移植uIP以太网协议栈
本节我们就以uIP以太网协议栈为例,来学习如何移植它到ENC28J60的平台上。原创 2021-12-28 01:00:24 · 3693 阅读 · 3 评论 -
【STM32+cubemx】0020 HAL库开发:以太网ENC28J60芯片和TCP、UDP简单应用
本节我们来学习使用ENC28J60芯片来实现以太网通信,网络协议栈使用一套极其精简的代码,只实现基本的ping、TCP、UDP通信功能。原创 2021-12-24 00:27:15 · 4125 阅读 · 4 评论 -
【STM32+cubemx】0019 HAL库开发:SDIO接口和FATFS文件系统访问TF、SD卡
stm32的部分型号有SDIO接口,cubemx也可以生成TF/SD卡的工程,同时cubemx的中间件甚至集成了FATFS文件系统,几乎可以说一站式解决了所有TF/SD卡的使用问题。本节我们使用Cubemx生成TF/SD卡的工程,并且使用上FATFS文件系统,使得stm32写入TF/SD卡的数据可以直接通过读卡器在计算机上访问。原创 2021-12-20 23:25:21 · 2813 阅读 · 0 评论 -
【STM32+cubemx】0018 HAL库开发:自定义usb HID设备实现
前面几节我们使用Cubemx生成了usb的两个使用例子(虚拟串口、HID鼠标),本节我们进一步学习,如何用生成自定义的HID设备。本节的例子在开发板上运行以后,可以通过usb HID接口实现和计算机更为自由的通信。原创 2021-12-11 00:40:28 · 4400 阅读 · 3 评论 -
【STM32+cubemx】0017 HAL库开发:usb HID鼠标设备实现
Cubemx可以生成多种usb设备的初始化代码,本节我们就使用它来生成一个usb HID鼠标的工程,在开发板上运行以后,可以模拟usb鼠标的功能。原创 2021-11-30 23:41:46 · 2773 阅读 · 6 评论 -
【STM32+cubemx】0016 HAL库开发:USB虚拟串口(virtual COM)
stm32很多系列的芯片都带usb接口,而且cubemx也能生成多种功能的usb初始化代码,使得一般用户可以不用关注usb底层复杂的实现方式,直接使用HAL函数就能方便地实现usb通信。本节我们就来学习cubemx生成虚拟串口(USB virtual COM)的使用方法。原创 2021-11-25 23:11:04 · 8072 阅读 · 1 评论 -
【STM32+cubemx】0015 HAL库开发:内部flash读写
本节我们来学习stm32内部flash的读写。在某些应用中,我们需要保存少量掉电仍然不丢失的数据,而在电路板上额外增加一块eeprom或者flash又太浪费硬件资源,这时我们就可以把这些数据保存在stm32内部的flash里。原创 2021-11-24 00:11:39 · 7456 阅读 · 3 评论 -
【STM32+cubemx】0014 HAL库开发:电源控制(三种低功耗模式:sleep、stop、standby)
本节我们来讲一讲stm32的低功耗模式。stm32有三种低功耗模式,功耗依次降低:睡眠模式(sleep mode),停止模式(stop mode),待机模式(standby mode)。原创 2021-11-23 01:50:22 · 8761 阅读 · 1 评论 -
【STM32+cubemx】0013 HAL库开发:SPI总线访问气压计BMP280/BME280
本节我们介绍stm32的SPI总线接口,并使用SPI接口来访问气压计BMP280。原创 2021-11-20 20:47:42 · 7579 阅读 · 7 评论 -
【STM32+cubemx】0012 HAL库开发:定时器的PWM输出
本节我们介绍stm32定时器的PWM输出。原创 2021-11-19 01:14:42 · 1833 阅读 · 0 评论 -
【STM32+cubemx】0011 HAL库开发:I2C总线访问加速度传感器ADXL345
本节我们介绍I2C总线,并使用stm32的I2C总线来访问加速度传感器ADXL345。1)I2C基础知识I2C总线通信比较适合设备内部各芯片间的通信,它只需要两根信号线。I2C可以挂载多个主机和从机,通信总是由主机发起。每个从机都有唯一的地址,主机通过地址决定访问哪个从机。I2C总线的两根线,SCL为时钟线,SDA为数据线;所有的器件对这两根线的输出操作只能拉低,当释放总线时,由总线上的上拉电阻将电平拉高。所以硬件连接上,上拉电阻是必须的,否则不能通信。I2C空闲时,所有器件释放总线原创 2021-11-17 01:15:37 · 6191 阅读 · 2 评论 -
【STM32+cubemx】0010 HAL库开发:独立看门狗、窗口看门狗
看门狗(watch dog)是一个定时器,可以设置一个定时时间,计时到时会把MCU复位,所以MCU必须要在定时时间到之前将计数值重置(这个动作通常称为喂狗)。在嵌入式系统中加入看门狗,可以监测MCU是否还在正常运行,如果软件跑进死循环、或者出现其他错误,导致不能及时重置看门狗计时器,则时间一到MCU就会被复位,重新回到初始状态,以此跳出错误状态。Stm32内部带有独立看门狗、窗口看门狗。独立看门狗使用时,只要喂狗时间不大于设定的时间就可以,是最常用的看门狗用法;而窗口看门狗,需要喂狗时间在一个上下限原创 2021-11-11 01:41:15 · 1341 阅读 · 2 评论 -
【STM32+cubemx】0009 HAL库开发:RTC实时时钟的使用、掉电时间保持
RTC (Real Time Clock)即实时时钟。它可以提供时钟、日历的功能;并且可以使用外部电池供电,在极低的功耗下保持计数,使得断电之后还能够计算时间,所以名为实时时钟。STM32f103的RTC,本质上是一个32位的计数器,在断电后,由电池供电还能保持计数;要使用时间时,需要将计数器的值换算成日期和时间。此外,stm32的RTC还具备后备存储区,可以利用电池供电,保存10个16bit的数据。1)cubemx中配置RTC我们在之前的串口中断工程上修改,以便于打印数值查看。使用原创 2021-11-10 01:04:48 · 7887 阅读 · 4 评论 -
【STM32+cubemx】0008 HAL库开发:ADC的四种用法:轮询、中断、DMA、定时器触发
ADC即模数转换器,能把模拟量(电压)转换为数字量。这一节我们讲讲stm32的ADC用法,stm32自带的ADC有四种用法:轮询、中断、DMA、定时器触发。1)ADC轮询的用法我们在之前的串口中断工程上修改,以便于打印数值查看。使用cubemx打开串口中断的工程,然后另存为ADC工程,增加如下设置,启用ADC及其中断:可以看到选择ADC1,勾选IN0后,右侧PA0引脚自动配置成了ADC输入;在NVIC选项卡下勾选ADC中断使能,这样我们可以在这个工程里演示轮询和中断模式。原创 2021-11-05 00:22:38 · 11326 阅读 · 8 评论 -
【STM32+cubemx】0007 HAL库开发:外部中断,优先级和中断向量表
这一节我们以外部中断为例子,讲讲中断的优先级和中断向量表的知识。1)cubemx生成代码首先还是在cubemx中生成代码,选择器件、设置SYS(调试接口)、设置RCC(外部晶振时钟源)。然后设置GPIO引脚,选择PC13作为输出(用于LED指示),如下图选择PA0设置为外部中断输入引脚:然后设置中断使能和优先级,如下图:这里的几处选项解释一下:最上面的Priority group是选择优先级分组,STM32(更确切地说是contex-M3内核的单片机)使用4个bit位原创 2021-11-03 22:58:49 · 6224 阅读 · 0 评论 -
【STM32+cubemx】0006 HAL库开发:uart串口和DMA传输
上一节我们使用中断结合环形fifo,实现了比较方便、高效地串口收发,这个方法在几乎所有的单片机上都可以使用,就连最基础的51单片机也能支持。而到了stm32这款强大的单片机,有更多的用法可以实现高效的串口收发,本节我们就介绍使用DMA传输串口数据。先简单介绍一下DMA,DMA全称为:Direct Memory Access,即直接存储器访问。它可以独立地将数据从一个地址空间复制到另外一个地址空间,而不占用CPU的资源。DMA尤其在高速、大容量的数据传输时特别有用:如果使用中断传输,CPU会在传输原创 2021-11-03 00:29:02 · 4143 阅读 · 1 评论 -
【STM32+cubemx】0005 HAL库开发:uart串口中断和fifo环形队列
上一节我们学习了串口的轮询收发,以及HAL库自带的中断收发。也分析了优缺点,这一节我们来讲讲如何改写HAL库函数,使它能更高效地收发数据,更方便地使用。早些年在使用51单片机、AVR单片机的时候,最有效的办法是开两个环形缓冲区,一个用作发送、一个用作接收。接收的实现:开启接收数据中断;当收到数据产生中断时,在中断服务程序中,把收到的数据放入接收环形fifo中;主循环中检测接收fifo中有无数据,有的话取走使用即可。发送的实现:当要发送数据时,先检查有无数据在发送(一般是查询发送寄存器的状态)原创 2021-11-02 00:55:21 · 3903 阅读 · 7 评论 -
【STM32+cubemx】0004 HAL库开发:uart串口的轮询和中断使用
本节我们来学习异步串口uart的使用,包括轮询方式和中断方式。本节我们使用轮询和中断两种方式,来实现计算机向单片机发送数据,单片机处理之后再将数据返回。1)cubemx生成代码首先还是在cubemx中生成代码,选择器件、设置SYS(调试接口)、设置RCC(外部晶振时钟源)这几个步骤和前一节一样(也可以复制前面闪灯的工程,在上面修改)。然后设置串口引脚,这里我们选择uart1,异步串口,选完后,已经使用的串口引脚PA9和PA10会变成绿色;然后选择开启串口全局中断:之后,和上一节一原创 2021-10-31 23:58:51 · 3744 阅读 · 1 评论 -
【STM32+cubemx】0003 HAL库开发:定时器基础应用,中断和回调函数
本节我们来学习STM32最基础的定时器应用,并利用hal库生成的代码,添加用户自己的功能到回调函数中。程序实现的功能是:以10ms的定时器中断为周期,循环检测一个按键的状态,如果按下,则点亮LED灯;没有按下则熄灭LED灯。1)cubemx生成代码首先还是在cubemx中生成代码,选择器件、设置SYS(调试接口)、设置RCC(外部晶振时钟源)这几个步骤和前一节一样。然后设置用户IO口,我们需要一个引脚输出驱动LED灯,一个引脚输入作为按键。这里我们的硬件上LED仍然使用开发板上的PC13原创 2021-10-29 23:44:14 · 16364 阅读 · 6 评论 -
【STM32+cubemx】0002 HAL库开发:第一个程序——LED闪灯程序
本节我们来开发第一个程序,LED闪灯程序。这里先介绍一下cubemx生成的代码,它可以生成HAL库和LL库,HAL库封装得比较完善的库,用户不用过多关注底层硬件的具体设置就能完成开发,代码效率低一些;而LL库类似于直接操作寄存器,代码效率比较高,但是需要用户比较了解底层的硬件,才能较好地改写、开发。我们这里都是使用HAL库开发,一般分两步:先在cubemx里配置芯片参数、生成底层的初始工程代码;然后在keil里打开工程文件,编写自己的应用代码,编译、下载到开发板运行。1)cubemx生成代码原创 2021-10-29 00:41:38 · 868 阅读 · 0 评论 -
【STM32+cubemx】0001 软硬件环境搭建
嵌入式编程的这个系列,我打算以stm32这个高端一点的单片机为例开始讲,这个系列都是比较基础的内容,主要是给自己备忘,顺便能带领一些初学者入门。本节介绍一下软硬件开发平台。我用的是stm32,选择它的主要原因是官方出品了代码生成工具cubemx,可以自动生成底层硬件相关的代码,入门起来也最简单;同时国内也有很多厂家有兼容的芯片,开发工具也便宜。1)软件环境搭建软件需要安装cubemx和keil(MDK);这里我使用的版本cubemx是5.1.0;keil版本是5.14。这两个软件安装原创 2021-10-29 00:29:50 · 872 阅读 · 0 评论