2214059_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2214059_zh-CN

2214059_zh-CN

从 STM32Cube IDE 到 MCUXpresso IDE

移植ST应用程序


本节概述了使用恩智浦目标MCU的兼容SDK将在STM32Cube IDE中开发的应用迁移到恩智浦MCUXpresso IDE的过程。

对于熟悉STM32Cube IDE的用户来说,保持类似的开发环境可以简化过渡并降低学习曲线。在本例中,最初为STM32设备开发的I2C应用将重新创建并适配恩智浦MCU。


要完成迁移,首先应在MCUXpresso IDE中创建包含必要I2C驱动程序的最小项目。原始ST应用使用两个I2C实例实现同一块开发板中元器件间的通信。要复制此功能,必须初始化两组I2C引脚。此外,该应用使用按钮输入和LED输出来演示行为变化,需要借助MCUXpresso引脚配置工具配置相应的GPIO。


要开始迁移,原ST项目的主源文件以及任何不属于标准ST驱动集的自定义源文件应被整合进新的NXP项目中。


以下步骤概述了MCUXpresso IDE中的初始项目设置:

  1. 选择“创建新的C/C++项目”。

  2. 选择目标MCU(例如,MCXA156)。

  3. 单击“下一步”

  4. 展开驱动程序部分。

  5. 选择 I2C

  6. 单击“下一步”

  7. 单击“完成”


项目创建时会包含一个基本的“Hello World”示例。此模板可用作起点。主源文件中的所有内容(除初始宏定义外)可以逐步替换以集成应用逻辑,从而实现模块化且受控的迁移过程。

Sabina_Bruce_1-1763569353713.pngSabina_Bruce_1-1763569353713.png

下一步是将原始ST项目中的主源文件传输到新创建的MCUXpresso项目中。在此过程中,除非需要自定义头文件,否则将包含标准ST和驱动程序引用。此时不会使用自定义标头,因此仅迁移核心应用逻辑。


ST源文件中的许多函数调用都依赖于STM32特定的HAL API。请对这些功能进行审查,并使用恩智浦SDK中的同等功能进行替换。此方法包括分析main()例程中的每个函数以理解其目的,然后利用恩智浦环境中的相应实现进行替换。

 

Sabina_Bruce_2-1763569353730.pngSabina_Bruce_2-1763569353730.png

ST项目功能快速概览:

  1. 中断优先级配置
    配置微控制器的中断系统,以便在多个中断同时发生时管理优先级。

  2. 电源外设时钟实现
    激活电源(PWR)外设的时钟,这是配置电源管理设置的前提条件。

  3. 电源管理设置
    初始化STM32U5xx微控制器的电源管理功能,以优化内部元器件的能效和性能。

  4. 系统时钟配置
    设置微控制器的定时系统,将其配置为以160MHz的频率运行。

  5. 外设初始化
    确定外设的引脚配置和功能设置。在此应用中,I2C1会配置为从机,I2C3则配置为主机。

  6. LED初始化
    将LED配置为低电平有效状态,并开启LED以指示初始状态或通信反馈。

  7. GPIO轮询按钮按下
    持续监测GPIO输入引脚的状态。如果未按下按钮,LED将快速闪烁。按下按钮后,环路会退出,LED则保持点亮状态。

  8. I2C通信启动
    从主端发起I2C通信流程,触发两个I2C接口间的数据传输。


恩智浦SDK如何处理这一流程?

  1. 中断优先级配置
    此功能由CMSIS核心NVIC功能支持,且可直接重复使用。它需要定义宏来确定所需的抢占优先级。

  2. 时钟与电源配置
    这些功能都会整合至BOARD_InitBootClocks函数(位于开发板文件夹的clock_config.c下)。此函数可初始化恩智浦MCU的系统时钟和电源设置。

  3. 外设和引脚初始化
    外设设置分为两个函数:
    BOARD_InitBootPins(位于pin_mux.c中)负责处理I2C和GPIO的引脚配置。
    BOARD_InitBootPeripherals(位于peripherals.c中)则负责管理I2C外设初始化和GPIO中断设置。

  4. LED 初始化
    GPIO 引脚可根据所需的初始状态配置为高电平或低电平输出。可以使用 GPIO_PinWrite 来切换或设置 LED。

  5. GPIO轮询按钮按下
    此行为可以借助自定义轮询函数来复制,该函数利用GPIO_PinRead监测按钮状态。

  6. I2C通信开始

    I2C主通信通过LPI2C_MasterStart启动,开始与指定从设备的数据传输过程。



使用时钟配置工具解决时钟初始化问题

