STM32

STM32是STMicroelectronics(意法半导体)推出的一系列基于ARM Cortex-M内核的32位微控制器(MCU)产品。这些微控制器提供了广泛的产品系列,覆盖了多种不同的性能和功能需求,适用于各种应用领域,包括工业控制、汽车电子、消费类电子、医疗设备等。

STM32系列微控制器以其高性能、低功耗、丰富的外设接口和灵活的开发工具而闻名。它们通常具有丰富的存储器、多种通信接口(如UART、SPI、I2C、CAN等)、模拟数字转换器(ADC)、定时器、PWM输出等功能,以满足不同应用场景下的需求。

STM32微控制器通常使用标准的ARM Cortex-M内核,包括Cortex-M0、M0+、M3、M4和M7等,这些内核具有不同的性能和功耗特性,可根据具体应用的需求进行选择。此外,STM32系列还提供了多种封装和引脚配置,以满足不同尺寸和集成度的要求。

STMicroelectronics为STM32系列提供了丰富的开发工具和支持资源,包括基于ARM开发环境的集成开发环境(IDE)、调试器、评估板和参考设计等。这些工具和资源有助于开发人员快速开发和部署他们的应用,并提供了全面的技术支持和文档资料,帮助用户充分发挥STM32微控制器的性能和功能优势。

意法半导体STM32 微控制器 (MCU)软件生态系统 STM32Cube新增一个USB Type-C® 连接器系统接口(UCSI)软件库,加快USB-C供电(PD)应用的开发。

1.jpg

X-CUBE-UCSI是一款UCSI 认证的总包整体方案,组件包含即用型硬件和使用STM32 MCU充当UCSI PD控制器实现标准化通信的固件示例。客户可以直接复制粘贴这些参考设计,并从优化的物料清单(BoM)成本中受益。

该软件允许 MCU 连接系统主处理器,使用 UCSI 协议与操作系统交换信息,同时控制 USB-C 连接和 PD 协议。主处理器可以是系统芯片(SoC)、应用处理器或 STM32MP微处理器,主处理器的职责就是UCSI 操作系统策略管理器(OPM)。STM32 MCU上的 PD 控制器充当 UCSI平台策略管理器 (PPM)。STM32 MCU中有很多产品都提供USB Type-C供电(UCPD)所需外设。STM32G0系列是售价较低的USB Type-C供电微控制器,是MPU理想的低引脚数量的配套芯片,专门负责处理PD供电功能。

该软件还允许在生产线以及应用生命周期中用主处理器在STM32 MCU上烧写固件。主处理器使用微软或 Linux社区提供的UCSI驱动程序以及相关命令与 PD 控制器交换数据。除了节省开发时间外,该软件还扩展了 USB-C 设备之间的互操作性,支持该技术提供的最新用例。

X-CUBE-UCSI STM32Cube 扩展软件可帮助开发人员开发USB PD 双角色电源 (DRP) 应用,支持交替模式命令。

在USB认证(TID 8088) Discovery 板 STM32MP135F-DK上,应用主处理器STM32MP135连接UCSI PD 控制器 STM32G071 MCU,让开发者能够先人一步,快速启动开发流程。这块板子还使用了意法半导体的 TCPP03-M20 USB Type-C 高压端口保护 IC。

现在有500多款标准 STM32 MCU在片上实现了 ST UCPD 供电控制外设。此外,STM32 MCU 丰富的模拟数字外设作为端口扩展器,为实现主处理器不支持的附加功能提供了更高的灵活性。

想了解基于意法半导体MCU的USB Type-C 供电解决方案,请访问www.st.com/en/embedded-software/x-cube-ucsi.html

欢迎访问 STM32 开发者专区,一站式购齐全部工具和资源:

