针对单片机开发的轻量级OTA组件

发布者:一条属马的龙最新更新时间:2023-08-22 来源: zhihu关键字:单片机开发  轻量级 手机看文章 扫描二维码
随时随地手机看文章

今天为大家分享一款开源的,专为单片机开发的轻量级 OTA 组件:mOTA。

一、简介

本开源工程是一款专为 32 位 MCU 开发的 OTA 组件,组件包含了 bootloader 固件打包器 (Firmware_Packager) 、固件发送器 三部分,并提供了一个基于 STM32F103 和 YModem-1K 协议的案例,因此本案例的固件发送器名为 YModem_Sender 。

mOTA 中的 m 可意为 mini 、 micro 、 MCU ( Microcontroller Unit ),而 OTA ( Over-the-Air Technology ),即空中下载技术,根据维基百科的定义, OTA 是一种为设备分发新软件、配置,乃至更新加密密钥(为例如移动电话、数字视频转换盒或安全语音通信设备——加密的双向无线电)的方法。OTA 的一项重要特征是,一个中心位置可以向所有用户发送更新,其不能拒绝、破坏或改变该更新,并且该更新为立即应用到频道上的每个人。用户有可能“拒绝” OTA 更新,但频道管理者也可以将其踢出频道。由此可得出 OTA 技术几个主要的特性:

  1. 一个中心可向多个设备分发更新资料(固件);

  2. 更新资料一旦发送便不可被更改;

  3. 设备可以拒绝更新;

  4. 中心可以排除指定的设备,使其不会接收到更新资料。

本工程仅实现 OTA 更新资料的部分技术,即上文列出的 OTA 技术几个主要的特性,而不关心中心分发资料中间采用何种传输技术。(本工程的 example 使用 UART 作为 MCU 和外部的传输媒介)


二、实现的功能

MCU 设备上的 OTA 升级可理解为 IAP (In Application Programming) 技术, MCU 通过外设接口(如 UART 、 IIC 、 SPI 、 CAN 、 USB 等接口),连接具备联网能力的模块、器件、设备(以下统称上位机)。上位机从服务器上拉取固件包,再将固件包以约定的通讯协议,经由通讯接口发送至 MCU ,由 MCU 负责固件的解析、解密、存储、更新等操作,以完成设备固件更新的功能。需要注意的是, example 提供的示例不基于文件系统,而是通过对 Flash 划分为不同的功能区域完成固件的更新。


本组件实现了以下功能:

  1. 固件包完整性检查: 自动检测固件 CRC 值,保证固件数据的可靠性。

  2. 固件加密: 支持 AES256 加密算法,提高固件的安全性。

  3. APP 完整性检查: 支持 APP 运行前进行完整性检查,以确认运行的固件无数据缺陷。

  4. 断电保护: 当固件更新过程中(含下载、解密、更新等过程),任何一个环节断电,设备再次上电时,依然能确保有可用的固件。(需配置为至少双分区)

  5. 固件水印检查: 可检测固件包是否携带了特殊的水印,确认非第三方或非匹配的固件包。

  6. 固件自动更新: 当 download 或 factory 分区有可用的固件,且 APP 分区为空或 APP 分区不是最新版本的固件时,可配置为自动开始更新。

  7. 恢复出厂设置: factory 分区存放稳定版的固件,当设备需要恢复出厂设置时,该固件会被更新至 APP 分区。

  8. 无须 deinit : 我们知道,固件更新完毕后从 bootloader 跳转至 APP 前需要对所用的外设进行 deinit ,恢复至上电时的初始状态。本组件的 bootloader 包含了下载器的功能,当使用复杂的外设收取固件包时, deinit 也将变得复杂,甚至很难排除对 APP 的影响。为此,本组件采用了再入 bootloader 的方式,给 APP 提供一个相当于刚上电的外设环境,免去了 deinit 的代码。

  9. 功能可裁剪: 本组件通过功能裁剪可实现单分区、双分区、三分区的方案切换、是否配置解密组件、是否自动更新 APP 、是否检查 APP 完整性、 是否使用 SPI Flash (待实现) 。

  10. 固件存放至 SPI flash : 本组件可通过 user_config.h 配置 download 分区和 factory 分区的所在位置为片内 flash 或 SPI flash ,使用了 SFUD (Serial Flash Universal Driver) 作为 SPI flash 的底层驱动库。若使用的 SPI flash 支持 SFDP (Serial Flash Discovable Parameters) ,则可在不修改任何源代码的情况下更换其它品牌型号的 SPI flash 。若不支持 SFDP ,SFUD 中已有对应 SPI flash 参数表的话,也可做到在不修改任何源代码的情况下更换其它品牌型号的 SPI flash 。