MCUXpresso IDE包含集成的配置工具,可通过项目浏览器从界面右上角的下拉菜单中选择相应选项进行访问。

Sabina_Bruce_3-1763569353733.pngSabina_Bruce_3-1763569353733.png

要配置系统时钟,请在 MCUXpresso IDE 中打开 Clocks 工具。

时钟图显示了所选 MCU 支持的配置。在此示例中,设备的最大核心时钟频率为 96 MHz。由于这符合应用程序的要求,因此不需要修改默认时钟设置。

Sabina_Bruce_4-1763569353743.pngSabina_Bruce_4-1763569353743.png

要启用I2C实例的外设时钟,请在MCUXpresso配置工具中导航至时钟配置图。滚动浏览图表以定位可用的外设,并选择适当的时钟源来激活I2C模块。

Sabina_Bruce_5-1763569353757.pngSabina_Bruce_5-1763569353757.png

要配置I2C0和I2C3外设的时钟源,请双击时钟配置图中与每个实例关联的CLKSEL字段。在此设置中,请选择FRO_HF_DIV作为I2C0和I2C3的时钟源。

Sabina_Bruce_6-1763569353761.pngSabina_Bruce_6-1763569353761.png

接下来,在时钟配置图中选择相应的字段以配置时钟分频器。详细信息将显示在界面的右上角面板中。要启用通往I2C外设的时钟路径,请确保选择 “分频器时钟正在运行” 选项。

Sabina_Bruce_7-1763569353764.pngSabina_Bruce_7-1763569353764.png

此时,I2C外设时钟已成功启用。

Sabina_Bruce_8-1763569353777.pngSabina_Bruce_8-1763569353777.png



要应用配置更改并将其集成到项目中,请点击“更新代码”。此操作将生成相应的源文件,并确保新设置反映在项目结构中。


使用引脚配置工具解决引脚初始化问题

MCUXpresso IDE 包含集成的配置工具,可通过项目浏览器从界面右上角的下拉菜单中选择相应选项进行访问。

Sabina_Bruce_9-1763569353780.pngSabina_Bruce_9-1763569353780.png

要开始配置I2C引脚,请从MCUXpresso IDE的配置工具菜单中选择“打开引脚”

利用筛选功能,搜索与I2C实例0兼容的可用引脚。在查看开发板原理图后,选择P0_16P0_17引脚,因为这两个引脚可以通过标头访问。在配置选项中选择LPI2C0:SDALPI2C0:SCL,为这些引脚分配相应的I2C功能。

Sabina_Bruce_10-1763569353815.pngSabina_Bruce_10-1763569353815.png

重复I2C实例3的配置过程。根据开发板电路图,为此实例选择引脚P3_27P3_28。在引脚配置工具中选择LPI2C3:SDALPI2C3:SCL来分配相应功能。

Sabina_Bruce_11-1763569353825.pngSabina_Bruce_11-1763569353825.png

一旦选择了引脚,就会生成一个配置表,显示每个引脚的布线和设置。根据此表中的布线详情,按需配置引脚。对于I2C引脚,启用内部上拉电阻,以确保通信过程中信号的完整性。

Sabina_Bruce_12-1763569353838.pngSabina_Bruce_12-1763569353838.png

除了配置I2C引脚外,还需要安装两个GPIO引脚——一个用于输入,一个则用于输出。在此开发板中, SW2 (P1_7)指定为按钮输入功能,而P3_0则指定为LED输出。

Sabina_Bruce_13-1763569353842.pngSabina_Bruce_13-1763569353842.png

Sabina_Bruce_14-1763569353845.pngSabina_Bruce_14-1763569353845.png

在引脚配置表的路由详情中,定义输入和输出GPIO的行为。根据应用需求,输出引脚应初始化为逻辑低电平状态(选择逻辑0)以激活LED。对于输入引脚,在下降沿启用中断检测以准确记录按钮按下操作。

Sabina_Bruce_15-1763569353848.pngSabina_Bruce_15-1763569353848.png

要完成配置并将更改集成到您的项目中,请点击“更新代码”。此操作将生成必要的源文件,并将所选设置应用于项目结构。

使用外设配置工具解决外设初始化问题

MCUXpresso IDE包含集成的配置工具,可通过项目浏览器访问。要启动这些工具,请使用位于界面右上角的下拉菜单。

Sabina_Bruce_16-1763569353851.pngSabina_Bruce_16-1763569353851.png


要开始外设配置,请在MCUXpresso IDE的配置工具菜单中选择 “打开外设”

在此视图中,重点是初始化每个实例的GPIO和I2C设置。要继续操作,请选择“外设驱动程序”以访问目标设备支持的驱动程序列表

Sabina_Bruce_17-1763569353857.pngSabina_Bruce_17-1763569353857.png


GPIO1 配置

要筛选可用的外设选项,请在外设驱动程序视图的搜索栏中输入“GPIO”。显示相关选项后,点击“确定”以继续进行GPIO配置。

Sabina_Bruce_18-1763569353865.pngSabina_Bruce_18-1763569353865.png

要启用分配给按钮输入的P1_7 的中断功能,首先要选择一个新的外设驱动程序。使用过滤器搜索GPIO,然后选择适当的驱动程序激活GPIO1 中断处理程序

Sabina_Bruce_19-1763569353875.pngSabina_Bruce_19-1763569353875.png

I2C3主机/主设备配置

要配置I2C外设,请在外设驱动程序视图的搜索栏中输入“I2C”来筛选可用选项。显示相关驱动程序后,为您的应用选择合适的驱动程序,然后点击“确定”以继续操作。

Sabina_Bruce_20-1763569353885.pngSabina_Bruce_20-1763569353885.png

I2C3配置为主设备(主机),并启用中断驱动的数据传输。此设置允许I2C3实例发起通信并通过中断机制处理数据传输,以提高响应速度和效率。

Sabina_Bruce_21-1763569353900.pngSabina_Bruce_21-1763569353900.png

此外,启用 I2C3 外设的中断处理程序。配置相应的优先级并激活传输数据就绪标志,以支持中断驱动的数据传输。

Sabina_Bruce_22-1763569353910.pngSabina_Bruce_22-1763569353910.png

I2C0从机/从设备配置

要配置I2C从机外设,请在外设驱动程序视图的搜索栏中输入“I2C”来筛选可用的驱动程序。显示相关驱动程序后,选择合适的驱动程序,然后点击“确定”以继续进行配置。

Sabina_Bruce_23-1763569353920.pngSabina_Bruce_23-1763569353920.png

I2C0配置为从设备(从机)。启用中断驱动的传输方式,并指定用于通信的从设备地址。此设置允许I2C0实例响应主设备请求,并通过中断处理数据接收。

Sabina_Bruce_24-1763569353944.pngSabina_Bruce_24-1763569353944.png

此外,启用I2C0外设的中断处理程序。配置适当的优先级,验证分配的从机地址,并激活接收数据就绪标志,以支持中断驱动的数据接收。

Sabina_Bruce_25-1763569353954.pngSabina_Bruce_25-1763569353954.png

要应用配置的设置并将其集成到项目中,请点击 “更新代码”。此操作将生成必要的源文件,并确保所有外设和引脚配置都反映在项目结构中。

配置工具生成的文件

MCUXpresso配置工具会根据所选设置自动生成源代码,从而简化与主应用的集成。生成的代码包括在前几个步骤中配置的时钟、引脚和外设的初始化例程。所有生成的文件都会放入项目结构的开发板目录下。

Sabina_Bruce_26-1763569353958.pngSabina_Bruce_26-1763569353958.png

  1. board.c
    使用恩智浦开发板创建项目时,默认配置包括调试UART引脚的初始化以实现串行终端通信。在这种情况下,无需使用UART功能以及board.c中的对应函数。
  2. clock_config.c
    此文件包含所有系统时钟配置。使用BOARD_InitBootClocks函数来初始化时钟频率和电源模式设置。对于此应用,系统会配置为以96MHz的频率运行。
  3. peripherals.c
    此文件包含通过配置工具配置的外设初始化代码。在本例中,它包含I2C实例和GPIO中断的设置例程。虽然可以使用BOARD_InitPeripherals函数,但有选择性地将生成的代码集成到应用的特定位置,以匹配所需的执行顺序,往往更为有效。
  4. pin_mux.c
    该文件可定义为应用选择的所有引脚配置,包括I2C和GPIO分配。虽然默认情况下包含UART引脚,但本项目中并未使用这些引脚。使用BOARD_InitBootPins函数应用引脚设置。

此外,原始ST应用包含缓存初始化函数(MX_ICACHE_Init)。在恩智浦SDK中,缓存配置由启动代码处理。具体信息可通过设备文件夹下system_MCU.c中的SystemInit函数查看。

替换初始化函数

Sabina_Bruce_41-1763577157030.pngSabina_Bruce_41-1763577157030.png

  1. 时钟和引脚初始化
    在恩智浦项目的主函数中,系统时钟和引脚配置使用配置工具生成的函数进行初始化:
    • BOARD_InitBootClocks
    • BOARD_InitBootPins
  2. 外设初始化
    外设初始化代码来源于peripherals.c文件(该文件由配置工具生成)。第一段代码可设置GPIO中断处理程序,包括其优先级和NVIC配置。

随后,对I2C主设备和从设备实例及其对应的中断处理程序和优先级进行初始化。在此阶段,中断标志尚未启用;它们将在数据传输函数内部稍后激活,以确保正确的执行顺序并避免过早触发中断。

peripherals.c文件中包含一个代码片段,专门用于初始化LPI2C0外设以进行从设备操作。这段代码可以选择性地集成到主函数或应用内的其他适当位置,以匹配所需的执行流程。

Sabina_Bruce_28-1763569353988.pngSabina_Bruce_28-1763569353988.png

虽然MCUXpresso IDE中的配置工具能够有效生成必要的初始化代码,但开发人员仍应负责确定此代码在应用中最合适的位置。这一决策应依据所实现的特定协议或外设所需的操作顺序来指导。

例如,在I2C通信中,数据传输通过中断进行管理。如果在使用LPI2C0_Init函数时不考虑时序,中断可能会过早触发,导致事务不完整或管理不善。

为确保正确执行,建议的顺序如下:

  1. 初始化外设及其相关的中断处理程序。
  2. 启动I2C事务。
  3. 启用主设备和从设备操作的中断。

在此应用中,初始化在main()函数内执行,中断标志则在稍后的Handle_I2C_Master函数中选择性启用,以保持正确的时序和控制。

Sabina_Bruce_29-1763569353999.pngSabina_Bruce_29-1763569353999.png

替换操作函数

Sabina_Bruce_43-1763577293016.pngSabina_Bruce_43-1763577293016.png


  1. SYSTICK初始化
    SYSTICK定时器会配置为支持应用内的延迟操作,例如控制LED闪烁率。有关初始化SYSTICK的详细说明,请参阅以下小节。
  2. 按钮轮询和LED控制
    此功能是通过一个自定义函数实现的,该函数会不断轮询按钮输入。在等待用户交互时,LED会切换以显示准备就绪。按下按钮后,LED保持稳定亮起,提示进入I2C数据传输阶段。
  3. I2C主设备处理
    Handle_I2C_Master函数通过恩智浦SDK中为I2C外设提供的驱动程序API实现。此函数可启动I2C事务并管理通信序列。

主设备和从设备I2C实例的中断处理程序均来自外设初始化代码。在此阶段,相关中断标志会选择性启用,以支持应用所需的具体行为。

WaitForUserButtonPress函数

要开始自定义GPIO中断处理程序,请在MCUXpresso IDE中打开外设配置工具。然后,你可以复制GPIO自动生成的IRQ处理程序,作为可靠的起点。然后可以修改此代码以满足您应用程序的特定要求。

Sabina_Bruce_31-1763569354026.pngSabina_Bruce_31-1763569354026.png

配置完外设后,点击位于 MCUXpresso IDE 右上角的 “开发” 按钮,返回代码编辑器。在开发环境中,将复制的 IRQ 处理程序代码粘贴到主源文件中——最好放在顶部——以便更容易访问和组织。

Sabina_Bruce_32-1763569354031.pngSabina_Bruce_32-1763569354031.png

已进行修改,在while循环中加入控制变量,确保此应用能够暂停执行,直至检测到按钮按下。此操作可确保程序仅在用户交互后才能继续进行,以匹配应用的预期流程。

Sabina_Bruce_33-1763569354037.pngSabina_Bruce_33-1763569354037.png

WaitForUserButtonPress 函数利用 GPIO 切换和写入操作来控制 LED 状态,并通过延迟机制管理轮询循环期间的闪烁间隔。为了实现延迟,SYSTICK 定时器被初始化并进行相应配置。

此外,引入了一个全局计数器变量,以及相应的SYSTICK中断处理程序,以支持应用程序内的基于时间的操作。

Sabina_Bruce_34-1763569354042.pngSabina_Bruce_34-1763569354042.png

在main()函数中,SYSTICK定时器初始化应在按钮轮询逻辑之前添加。此操作可确保在进入等待用户输入的循环之前,延迟机制已完全运行。

Sabina_Bruce_35-1763569354044.pngSabina_Bruce_35-1763569354044.png

最终版的 WaitForUserButtonPress 函数将包含:

  • GPIO操作可切换和控制LED状态。
  • 持续检查按钮状态的while循环,只有在检测到按键事件时才会继续执行。

Sabina_Bruce_36-1763569354052.pngSabina_Bruce_36-1763569354052.png

GPIO_* API是恩智浦GPIO驱动程序库的一部分,用于执行初始化、引脚控制和中断处理等各种操作。代码中高亮显示的宏(通常在IDE中以粉红色显示)由配置工具生成,并在pin_mux.h头文件。

应用中使用的延迟功能通过基于SYSTICK的自定义函数实现,如前所述。

要了解所有可用的GPIO API,请参阅fsl_gpio.h头文件。此文件为GPIO操作提供全面支持,包括端口和引脚级控制、配置以及中断管理。

自定义I2C中断处理程序

要以类似 GPIO 处理程序的方式定制 I2C 中断处理程序,首先要在 MCUXpresso IDE 中打开外设配置工具。从中找到并复制自动生成的I2C0 IRQ 处理程序。这是一个基础模板,可根据应用的具体要求进行修改。

Sabina_Bruce_37-1763569354056.pngSabina_Bruce_37-1763569354056.png

要返回代码编辑器,请点击位于MCUXpresso IDE右上角的“开发”按钮。进入开发环境后,将复制的I2C中断处理程序代码粘贴到主源文件中(最好放在顶部),以便整理和访问。

Sabina_Bruce_38-1763569354061.pngSabina_Bruce_38-1763569354061.png

复制外设配置工具中自动生成的中断处理程序,对I2C3重复同样的过程。然后,此处理程序可用作定制基础,类似于I2C0采用的方法。

整合I2C中断处理程序

在原始ST项目中,每个I2C实例都使用两个独立的中断处理程序:一个用于执行标准操作,另一个则用于处理错误。然而,此次迁移中使用的恩智浦MCU会为每个I2C实例提供单一中断向量,用于处理标准和错误状态。

因此,必须将原始的四个处理程序功能合并为两个,每个I2C实例各分配一个功能。此操作需要仔细审查原始中断逻辑,以确保所有相关标志和行为在合并实现中得以保留。

例如,原始项目中的从设备处理程序可检查地址匹配标志,并在检测到标志后验证就绪度以接收数据。在恩智浦环境中,等效行为通过监测统一中断处理程序内的相应状态标志来实现,以确保正确处理地址识别和数据接收。

从设备处理程序

Sabina_Bruce_39-1763569354077.pngSabina_Bruce_39-1763569354077.png

当主设备以0x7E寻址从设备时,就会触发I2C从设备中断处理程序。检测到此地址匹配后,从设备会确认请求并准备接收传入数据。

处理程序的第二部分负责管理数据接收过程。它能处理主设备传输的每个字节,监测NACK(未确认)状态以指示传输结束,并将接收的数据存储到指定的缓冲区。此操作可确保从设备正确处理通信序列,并在所有数据接收完毕后轻松终止传输。

主设备处理程序

Sabina_Bruce_40-1763569354092.pngSabina_Bruce_40-1763569354092.png

I2C主设备中断处理程序可监测主设备传输就绪标志,此标志用于指示外设已准备就绪,可传输下一个字节的数据。检测到此条件后,处理程序会检查传输缓冲区,以确定是否还有其他数据需要发送。计数器用于跟踪传输进度。

处理程序会使用适当的主设备发送操作,发送下一个字节并推进缓冲区指针。当最后一个字节发送后,处理程序会发出终止条件,以指示数据传输序列完成。

Handle_I2C_Master 函数

Handle_I2C_Master函数负责启动和管理I2C通信过程。它首先发出MasterStart命令,以启动与指定地址从设备的通信。从设备成功确认后,数据传输将通过相应的中断例程进行处理。

Sabina_Bruce_0-1763577716125.pngSabina_Bruce_0-1763577716125.png

此函数还会初始化主设备和从设备I2C实例的中断处理程序。如前所述,必须在主设备发起通信启用中断,以防止过早触发中断,从而干扰事务序列。

数据传输完成且从设备接收到所有预期的字节后,此函数会将LED设为稳定状态:表示执行成功,应用流程结束。

结束语

使用MCUXpresso IDE将应用从STM32开发环境迁移到恩智浦MCX平台,需要采用条理清晰的结构化方案。借助集成的配置工具并理解STM32与恩智浦SDK元器件间的功能等效性,开发人员可以在维持性能和功能的同时有效过渡其应用。

本指南概述了复制I2C应用的关键步骤,包括项目设置、外设配置、引脚和时钟初始化以及中断处理。虽然这些工具通过自动生成代码提供了坚实的基础,但必须谨慎考虑初始化和运行时逻辑的序列和集成,以确保稳定运行。

通过清晰理解两种环境并审慎调整应用逻辑,开发人员可以简化迁移流程,同时充分利用恩智浦MCX平台所提供的功能。



标记 (1)
无评分
版本历史
最后更新:
‎12-03-2025 03:41 AM
更新人: