flash监听机制(one by one)

package
{
 import flash.display.MovieClip;
 import flash.display.Sprite;
 import flash.events.Event;
 
 public class Test extends Sprite
 {
  public var _circle:MovieClip;
  public function Test ():void
  {
   
   this._circle = new CircleMc();
   //this._circle.addEventListener(Event.COMPLETE, onComplete);
   this._circle.addEventListener(Event.ENTER_FRAME, this.onComplete);
   addChild(this._circle);
   this._circle.play();
   /*_circle.onEnterFrame = function () {
    trace (this._currentframe);
   }
   
   this._circle.x = 100;
   this._circle.y = 100;
   
   */
  }
  
  public function onComplete(evt:Event):void
  {
   trace(evt.currentTarget.currentFrame);
   var mc:MovieClip = evt.currentTarget as MovieClip;
   if (mc.currentFrame != mc.totalFrames)
    return;
   this._circle.gotoAndStop(1);
   this._circle.removeEventListener(Event.ENTER_FRAME, this.onComplete);
   trace("complete!!!");
   return;
  }
 } 
}

### GD32E232 默认启动模式及通过 I2C0 重新编程 Flash 的引导加载程序使用方法 GD32E232 微控制器支持多种启动模式,其默认启动模式为从内置 Flash 存储器启动,即系统复位后自动从 Flash 地址 `0x08000000` 开始执行代码。该模式适用于大多数应用程序开发和调试场景[^1]。 在特定情况下,例如固件更新或设备恢复,GD32E232 可以通过引导加载程序(Bootloader)实现从外部接口(如 I2C0)重新编程 Flash。该功能允许通过 I2C 接口接收新的固件数据并写入 Flash,从而实现远程更新或恢复系统程序。 --- ### 通过 I2C0 使用引导加载程序重新编程 Flash 的方法 GD32E232 的 Bootloader 支持通过 I2C0 接口进行编程。该功能通常通过以下步骤实现: 1. **配置 I2C0 为从机模式** 引导加载程序运行时,MCU 作为 I2C 从设备,等待主机发送固件数据。需配置 I2C0 的相关寄存器,包括时钟使能、GPIO 引脚复用、I2C 模式设置等。 示例代码如下: ```c // 使能 I2C0 和 GPIO 时钟 rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_I2C0); // 配置 PA8 和 PA9 为 I2C0 的 SCL 和 SDA gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_8 | GPIO_PIN_9); gpio_output_options_set(GPIOA, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_9); gpio_af_set(GPIOA, GPIO_AF_4, GPIO_PIN_8 | GPIO_PIN_9); // 初始化 I2C0 为从机模式 i2c_deinit(I2C0); i2c_slave_address_config(I2C0, 0x50); // 设置从机地址 i2c_enable(I2C0); ``` 2. **进入 Bootloader 模式** 用户可通过特定方式触发进入 Bootloader,例如通过设置特定引脚(如 BOOT0)为高电平并复位芯片。进入后,MCU 会监听 I2C 总线上的数据,并根据协议解析命令和数据流。 3. **接收并写入固件数据** 主机通过 I2C0 发送固件数据,Bootloader 接收后将其写入 Flash 的指定地址范围。Flash 写入前需进行擦除操作,确保目标扇区为空。 示例 Flash 操作代码如下: ```c // 擦除 Flash 扇区 fmc_unlock(); fmc_sector_erase(APP_START_ADDR); // 写入固件数据到 Flash for (uint32_t i = 0; i < data_len; i += 4) { fmc_word_program(APP_START_ADDR + i, *(uint32_t *)(data_buffer + i)); } fmc_lock(); ``` 4. **跳转到新固件** 固件更新完成后,Bootloader 可跳转到新固件的入口地址执行。通常做法是读取新固件的栈顶地址和复位向量,设置主栈指针并跳转。 示例跳转代码如下: ```c typedef void (*pFunction)(void); pFunction Jump_To_Application; uint32_t JumpAddress; // 获取新固件的入口地址 JumpAddress = *(uint32_t *)(APP_START_ADDR + 4); Jump_To_Application = (pFunction)JumpAddress; // 设置主栈指针 __set_MSP(*(uint32_t *)APP_START_ADDR); // 跳转到新固件 Jump_To_Application(); ``` --- ### 注意事项 - 在使用 Bootloader 通过 I2C0 更新 Flash 时,必须确保 I2C 通信稳定,避免数据传输错误。 - Flash 操作前必须进行擦除,否则写入操作将失败。 - 固件更新完成后,应验证数据完整性(如 CRC 校验),确保新固件可正常运行。 - 不同型号 GD32 MCU 的 Bootloader 配置方式可能略有差异,需参考具体型号的用户手册[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值