三、 bootloader 架构

(一)软件架构



  • 硬件层描述的是运算器件和逻辑器件,如CPU、ADC、TIMER、各类IC等,是所有软件组件的硬件基础,是软件逻辑的最终底层实现。

  • 硬件抽象层是位于驱动与硬件电路之间的接口层,将硬件抽象化。它隐藏了特定平台的硬件接口细节,为驱动层提供抽象化的硬件接口,使其具有硬件无关性。

  • 驱动层通过调用硬件抽象层的开放接口,实现一定的逻辑功能后封装,提供给上层软件调用。

  • 数据传输层负责收发数据,对外开放的是数据发送与接收相关的接口,屏蔽了通讯接口的逻辑代码,使其易于修改为其他类型的通讯接口。

  • 协议析构层将调用数据传输层的数据收发接口进行封包发送与收包解析,通过实现用户的自定义协议,完成对数据的构造和解析。

  • 应用层负责业务逻辑代码的实现,通过调用其他层封装的接口,完成顶层逻辑功能。

(二)文件架构

文件功能描述
main.c由 STM32CubeMX 自动生成,负责外设的初始化
user_config.h用户配置文件,用于裁剪 OTA 组件的功能
app_config.h应用配置文件,配置代码工程的一些运行选项
app.c应用层,负责业务逻辑代码的实现
firmware_manage.c固件的管理接口层,提供了固件的所有操作接口
protocol_parser.c协议析构层,实现协议的解包和封包
data_transfer.c数据传输层,对外提供数据发送和接收的接口
data_transfer_port.c数据传输层的移植位置,便于修改为其它通讯接口
utils.c工具库,实现了一些需要全局调用的工具性质函数
bsp_config.hBSP 层的配置文件
bsp_common.hBSP 层的公共头文件
bsp_board.c实现板卡的一些自定义的初始化代码
bsp_uart.c通用的 UART 驱动库
bsp_uart_port.cUART 的接口移植文件
bsp_uart_config.hUART 的配置文件
bsp_timer.c通用的 timer 驱动库
bsp_flash.cflash 的分区操作抽象接口
fal_stm32f1_flash.cSTM32F1 片内 flash 的写入、读取和擦除的抽象接口

四、 bootloader 的设计思路

整个 bootloader 设计思路的内容较多,本设计思路也以 PDF 文档的形式提供,详见《bootloader程序设计思路》。



五、固件更新流程

根据配置的分区方案不同,固件的更新流程会有些不同,此处仅展示简要的更新流程,便于快速理解固件更新的流程,因此屏蔽了很多细节,更详细的内容,请阅读《bootloader程序设计思路》文档和源代码。

本组件的目的是最大程序的减少 APP 的改动量以实现 OTA 的功能,从下图可知, bootloader 便完成了固件的下载、存放、校验、解密、更新等所有操作, APP 部分所需要做的有以下三件事。

  1. 根据 bootloader 占用的大小和 flash 的最小擦除单位,重新设置 APP 的起始位置和中断向量表。

  2. 增加触发进入 bootloader 以开始固件更新的方式。(如:接收来自上位机的更新指令)

  3. 设置一个更新标志位,且这个标志位在 APP 软复位进入 bootloader 时仍能被读取到。(当固件更新的方式为上位机指令控制时,可以不执行此步骤)