关于意法半导体(ST

意法半导体拥有5万名半导体技术的创造者和创新者,掌握半导体供应链和先进的制造设备。作为一家半导体垂直整合制造商(IDM),意法半导体与二十多万家客户、数千名合作伙伴一起研发产品和解决方案,共同构建生态系统,帮助他们更好地应对各种挑战和新机遇,满足世界对可持续发展的更高需求。意法半导体的技术让人们的出行更智能,电源和能源管理更高效,物联网和互联技术应用更广泛。意法半导体承诺将于2027年实现碳中和。详情请浏览意法半导体公司网站:www.st.com

围观 60

2023年7月11日,慕尼黑上海电子展盛大开幕。STM32携物联网&智能互联等领域的世界级领先产品和智能解决方案精彩亮相,各种前沿技术和应用演示令ST展位人气爆棚。

1.png

2.png

3.jpg

STM32:以边缘AI解决方案引领嵌入式AI新时代

2023年7月12日,ST微控制器市场部门市场经理丁晓磊在本次慕尼黑上海电子展的国际嵌入式系统创新论坛发表演讲,介绍ST在边缘人工智能领域的相关产品和技术,并分享ST边缘人工智能工具,实际应用案例以及生态系统等重点内容,让更多人了解了ST如何帮助客户使用我们的边缘人工智能产品和解决方案最终实现项目落地。

嵌入式人工智能将成为主流

随着企业的业务部署场景和数据产生正在向端侧、边缘侧“迁移”,嵌入式AI也迎来了快速发展的机遇期。

在边缘侧设备中运行AI有很多优势:设备响应速度快、超低延时;降低数据传输量;更有效地保护隐私、增强信息安全;降低边缘侧设备的运行功耗;还可以降低推理成本以实现其他新的功能操作。因此,边缘AI 可以为很多领域提供价值,比如:工业预测性维护,从家电到工业机器的控制系统,以及物联网 (IoT)应用,如智慧城市, 智慧楼宇, 智慧家庭和工业自动化等。

STM32 边缘AI解决方案加快嵌入式AI部署

作为该趋势的主要推动者,ST已经在AI方面投入大量资源,旨在帮助开发人员在基于微控制器/微处理器(STM32系列)和传感器(MEMS、ToF…)的嵌入式系统上快速部署AI应用。

ST提供了一整套工具、设计支持和服务,包括软件工具、模型库、 软件参考,硬件芯片,开发板等,在STM32 MCU、MPU和智能传感器上实现边缘AI,通过简单、快速、低成本的方式为许多解决方案带来智能化,例如:预测性维护、物联网产品、智能楼宇、资产跟踪、人数统计等等。

通过嵌入式AI,轻松增强应用,开启全新应用可能性,解锁AI应用普惠之道。ST在帮助客户使用我们的边缘人工智能产品和解决方案最终实现项目落地方面,已取得了丰富的应用案例,涵盖智慧城市、智能家居、娱乐、玩具、智能楼宇、交通运输、智能办公、工业、家电等各个领域。

4.png

▲ 图:STM32在电弧检测中的应用

STM32 Cube.AI:一个工具,两个版本,轻松将AI部署到STM32

STM32Cube.AI 软件工具,是ST提供的嵌入式AI工具,支持全系列STM32芯片,致力于在STM32实现优异的AI性能,可在 STM32硬件上实现更加便捷的评估、转换和部署机器学习或深度神经网络。该工具集成在STM32Cube MCU开发环境中,可以优化和调整模型,直接部署在目标板上。

STM32Cube.AI工具的两个版本包括:STM32Cube.AI和STM32Cube.AI开发者云。

5.png

STM32Cube.AI是STM32嵌入式AI工具的PC版本,可帮助优化STM32项目中经过训练的AI模型的性能和内存占用。

STM32Cube.AI开发者云平台是STM32最新的线上 AI 服务器,可直接评估模型的在板推理时间。它可用来创建、优化和生成适用于STM32微控制器的人工智能,以及进行基准测试。无需安装任何软件,也无需评估板。

NanoEdge AI Studio软件工具是ST为无AI专业知识的嵌入式开发者提供等一体化机器学习方案,助用户从头开始做自己的AI解决方案。ST重写了从代数、机器学习和信号处理的各种算法,并且使这些算法能够在MCU内学习和推理。

ST为嵌入式AI准备了一站式网站资源: https://stm32ai.st.com/zh,客户可随时登陆获取相关信息。

STM32 DEMO 展示精选
在本次慕尼黑电子展上,ST展示了两个重磅边缘AI技术方案:边缘人工智能洗衣机DEMO:该Demo演示了AI如何通过提供更准确的衣服重量测量, 帮助经典的电机控制设备达到更高的节能与节水等级。由NanoEdge AI Studio 生成的AI模型通过对电流信号进行特征分析与学习,使测量精度相对传统算法得到大幅提升。

6.jpg


STM32最新一代高性能MPU ——STM32MP257。STM32MP2是ST新推出的第二代64位工业4.0级边缘AI MPU,通过SESIP 3级认证,配备工业应用接口和专用边缘 AI加速单元。该产品在继承了STM32生态系统基础上,采用了全新的处理器架构,提升了工业和物联网边缘应用的性能和安全性。

7.jpg


STM32展台还展出了更多丰富的产品技术和解决方案Demo,涵盖图形界面、无线连接、安全类应用以及基于STM32的各类开发板演示。

图形界面类Demo包括:基于STM32U599驱动大圆屏的集合DEMO,Qt图形界面演示 -基于Qt+openST Linux的图形方案,基于LVGL+ 裸机程序图形方案的LVGL图形界面演示,基于OpenST Linux + LVGL的图形界面演示。

STM32WBA无线连接 Demo: 演示了STM32WBA 灵活的主从一体和强大的多连接功能,在低功耗蓝牙常规点对点通信功能上,扩展实现低延时和低功耗的星状网络通信,满足客户低功耗蓝牙更广的网络覆盖需求。

安全类应用Demo:STMH573I-DK板TrustZone隔离保护和OTFDEC性能演示

板卡类Demo包括:STM32C031系列NUCLEO板,STM32C031系列Discovery板,STM32C011系列Discovery板。

8.png

9.png

10.jpg

11.jpg

12.jpg

13.jpg

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 135

STM32嵌入式面试知识点总结

cathy的头像

一、STM32F1和F4的区别?

解答:

参看:STM32开发 – STM32初识

内核不同:F1是Cortex-M3内核,F4是Cortex-M4内核;

主频不同:F1主频72MHz,F4主频168MHz;

浮点运算:F1无浮点运算单位,F4有;

功能性能:F4外设比F1丰富且功能更强大,比如GPIO翻转速率、上下拉电阻配置、ADC精度等;

内存大小:F1内部SRAM最大64K,F4有192K(112+64+16)。

二、介绍以下STM32启动过程?

解答:

软件超时机制

1、背景

在嵌入式软件程序设计过程中中,经常会遇到超时(或定时)的处理情况,基本处理思想是在时间到的时候进行相关程序处理,下面介绍两种超时(或定时)的程序设计方案。

2、方案一

基本思想:定时器中断使用一个变量TICK,中断间隔时间t,在准备定时开始时读取此时刻的TICK,在程序运行过程中实时读取当前的TICK信息并计算即可。因此在时间计算时只需计算开始STARTTICK和结束ENDTICK即可完成时间计算。时间计算T=(ENDTICK-STARTTICK) * t;使用一个定时器中断每t时间处理一次中断,中断里面时间计数值s_u32TCNT++,如下图所示:

1.png

程序中定义一个结构体来保存超时开始和超时结束时间,结构体定义如下图所示:

2.png

在需要做定时超时处理的地方实时的获取当前s_u32TCNT并赋值给u32EndTimeTick,计算开始u32StartTimeTick和结束时u32EndTimeTick的时间差来判断时间是否到来即可,程序设计示意代码如下图所示:

3.png

3、方案二

基本思想:定义回调函数和回调注册函数,将定时/超时服务函数注册回调,每一次定时器中断执行一次回调,回调函数只需对计时时间TCNT做减1操作即可。

当TCNT为0时即定时/超时时间到,并置超时标志,应用程序只需判断标志即可明确定时/超时时间是否到来;回调函数和回调注册函数定义如下图所示,多个超时/定时回调函数可注册在回调函数数组中:

4.png

定时中断函数中进行遍历处理,定时中断函数处理示意代码如下图所示:

5.png

4、对比总结

方案一优点在于中断执行单元执行内容少,代码操作容易理解,缺点是应用中实时的进行计算开始和结束TICK差值,代码执行效率不高。方案二优点在于将超时函数注册在回调中即可,程序扩展性较好,不用做过多的数值计算,代码执行效率相对较高,缺点是定时中断中需要遍历所有已注册的对调,中断执行内容相对较多。

STM32程序超时设计

在程序设计中,出现以下类似语句,是非常不可靠的,很有必要加入超时处理!

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

以下在STM32的system_stm32f10x.c文件中,判断外部晶振起振的程序。可以参考,在以后的程序中借鉴。

#define HSE_STARTUP_TIMEOUT   ((uint16_t)0x0500) /*!< Time out for HSE start up */
/* Wait till HSE is ready and if Time out is reached exit */
do
{    
    HSEStatus = RCC->CR & RCC_CR_HSERDY;    
    StartUpCounter++;  
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

I2C 读写EEPROM添加超时:

uint16_t i = 0x0fff;
while ((!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))&&i){i--;};

版权声明:本文为CSDN博主「share明」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_38767222/article/details/90374420

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 146

ST开辟边缘AI专区,请点击访问 https://stm32ai.st.com/zh/ 

嵌入式AI无疑将是下一个“科技风口”。

随着企业的业务部署场景和数据产生正在向端侧、边缘侧“迁移”,嵌入式AI也迎来了快速发展的机遇期——将推理过程移到深度边缘计算会带来诸多优势,比如系统响应能力、用户隐私保护、降低连接成本和功耗。

作为该趋势的主要推动者,意法半导体已经在AI方面投入大量资源,旨在帮助开发人员在基于微控制器/微处理器(STM32系列)和传感器(MEMS、ToF…)的嵌入式系统上快速部署AI应用。

ST提供了一整套工具,在STM32 MCU、MPU和智能传感器上实现边缘AI,通过简单、快速、低成本的方式为许多解决方案带来智能化,例如:预测性维护、物联网产品、智能楼宇、资产跟踪、人数统计等等。

应用案例

通过嵌入式AI,轻松增强应用,开启全新应用可能性,解锁AI应用普惠之道。ST提供了丰富的应用案例,涵盖智慧城市、智能家居、娱乐、玩具、智能楼宇、交通运输、智能办公、工业、家电等各个领域。用户可以探索这些具有启发性的真实示例,利用ST的资源打造自己的应用。

1.png

▲ 点击图片,了解详情

产品与解决方案

意法半导体为用户提供多种面向STM32和智能传感器的AI解决方案,多种微型机器学习解决方案,用于将AI嵌入到微控制器、微处理器和智能传感器上。无论在机器学习上的专业水平如何,ST提供的广泛产品都能让用户找到适合的工具,满足任何边缘AI项目需求。

2.png

▲ 点击图片,了解详情

NanoEdge AI Studio是一款简单易用的桌面工具,可增添新的数据处理功能以增强产品。任何涉及异常值/异常检测、分类或使用回归技术预测未来状态的应用案例,都可以利用机器学习的强大功能。NEAI Studio可在数分钟内创建针对任何STM32进行了优化的定制库,用以分析信号,提升产品智能性。

利用NanoEdge AI Studio,用户可以轻松为嵌入式器件生成机器学习库,其中包含数以百万计的预构建模型。这意味着无需收集和记录大而复杂的数据集。用户的模型也可以在自己器件上进行自我训练。

STM32Cube.AI是一款免费工具,可帮助优化STM32项目中经过训练的AI模型的性能和内存占用。它支持TensorFlow™ Lite、Keras和ONNX格式。如果用户具备AI知识,STM32Cube.AI将自动优化经过训练的人工神经网络,并为STM32微控制器生成对应的C代码。

STM32Cube.AI开发者云平台

STM32Cube.AI开发者云平台是STM32Cube.AI的在线版本。它可用来创建、优化和生成适用于STM32微控制器的人工智能,以及进行基准测试。无需安装任何软件,也无需评估板。利用ST Board Farm,甚至能通过多个评估板远程测试算法的实际性能。

该工具有PC版,也可通过STM32Cube.AI开发者云直接在线使用。这款在线平台提供基准测试服务,可以远程评估一系列STM32板件上的AI性能。此外,还可以访问STM32 Model Zoo,其中汇集了大量经过优化的AI模型以及一些应用示例、训练脚本等。

对于使用STM32 MPU的开发人员而言,X-LINUX-AI是一个库和运行系统的集合,可简化基于OpenSTLinux的项目中经训练的AI模型的集成。ST针对使用OpenSTLinux的开发人员开发了一个完整的框架,让用户轻松集成AI模型。

ST提供多种微控制器、微处理器和智能传感器,用以开发优化了功耗、尺寸和成本的边缘AI应用。

3.png

▲ 点击图片,了解详情

丰富的资源

用户可以在此寻找了解嵌入式机器学习所需的一切资源,查找各解决方案有用内容的链接:NanoEdge AI Studio、STM32Cube.AI和X-LINUX-AI;查找集成具体示例的功能包,轻松启动项目。

4.png▲ 点击图片,了解详情

准备好了吗?速速登陆STM32 AI解决方案专区,找到最适合的工具,通过AI升级你的产品,让我们一起开启AI应用创新的崭新旅程!

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 66

关于STM32的启动流程,网上有的资料在讨论几种boot模式,有的在回答启动文件的内容,在查阅了很多资料后,本文给出一个比较全面的总结和回答。

1. 根据boot引脚决定三种启动模式

1.png

复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。BOOT0与BOOT1引脚的不同值指向了三种启动方式:

1)从主Flash启动。主Flash指的是STM32的内置Flash。选择该启动模式后,内置Flash的起始地址将被重映射到0x00000000地址,代码将在该处开始执行。一般我们使用JTAG或者SWD模式下载调试程序时,就是下载到这里面,重启后也直接从这启动。

2从系统存储器启动。系统储存器指的是STM32的内置ROM,选择该启动模式后,内置ROM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。ROM中有一段出厂预置的代码,这段代码起到一个桥的作用,允许外部通过UART/CAN或USB等将代码写入STM32的内置Flash中。这段代码也被称为ISP(In System Programing)代码,这种烧录代码的方式也被称为ISP烧录。关于ISP、ICP和IAP之间的区别将在后续章节中介绍。

3从嵌入式SRAM中启动。显然,该方法是在STM32的内置SRAM中启动,选择该启动模式后,内置SRAM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。这种模式由于烧录程序过程中不需要擦写Flash,因此速度较快,适合调试,但是掉电丢失。

总结:上面的每一种启动方式我都描述了“xxx的起始地址被重映射到了0x00000000地址,从而代码从xxx开始启动”,如下图是STM32F4xx中文参考手册中的图,可以看到类似的表述。同时,在下图中也展示了STM32F4xx中统一编址下,各内存的地址分配,注意一点,即使相应的内存被映射到了0x00000000起始的地址,通过其原来地址依然是可以访问的。

2.png

2. 启动后bootloader做了什么?

根据BOOT引脚确定了启动方式后,处理器进行的第二大步就是开始从0x00000000地址处开始执行代码,而该处存放的代码正是bootloader。