一般来说,通知 bootloader 需要进行固件更新的方式有以下两种:

  1. 采用上位机指令控制的方式,优点是 APP 无须设置更新标志位,即便设备在收到更新指令后断电,也可以照常更新。缺点是设备在上电后, bootloader 需要等待几秒的时间(时间长短由通讯协议和上位机决定),以确认是否有来自上位机的更新指令,从而决定进入固件更新模式亦或跳转至 APP 。

  2. APP 在软复位进入 bootloader 之前设置一个特殊的标志位,可以放置在 RAM 、备份寄存器或者外部的非易失性存储介质中(如:EEPROM)。此方式的优点是设备上电时 bootloader 无须等待和验证是否有固件更新的指令,通过标志位便可决定是否进入固件更新模式亦或跳转至 APP ,且利用再入 bootloader 的机制,可以给 APP 提供一个干净的外设环境。缺点则是 APP 和 bootloader 都要记录标志位所在的地址空间,且该地址空间不能被挪作他用,不能被意外修改,更不能被编译器初始化。相较于上个方案多了要专门指定该变量的地址并且不被初始化的步骤。若使用的是 RAM 作为记录标志位的介质,则还有断电后更新标志信息丢失的问题。

综上所述,没有完美的方案。本组件支持上述方案二选一,根据实际需求进行选择和取舍即可。

由于案例采用了 YModem-1K 协议,而本组件开始固件更新的方式是通过上位机发送指令开始的,因此测试时若设备正在运行 APP ,需要有个进入 bootloader 的条件,为了便于展示,案例使用了板卡上的功能按键作为触发条件,模拟上位机向设备发送了更新指令,详见案例的使用说明。




六、固件检测与处理机制

之所以单独列出固件的检测与处理机制,是为了方便理解代码逻辑,此部分也以 PDF 文档的形式提供,详见《固件检测与处理机制》。



七、所需的工具

  1. Firmware_Packager 此工具是必选项,负责打包 bin 固件,并为 bin 固件添加一个 96 byte 的表头,最终生成为 fpk(Firmware Package) 固件包。关于 96 byte 表头的具体内容,详见《fpk固件包表头信息》。由于 YModem-1K 协议的每包的数据大小是 1 Kbyte ,为了便于 bootloader 解包,本工具也将固件表头扩大至了 1 Kbyte ,若自定义的协议支持可变包长,可将表头长度恢复为 96 byte 。

需要注意的是,本案例选择了 YModem-1K 协议,因此若直接采用或测试 example 目录中的案例,固件打包器的表头尺寸需要选择 1024 byte 。
  1. YModem_Sender 本工程的 example 采用广泛使用且公开的 YModem-1K 通讯协议,因此也提供了一个基于 YModem-1K 协议的发送器。由于固件发送器和通讯协议是绑定的,实际使用时,不必绑定此工具,本工程仅为了方便测试而提供。

注:以上的工具是基于 Qt6 开发的,YModem_Sender 依赖 Qt 的 serial_port 库,需要自行添加。以上工具作为 OTA 组件的一部分,自然也是开源的。运行平台是 windows ,目前仅在 win10 和 win11 上测试过。若需要修改和编译工程,需要自行安装 Qt ,请自行搜索安装教程。