bootloader,也可以叫启动文件,无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。同样,STM32微控制器,无论是keiluvision4还是IAR EWARM开发环境,ST公司都提供了现成的直接可用的启动文件。

网上有很多资料分析了STM32的启动文件的内容,在此我只进行简单的表述。启动文件中首先会定义堆栈,定义中断/异常向量表,而其中只实现了复位的异常处理函数Reset_Handler,该函数内容如下(STM32F4XX,IAR编译器),可以看到其主要执行了SystemInit和__iar_program_start两个函数,其主要功能除了初始化时钟,FPU等,还会执行一个重要功能,那就是内存的搬移、初始化操作。 这是我想重点介绍的内容,同时也会回答一个疑问,就是如果从Flash启动的话,代码究竟是运行在哪儿的?在我之前接触ARM9、CortexA系列的时候,一般都是把代码搬到内部的SRAM或者外部DDR中执行的,STM32是如何呢?答案下一小节揭晓。

3.png

3. bootloader中对内存的搬移和初始化

本节针对程序在内置Flash中启动的情况进行分析。

4.png

我们知道烧录的镜像文件中包含只读代码段.text,已初始化数据段.data和未初始化的或者初始化为0的数据段.bss。代码段由于是只读的,所以是可以一直放在Flash中,CPU通过总线去读取代码执行就OK,但是.data段和.bss段由于会涉及读写为了,为了更高的读写效率是要一定搬到RAM中执行的,因此bootloader会执行很重要的一步,就是会在RAM中初始化.data和.bss段,搬移或清空相应内存区域。

因此我们知道,当启动方式选择的是从内置Flash启动的时候,代码依旧是在Flash中执行,而数据则会被拷贝到内部SRAM中,该过程是由bootloader完成的。bootloader在完成这些流程之后,就会将代码交给main函数开始执行用户代码。

  • 现在让我们思考一个问题,PC机在运行程序的时候将程序从外存(硬盘)中,调入到RAM中运行,CPU从RAM中读取程序和数据;而单片机的程序则是固化在Flash中,CPU运行时直接从Flash中读取程序,从RAM中读取数据,那么PC机能从Flash之类的存储介质中直接读代码执行吗?

  • 答案是不行。因为x86构架的CPU是基于冯.诺依曼体系的,即数据和程序存储在一起,而且PC机的RAM资源相当丰富,从几十M到几百M甚至是几个G,客观上能够承受大量的程序数据。但是单片机的构架大多是哈弗体系的,即程序和数据分开存储,而且单片的片内RAM资源是相当有限的,内部的RAM过大会带来成本的大幅度提高。

4. ISP、IAP、ICP三种烧录方式

虽然这个小节稍稍偏题,但是由于上面在3中启动方式中介绍过了ISP烧录,因此一并在此介绍剩下的两种烧录方式。

本小节摘自 https://blog.csdn.net/zhuimeng_ruili/article/details/119709888

1)ICP(In Circuit Programing)。在电路编程,可通过CPU的Debug Access Port 烧录代码,比如ARM Cortex的Debug Interface主要是SWD(Serial Wire Debug)或JTAG(Joint Test Action Group);

2)ISP(In System Programing)。在系统编程,可借助MCU厂商预置的Bootloader 实现通过板载UART或USB接口烧录代码。

3)IAP(In Applicating Programing)。在应用编程,由开发者实现Bootloader功能,比如STM32存储映射Code分区中的Flash本是存储用户应用程序的区间(上电从此处执行用户代码),开发者可以将自己实现的Bootloader存放到Flash区间,MCU上电启动先执行用户的Bootloader代码,该代码可为用户应用程序的下载、校验、增量/补丁更新、升级、恢复等提供支持,如果用户代码提供了网络访问功能,IAP 还能通过无线网络下载更新代码,实现OTA空中升级功能。

4)IAP和ISP 的区别。

a、ISP程序一般是芯片厂家提供的。IAP一般是用户自己编写的

b、ISP一般支持的烧录方式有限,只有串口等。IAP就比较灵活,可以灵活的使用各种通信协议烧录

c、isp一般需要芯片进行一些硬件上的操作才行,IAP全部工作由程序完成,不需要去现场

d、isp一般只需要按格式将升级文件通过串口发送就可以。IAP的话控制相对麻烦,如果是OTA的话还需要编写后台的。

e、注意,这里介绍的bootloader功能显然跟之前介绍的启动文件bootloader有所区别,其目的是为了能接受外部镜像进行烧录,而不是为了运行普通用户程序。

来源:嵌入式电子

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 108

什么是串口通讯?

串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。

典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。如下是串行通讯示数据传输意图。

1.png

串口通讯的通讯协议

最初数据是模拟信号输出简单过程量,后来仪表接口出现了RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,这就促生了RS485。

我们知道串口通信的数据传输都是0和1,在单总线、I2C、UART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS485就被广泛的使用了。

RS485通信最大特点就是传输速度可以达到10Mb/s以上,传输距离可以达到3000米左右。大家需要注意的是虽然485最大速度和最大传输距离都很大,但是传输的速度是会随距离的增加而变慢的,所以两者是不可以兼得的。

串口通讯的物理层

串口通讯的物理层有很多标准,例如上面提到的,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

2.png

在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。

下图为DB9标准串口通讯接口:

3.png

DB9引脚说明:

4.png

上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可。

5.png

串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。

波特率

波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示。

6.png

比如波特率为9600bps;代表的就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。

因此,那么每1bit的时间就是1/9600秒=104.1666...us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。两台设备要想实现串口通讯,这收发端设置的波特率必须相同,否则是没办法实现通讯的:动图演示常用通信协议原理。

收发波特率一致可以实现通讯:

7.gif

收发波特率不一致,导致RX端不能正常接收:

8.gif

串口通讯的数据结构

9.png

起始位:起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。

数据位:数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。

奇偶校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。

停止位:停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。

空闲位:空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。

单双工通讯

单工: 数据传输只支持数据在一个方向上传输;

半双工: 允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口;

全双工: 允许数据同时在两个方向上传输,因此全双工通信是两个单工方式的结合,需要独立的接收端和发送端。

10.png

STM32中的串口通讯

STM32串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器),对于大容量STM32F10x系列芯片,分别由3个USART和两个UART。

11.png

TXD:数据发送引脚;

RXD:数据输入引脚

对于两芯片的间的连接,两个芯片GND共地,同时TXD和RXD交叉连接,这样两个芯片间可进行TTL电平通信。

但如果对于芯片和PC机相连,除了共地条件外,不能使用如上的直接交叉连接,虽然两者都有TXD和RXD引脚,但通常PC机使用的是RS232接口(9针),通常是TXC和RXD经过电平转换得到,故如果要使芯片与PC机的RS232接口直接通信,需要将芯片的输入输出端口也电平转换为RS232类型,再交叉连接。

二者的电平标准不同:

  • 单片机的点评标准(TTL电平):+5V表示1,0V表示0;

  • RS232电平标准:+15/+13V表示0,-15/-13表示1。

12.png

因此单片机与PC机进行串口通信应该遵循:在单片机串口与上位机给出的RS232口之间,通过电平转换电路实现TTL电平与RS232电平间的转换。如果使用USB转串口也可以实现串口通讯,USB转串口电路图如下所示。

13.png

STM32中串口通讯已经给大家建好了相应的库函数,大家在使用和配置串口的时候直接进行调用库函数和配置就行了

请大家参照一下代码:

1、初始化结构体代码

typedef struct 
{ 
    uint32_t USART_BaudRate; // 波特率 
    uint16_t USART_WordLength; // 字长 
    uint16_t USART_StopBits; // 停止位 
    uint16_t USART_Parity; // 校验位 
    uint16_t USART_Mode; // USART 模式 
    uint16_t USART_HardwareFlowControl; // 硬件流控制 
} USART_InitTypeDef;

2、NVIC配置中断优先级

NVIC_Configuration(void)
{  
    NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中断控制器组选择 */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 配置USART为中断源 */  
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;  
  /* 抢断优先级*/  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
  /* 子优先级 */  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
  /* 使能中断 */  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  /* 初始化配置NVIC */  
  NVIC_Init(&NVIC_InitStructure);
}

3、USART配置函数

void DEBUG_USART_Config(void)
{ 
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    /* 第一步:初始化GPIO */
    // 打开串口GPIO的时钟 
    DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
    // 将USART Tx的GPIO配置为推挽复用模式 
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
    
    // 将USART Rx的GPIO配置为浮空输入模式 
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
    GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure); 
    
    /* 第二步:配置串口的初始化结构体 */
    // 打开串口外设的时钟 
    DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
    // 配置串口的工作参数
    // 配置波特率 
    USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
    // 配置 针数据字长 
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位 
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    // 配置校验位 
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    // 配置硬件流控制 
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    // 配置工作模式,收发一起 
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    // 完成串口的初始化配置
     USART_Init(DEBUG_USARTx, &USART_InitStructure);
    
    /*--------------------------------------------------------*/
    // 串口中断优先级配置 
    NVIC_Configuration();
    
    // 使能串口接收中断 
    USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
    /*--------------------------------------------------------*/
    
    /* 第三步:使能串口 */
    // 使能串口 
    USART_Cmd(DEBUG_USARTx, ENABLE); 
}

来源:STM32嵌入式开发

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 72

页面

订阅 RSS - STM32