本组件的案例是基于 YModem-1K 协议及 UART 作为 MCU 与外部的数据传输媒介,因此不是仅计算核心代码部分的占用空间情况,而是整个可用工程。此数据才更有参考意义。以下是几种方案配置占用的 flash 和 RAM 的大小。

  1. 最小占用(单分区 )
    Program Size: Code=7796 RO-data=464 RW-data=116 ZI-data=9316
    flash: 8376 byte (8.18 kB)
    ram: 9432 byte (9.21 kB)

  2. 一般占用(单分区 + 解密组件)
    Program Size: Code=8574 RO-data=1010 RW-data=116 ZI-data=9572
    flash: 9700 byte (9.47 kB)
    ram: 9688 byte (9.46 kB)

  3. 一般占用(三分区 )
    Program Size: Code=8846 RO-data=614 RW-data=116 ZI-data=9348
    flash: 9576 byte (9.35 kB)
    ram: 9464 byte (9.24 kB)

  4. 最大占用(三分区 + 解密组件)
    Program Size: Code=9706 RO-data=1158 RW-data=116 ZI-data=9604
    flash: 10980 byte (10.72 kB)
    ram: 9720 byte (9.49 kB)

因双分区和三分区的占用尺寸相差较小,因此不单独列出双分区的占用情况。本组件已尽量压缩尺寸,但由于固件数据的处理需要一定的 RAM 开销,此部分除非修改每个分包的最小处理单位(目前是 4096 byte ),否则已经很难进一步压缩,请按实际需求选择。


九、移植说明

由于写教程工作量较大,本开源工程暂不提供详细的移植说明文档。代码已分层设计,具备一定的移植性,有经验的工程师看 example 中的示例代码和本说明基本都能自行移植到别的芯片平台。这里仅做几点说明。

挖个坑,后续有时间再录个移植视频。
  1. bootloader 部分的核心代码都在 source 目录下,是移植的必需文件。

  2. source/Component 和 source/BSP 目录下的组件库非移植的必选项,根据功能需要进行裁剪。

  3. 因固件包含表头,固件写入的 flash 分区的方式与通讯协议是强相关的。若自定义的协议支持可变长度,那么建议传输第一个分包时就是固件表头的大小(标准表头大小是 96 byte ,本工程因采用 YModem-1K 协议,固件打包器将表头扩大到了 1 Kbyte,自行修改即可),从而方便 bootloader 解包。

  4. 除开表头部分,固件的每个切包不能超过 4096 byte ,且 4096 除以每个切包大小后必须是整数(如常见的128、256、512、1024、2048等),否则就得修改源码。

  5. 单分区方案虽然节省了 flash 空间,但本组件的很多功能和安全特性都无法使用,除非 flash 实在受限,否则建议至少使用双分区的方案。

以下是移植的基本步骤

(一)bootloader 部分

建议参考 example 中的案例进行移植。

  1. 创建一个代码工程,并确保这个工程可以正常运行。(如:控制一个 LED 闪烁)

  2. 将 source 目录下的文件放到工程目录下,可随意放置和命名。

  3. 将 source 目录下的文件按需添加进代码工程中(source/Component 目录下的组件库非移植的必选项),并包含对应的头文件目录。

  4. 实现 data_transfer_port.c 和 fal_stm32f1_flash.c 内的函数,若与案例一致,则无需修改。

  5. 若使用了自定义的通讯协议,则修改 protocol_parser.c 和 protocol_parser.h ,若与案例一致,则无需修改。

  6. 将 app.c 文件内的函数移植进你的应用代码,记得包含 app.h ,必要时可修改。

  7. 尝试编译并解决编译器报错的问题。(若提示缺失部分文件,可在 example 目录中寻找并添加进工程,后续再行修改也是可以的 )

  8. 按需求设置好 user_config.h 文件,请仔细阅读说明。

  9. 查看 app_config.h 是否有需要修改的配置项。

  10. 若选择了“使用标志位作为固件更新的依据 USING_APP_SET_FLAG_UPDATE ”(否则忽略此步骤),且标志位放置在 RAM ,则需要配置标志位 update_flag 所在的 RAM 地址,并且配置 IDE 或分散加载文件不对其进行初始化。IDE 配置的方式参考如下图所示。( 需包含 common.h ) 其中,宏 FIRMWARE_UPDATE_VAR_ADDR 在 user_config.h 中配置,本案例是 0x20000000 。注意,提供给 update_flag 的 RAM 区域一定要勾选 NoInit 。

/* 固件更新的标志位,该标志位不能被清零 */
#if (USING_IS_NEED_UPDATE_PROJECT == USING_APP_SET_FLAG_UPDATE)
    #if defined(__IS_COMPILER_ARM_COMPILER_5__)
    volatile uint64_t update_flag __attribute__((at(FIRMWARE_UPDATE_VAR_ADDR), zero_init));

    #elif defined(__IS_COMPILER_ARM_COMPILER_6__)
        #define __INT_TO_STR(x)     #x
        #define INT_TO_STR(x)       __INT_TO_STR(x)
        volatile uint64_t update_flag __attribute__((section(".bss.ARM.__at_" INT_TO_STR(FIRMWARE_UPDATE_VAR_ADDR))));

    #else
        #error "variable placement not supported for this compiler."
    #endif
#endif



  1. 工程配置建议选择 AC6 (虽然本组件也支持 AC5 ,除非不得已,否则建议使用 AC6),选择 C99 (如果使用了 perf_counter ,则需要选择 gnu99 ) ,优化根据需要选择即可,建议按下图所示配置。


  1. 尝试再次编译并解决编译器提示的问题。

  2. 若选择了“使用标志位作为固件更新的依据 USING_APP_SET_FLAG_UPDATE ”(否则忽略此步骤),编译通过后,查看 map 文件是否新增了一个 Region ,并且地址正确, Type 为 Zero ,该区域为 UNINIT ,若全部符合,则移植成功。


(二)APP 部分

APP 部分的移植相对简单,可直接参考 example 中的案例。

  1. 创建一个代码工程,并确保这个工程可以正常运行。(如:控制一个 LED 闪烁)

  2. 确定 APP 在 flash 中的地址,需考虑 bootloader 的大小(不能和 bootloader 有冲突),中断向量表对地址的要求(如必须是 0x200 的整数倍), flash 的擦除粒度(因 flash 擦除时是以扇区为单位的)。 需要注意的是, APP 的地址一定要和 bootloader 的 user_config.h 中配置的一致,否则无法运行。

  3. 在外设初始化前修改中断向量表, keil 可采用下图的方式修改,一劳永逸。

/* 设置中断向量表后,开启总中断 */
extern int Image$$ER_IROM1$$Base;
BSP_INT_DIS();
SCB->VTOR = (uint32_t)&Image$$ER_IROM1$$Base;
BSP_INT_EN();



  1. 同 bootloader 部分的步骤 10 一致。

  2. 增加固件更新时进入 bootloader 的代码,如上位机发送固件更新的指令。(测试时可通过按键模拟上位机发送固件更新)

  3. 在执行固件更新的指令的代码处,添加设置 update_flag 标志位的值和系统复位的代码,如下图所示。其中, FIRMWARE_UPDATE_MAGIC_WORD 的值是 0xA5A5A5A5 , 注意此值要和 bootloader 保持一致 。
    若需要通过标志位使用“恢复出厂固件”的功能,也是同理,对应的宏则是 FIRMWARE_RECOVERY_MAGIC_WORD ,值为 0x5A5A5A5A 。

update_flag = FIRMWARE_UPDATE_MAGIC_WORD;
HAL_NVIC_SystemReset();
  1. 尝试再次编译并解决编译器提示的问题。

  2. 同 bootloader 部分的步骤 13 一致。


十、一些问题的解答

  1. 为什么不使用 RTOS ?

为了最大程度的减少 bootloader 占用的 flash 空间,体积越小,组件的适用范围就越广。当然,本组件是开源的,想在 bootloader 里增加 RTOS 或者其它代码也是可以的。
  1. 为什么要将 bootloader 设计在 flash 的首地址?

我们知道, bootloader 的运行环境最理想的情况是未经使用任何外设的。有些设计会将 APP 放置在 flash 首地址, bootloader 放置在其它地址,优点是 APP 无须设置 APP 的起始位置和中断向量表,改动量最少,缺点是这种方式很难做到通用,需要在 bootloader 或 APP 中 deinit 所使用的外设,否则固件更新时可能会出现各式各样的异常。实际上,每个设备每个产品所使用的外设都是不确定的,为了做到通用,本组件选择了 bootloader 设计在 flash 的首地址的方案。
  1. 为什么要设计成单分区、双分区和三分区?

现实情况是,并非所有设备的 flash 空间都有比较大的富余。有些设备,无法使用多个分区, bootloader + APP 分区已经是极限。而 bootloader 分区方案不同时,其占用的 flash 大小也不同,为了尽可能的减小 bootloader 的体积,而将分区设计成可配置的方式。
  1. 什么是 fpk ?

fpk 是 mOTA 组件的固件打包器生成的一种文件,基于 bin 文件,在其头部增加了一个 96 byte 表头后合成的一个新文件,后缀是 .fpk 。fpk 取自英文词语 Firmware Package 的缩写,意为固件程序包,本组件统称为固件包,而提及固件时,一般指的是 bin 文件。
  1. 我可以不用固件打包器(Firmware_Packager),直接用 bin 文件进行更新吗?

[1] [2]
关键字:单片机开发  轻量级 引用地址:针对单片机开发的轻量级OTA组件

上一篇:面向对象思想编写单片机程序其实很简单!
下一篇:单片机位带牵涉的指针变量问题

推荐阅读最新更新时间:2024-11-16 20:07

基于STM32单片机开发光学指纹识别模块(FPM10A)全教程
1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 光学指纹识别模块(FPM10A)淘宝网址是:http://item.taobao.com/item.htm?id=5380075198 2.购买指纹模块,可以获得三份资料 1.简要使用说明 2.使用指纹模块的功能函数 3.FPM10A用户手册. 3.硬件搭建 根据使用说明:FPM 10A使用标准的串口与外界通信,默认的波特率为57600,可以与任何单片机,ARM,DSP等带串口的设备进行连接,请注意电平转换,连接电脑需要进行电平转换,比如MAX232电路。 FPM10A光学指纹模块共有5个管脚 1 为 VCC 电源的正极接 3.6V 5.
[单片机]
基于STM32<font color='red'>单片机</font><font color='red'>开发</font>光学指纹识别模块(FPM10A)全教程
OMA轻量级M2M TestFest测试开放注册
美国加州圣迭戈,加州-2014年12月9日-开放移动联盟(Open Mobile Alliance, OMA)今日宣布,将于2015年1月26日-29日在德国杜塞尔多夫(Dusseldorf, Germany)举行的OMA TestFest测试以及研讨会现已接受注册。此次的TestFest由OMA,沃达丰创新园(Vodafone Innovation Park)以及Eclipse Foundation共同承办。 OMA轻量级M2M(LWM2M)是一个开放的,前沿的IoT行业标准。LWM2M作为一个沟通协议,旨在实现M2M服务端以及客户端之间的沟通,以及实现对物联网下大量M2M设备的远程管理。该标准已被物联网行业的设备厂商
[手机便携]
51单片机开发板上步进电机的总结经验
相信学过电子的人都会知道什么是步进电机,它的定义及作用在百度百科里描述的也是比较详细的,它是一种同步电机,在机电一体化等工业方面均有广泛的应用,因此怎么也得知道的.于是手上找来一个实物见图1. 图1 = 图2 这是一款四相五线步进电机,转子齿数按公式推算可得为8个,步距角应为11.25度,给出的资料那应该叫半步距角.其它的参数均可按照参数图中进行,电机可以用ULN2003A这个芯片来驱动,我决定先不看51hei官方提供的资料和实例程序,看凭自己的实力能不能让这个小东西转动起来,照着图2的连线图连了起来(那4个指示灯是我自己加上去的.方便观察)并且把P1.0,P1.1,P1.2,P1.3四个I/O口和51hei单
[单片机]
51<font color='red'>单片机</font><font color='red'>开发</font>板上步进电机的总结经验
超级单片机开发工具多功能软件
单片机开发过程中用到的多功能工具,包括热敏电阻RT值--HEX数据转换;3种LED编码;色环电阻计算器;HEX/BIN 文件互相转换;eeprom数据到C/ASM源码转换;CRC校验生成;串口调试,带简单而实用的数据分析功能;串口/并口通讯监视等功能. 用C++ Builder开发,无须安装,直接运行,不对注册表进行操作。纯绿色软件。 超级单片机开发工具!!! 单片机开发过程中用到的多功能工具,包括热敏电阻RT值--HEX数据转换;3种LED编码;色环电阻计算器;HEX/BIN 文件互相转换;eeprom数据到C/ASM源码转换;CRC校验生成;串口调试,带简单而实用的数据分析功能;串口/并口通讯监视等功能. 用C++
[单片机]
51单片机的一些开发实用技巧
一.C语言中嵌入汇编语言 单片机开发中,通常我们使用C语言编写主程序,这样可以充分借助C语言工具提供的运算库函数及强大的数据处理能力。但C语言的可控性不及汇编语言,在有些对时序要求严格的处理上,我们还需用灵活性更强的汇编语言来编写。上海AVR单片机培训这样就产生了C语言和汇编语言混合编程的问题,一般分成三种方式:1.汇编语言调用C语言函数;2. C语言调用汇编语言;3. C语言中嵌入汇编语言。这里我们主要介绍第3种,即C语言中嵌入汇编语言。 下面的一段程序是主程序调用精确的205μS延时子程序并使P1.0交替输出高、低电平的方波。 /*------------程序名test.c------------*/ #include P
[单片机]
51<font color='red'>单片机</font>的一些<font color='red'>开发</font>实用技巧
单片机智能开发平台解决方案
一、单片机应用开发平台的意义   单片机是最初的大型计算机的一个分支,主要用于:工业自动化控制、智能仪器、仪表、航海、航天、智能家电等领域。单片机作为一种嵌入式产品应用的主流控制芯片,应用十分广泛,而支持它的开发手段国内还比较落后,目前我国单片机嵌入式产品的开发行业中,仍实行随意性个体的自然经济的落后方式,即便技术力量较强的公司,也仍在实行“板凳模式”的产品开发方法,大量低水平的重复劳动形成了顽症。采用平台开发模式实行“阶梯模式”的开发方式从根本上解决了“板凳模式”的弊端。 二、单片机开发平台简介   单片机应用智能开发平台是为单片机的应用开发提供的一套解决方案,包括有中文开发平台操作系统、基础平台、扩展功能函数库、仿真调试等
[单片机]
51单片机开发之矩阵键盘
3.6 矩阵键盘 3.6.1 矩阵键盘原理图 要使用矩阵键盘,需要将JP4接到JP8(P1)上面,JP165跳线帽需要断开(否则会导致矩阵键盘最右一排无法正常使用)。 图3-6-1 图3-6-2 3.6.2 矩阵键盘介绍 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键),在需要的键数比较多时,采用矩阵法来做键盘是合理的。
[单片机]
51<font color='red'>单片机</font><font color='red'>开发</font>之矩阵键盘
单片机自学需要买开发板嘛?初学者如何使用单片机开发板?
从事单片机开发的那些老工程师,或者是刚入门的单片机软件工程师,可以说99%的人都曾经买过开发板,或者一直借助开发板来从事单片机开发工作。 也许有人会质疑这个说法,如果你质疑,那你绝对还没有入门单片机,或者想学单片机但不懂单片机。 单片机最重要的一点就是动手实践,只靠书本上的学习是远远不够的,刚开始没人带也不可能直接做项目,只能从开发板学习开始。 从事单片机开发工作的大多数是电子相关专业毕业的,很多专业都有单片机原理与应用这门课程,但大学的单片机课程,我们又能学到什么? 大学课程学到的知识包括:单片机发展历史,单片机的内部寄存器,定时器功能,汇编指令集等理论知识,没有操作和实践,最多做个流水灯功能就算毕业了。 一般大学课程是不带开发
[单片机]

推荐帖子

【STM32H5开发板】2.搭建基于 KEIL 的开发环境
ARM有很多开发工具,其官方就有好几种,ST公司也有推荐的开发工具,也有高级的图形化的配置工具,使得ARM开发越来越简便。此次关于STM32H5的开发环境,本着拯救C51的开发同学们,赶快放弃C51,拥抱ARM32为目的,这次就用同学熟悉的KEIL5(uVision5)来搭建STMH563这个开发板的开发环境1.先下载集成开发软件安装包这里使用的是5..0以上的版本,如果是4或者低的版本需要升级,如果已经安装了uVision5则可以跳过。先上www
大涂涂 stm32/stm8
wince下的thread message丢失问题?
这样的线程A不停地malloc数据,通过PostThreadMessage()把数据块的指针发送给另外一个线程。线程Bwhile地GetMessage(),将数据块保存至文件,并free掉。现在发现这样做的情况下,会发生内存泄露,后来我设置了一个变量,每次PostThreadMessage成功就+1getmessage后-1。最后打印出来的结果都是正数。也就是说有些消息丢失了。我想问的问题是:1、在threadB接收速度比threadA快的情况下,会有消息丢失的情况发生么?
jerrygang WindowsCE
请教BQ25504官方TINA仿真用法
在官网找到BQ25504TINA-TITransientReferenceDesign,装了TINA,然后打开,然后就不会用了,请教TINA用运行吗(像Multisim一样点一下运行?)这个仿真文件怎么用?请教BQ25504官方TINA仿真用法最后咋样的donglei兄求指教 我都忘了什么时候发的了。。。
lidonglei1 模拟与混合信号
DSP2808 开发板,原价368,现在250包顺丰
自己用的DSP板子,原价的7.5折,包顺丰需要的联系QQ429512065手机13291810711资料去看淘宝上芯源乐淘的网页,上面有详细的介绍。。。。DSP2808开发板,原价368,现在250包顺丰不错哟~本站强荐:185娱乐︰城.足球︰真_人.彩票齐全︰手机可投︰注任何游戏.首次开户送10元.首存送58元.信誉绝对保证185.cc板子资料写的很好。。。回复沙发qinkaiabc的帖子好吧,降价到220吧,速度。。。。。。。。。。。。
乔海权 淘e淘
基于MSP430F449单片机宽带直流放大器的设计
根据设计要求,在较宽的信号带宽(0~10MHz)内,实现最大电压增益≥60dB,且能够连续调节增益或能够以5dB步距预置增益是最大难点,也是设计的重点之一。另一难点是后级功率放大模块在100Q负载上最大输出电压正弦波有效值Vo≥10V。由于带宽低端为0Hz即直流信号,放大电路的零点漂移也是一个很难解决的问题。此外,在整个放大器的设计中,还需要考虑其成本。  1.数据处理和控制核心选择  方案一:采用AT89S52+FPGA来实现信号增益控制、数据处理和人机界面控制等功能。由于本系统不涉及大量
fish001 微控制器 MCU
高速PCB设计、高速数字电路设计和电磁兼容性经典书籍
1.**《SignalandPowerIntegrity-Simplified》**-**作者**:EricBogatin-**简介**:这本书是信号完整性和电源完整性领域的经典著作。书中详细介绍了高速PCB设计中的各种信号和电源问题,包括信号反射、串扰、阻抗匹配、以及PCB腔体谐振等内容。EricBogatin通过实用的设计准则和丰富的案例分析,帮助读者理解如何在设计中避免腔体谐振问题,并且涵盖了现代高速数字系统的许多实际应用。###2.**《Hi
jnh 电路观察室
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved