PSP hardware info

該設備採用MIPS32bit內核R4000×2 CPU,運轉頻率可由軟體控制,最高達222MHz。擁有32MB主存儲器及4MB自帶DRAM。配備4.3英寸寬屏液晶顯示器,分辨率為480×272像素。支持IEEE802.11b無線網絡連接,並具備USB2.0 HighSpeed接口。內置立體聲揚聲器,支持MemoryStickPRODuo存儲卡。
PSP-100X
  • CPU
    • PSP CPU(MIPS 32bit 內核 R4000×2),1~333 MHz(由軟體控制,基於電力續航考量目前鎖定上限為222Mhz)
    • FLOPS:2.6Gflops (33MHz運轉時)
  • 記憶體
  • 顯示器
    • 4.3英寸 SHARP製寬螢幕ASV液晶
    • 480×272 像素(16:9)、1,677萬色
    • 最大亮度 200/180/130/80 cd/m2(200cd/m2限於使用外接電源時)
  • 聲音
  • 主要I/O
  • 內建光碟機
    • 播放專用UMD光碟機
  • 電源
    • 內含鋰電池(3.6V/1,800mAh。也有另售2,200mAh)
    • PSP專用外接電源(5V DC, 使用AC 100~240V 轉 DC 5V 火牛)
  • 重量
    • 約280g (含電池)
<6>[ 1491.183363][T28637] [exec_throttle] [decide_and_throttle] user=3 input=2 thl_lv=2, volt=0 cur_thl_lv/cg_thl_lv=2, 2 <6>[ 1491.184041][T20934] conn_pwr_is_adie_support no support 0x6631 <6>[ 1491.206369][ T418] [INFO]: OPLUS_CHG[STRATEGY_BS]([bs_update_data][911]): online=1 full=0 rm=2521 fcc=6784 soc=38 3716 3716(3625~3723) smooth_soc=38 3792 <3>[ 1491.209773][T20031] [zy0603_protect_check] return for is not zy0603 gauge <3>[ 1491.209815][T20031] [ERROR]: OPLUS_CHG[VIRTUAL_GAUGE]([oplus_chg_vg_protect_check][2370]): child ic[0] set protect check err, rc=-1 <3>[ 1491.209843][T20031] [ERROR]: OPLUS_CHG[MMS_GAUGE]([oplus_gauge_protect_check][679]): protect_check, rc=-1 <6>[ 1491.232946][ T25] OPLUS_CHG[oplus_charge_info]: BATTERY[277 277 3839 3839 -509 38 38 38 2521 6784 1 0x4000 63649], CHARGE[4490 600 0 0], WIRED[1 417 4843 500 1 0x0 0 0 0 2 0], WIRELESS[0 0 0 0 0 0x0 0 0 0], VOOC[0 0 0 0 0x0], UFCS[0 0 0 0x0], COMMON[5 0 0 0x0 0 1 1 6784 100 0] <3>[ 1491.233135][ T25] [ERROR]: OPLUS_CHG[MT6375]([oplus_chg_get_func][433]): this func(=2) is not supported <6>[ 1491.233910][ T99] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_get_property psp=4 <6>[ 1491.234269][ T99] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_field_get F_CHRDET_EXT, reg=0x01, val=1 <6>[ 1491.234316][ T99] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_get_property psp=64 <6>[ 1491.234347][ T99] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_get_property psp=65 <6>[ 1491.234389][ T99] [INFO]: OPLUS_CHG[MTK6895]([oplus_mt6375_set_aicl_point][5196]): set aicl point:4600 charger_type:1 <6>[ 1491.234422][ T99] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_set_mivr mivr=4600000 <6>[ 1491.234451][ T99] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_set_property psp=39 <6>[ 1491.234478][ T99] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_field_set F_VMIVR, val=4600 <14>[ 1491.361057][ T563] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Since 'android.hardware.biometrics.fingerprint.IFingerprint/default' could not be found trying to start it as a lazy AIDL service. (if it's not configured to be a lazy service, it may be stuck starting or still starting). <11>[ 1491.364846][ T1] init: Control message: Could not find 'aidl/android.hardware.biometrics.fingerprint.IFingerprint/default' for ctl.interface_start from pid: 563 (/system/bin/servicemanager) <14>[ 1491.365726][T28639] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Tried to start aidl service android.hardware.biometrics.fingerprint.IFingerprint/default as a lazy service, but was unable to. Usually this happens when a service is not installed, but if the service is intended to be used as a lazy service, then it may be configured incorrectly. <6>[ 1491.427378][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_temp_volt][7817]): e_ntc_type = 2,ntc_temp_volt = 860 <6>[ 1491.427421][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_res_to_temp][7739]): tres :87755, chg_tmp :277 <6>[ 1491.427436][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_subboard_temp][8041]): temp:277, volt:860 <6>[ 1491.431345][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_temp_volt][7817]): e_ntc_type = 2,ntc_temp_volt = 860 <6>[ 1491.431365][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_res_to_temp][7739]): tres :87755, chg_tmp :277 <6>[ 1491.431375][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_subboard_temp][8041]): temp:277, volt:860 <5>[ 1492.221202][ T1272] gauge_get_property disable GM30 <6>[ 1492.291249][ T8] [name:spm&][SPM] mcusys_off wake up by R12_SYSTIMER_EVENT_B, timer_out = 495, r13 = 0x80001ac0, debug_flag = 0x10000000 0x3, r12 = 0x40000, r12_ext = 0x0, raw_sta = 0x0 0x0 0x0, idle_sta = 0x0, req_sta = 0x0 0x0 0x0 0x0 | 0x7f007c 0x0 0x0 0x70000000 | 0xa0a0a 0x0 0x57800000 0xda000 | 0x0, spm_src_req = 0x18f60000, cg_check_sta = 0xf8, isr = 0x0, sw_rsv = 0x0 0x0 0x0 0x1 | 0x0 0xffffffff 0x0 0x0 | 0x0, raw_ext_sta = 0x848a955, wake_misc = 0x180030, sw_flag = 0x80060 0x400000, b_sw_flag = 0xfc000060 0x400000, clk_settle = 0x60fe, <6>[ 1492.291320][ T8] [name:spm&] Pending Wakeup Sources: wired wakelock 11201000.usb0 <6>[ 1492.355076][T18876] timesync boot 1492350613394 sched 1492355069711 android 01-01 05:24:52.734741 <14>[ 1492.366304][ T563] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Since 'android.hardware.biometrics.fingerprint.IFingerprint/default' could not be found trying to start it as a lazy AIDL service. (if it's not configured to be a lazy service, it may be stuck starting or still starting). <11>[ 1492.369750][ T1] init: Control message: Could not find 'aidl/android.hardware.biometrics.fingerprint.IFingerprint/default' for ctl.interface_start from pid: 563 (/system/bin/servicemanager) <4>[ 1492.391323][ T1383] before change: sk = 000000007e89ca35, rto = 250, timeout = 0, syn_backoff = 0, retry = 0, icsk_retransmits = 0 <4>[ 1492.391374][ T1383] after change: sk = 000000007e89ca35, rto = 250, timeout = 0, syn_backoff = 0, retry = 0, icsk_retransmits = 0 <4>[ 1492.396882][ T1383] before change: sk = 00000000b780da58, rto = 250, timeout = 0, syn_backoff = 0, retry = 0, icsk_retransmits = 0 <4>[ 1492.396936][ T1383] after change: sk = 00000000b780da58, rto = 250, timeout = 0, syn_backoff = 0, retry = 0, icsk_retransmits = 0 <14>[ 1493.373694][ T563] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Since 'android.hardware.biometrics.fingerprint.IFingerprint/default' could not be found trying to start it as a lazy AIDL service. (if it's not configured to be a lazy service, it may be stuck starting or still starting). <11>[ 1493.377012][ T1] init: Control message: Could not find 'aidl/android.hardware.biometrics.fingerprint.IFingerprint/default' for ctl.interface_start from pid: 563 (/system/bin/servicemanager) <14>[ 1493.377666][T28641] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Tried to start aidl service android.hardware.biometrics.fingerprint.IFingerprint/default as a lazy service, but was unable to. Usually this happens when a service is not installed, but if the service is intended to be used as a lazy service, then it may be configured incorrectly. <14>[ 1494.076875][ T569] logd: Total Log Count New: 521188, Total Log Count Old: 520658 <14>[ 1494.077010][ T569] logd: Log Load New: 530 <14>[ 1494.084999][ T569] logd: Log Count: 1, Total Log Count: 530, Exceeding Count: 0, Threshold: 6000000 <6>[ 1494.369009][T18876] timesync boot 1494364546856 sched 1494369003255 android 01-01 05:24:54.748674 <14>[ 1494.378564][ T563] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Since 'android.hardware.biometrics.fingerprint.IFingerprint/default' could not be found trying to start it as a lazy AIDL service. (if it's not configured to be a lazy service, it may be stuck starting or still starting). <11>[ 1494.382355][ T1] init: Control message: Could not find 'aidl/android.hardware.biometrics.fingerprint.IFingerprint/default' for ctl.interface_start from pid: 563 (/system/bin/servicemanager) <14>[ 1494.383313][T28642] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Tried to start aidl service android.hardware.biometrics.fingerprint.IFingerprint/default as a lazy service, but was unable to. Usually this happens when a service is not installed, but if the service is intended to be used as a lazy service, then it may be configured incorrectly. <14>[ 1495.384107][ T563] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Since 'android.hardware.biometrics.fingerprint.IFingerprint/default' could not be found trying to start it as a lazy AIDL service. (if it's not configured to be a lazy service, it may be stuck starting or still starting). <11>[ 1495.386672][ T1] init: Control message: Could not find 'aidl/android.hardware.biometrics.fingerprint.IFingerprint/default' for ctl.interface_start from pid: 563 (/system/bin/servicemanager) <14>[ 1495.387210][T28645] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Tried to start aidl service android.hardware.biometrics.fingerprint.IFingerprint/default as a lazy service, but was unable to. Usually this happens when a service is not installed, but if the service is intended to be used as a lazy service, then it may be configured incorrectly. <3>[ 1496.033069][T20934] iostack:hba_irqs = 184351, mcq_irqs = 0, self-block = 0 <6>[ 1496.322072][T20929] [INFO]: OPLUS_CHG[MMS_GAUGE]([oplus_mms_gauge_choice_fit_vol][3420]): choice cp voltage as vbat [3840, 3835] <6>[ 1496.324446][T20929] [INFO]: OPLUS_CHG[MMS_GAUGE]([oplus_mms_gauge_choice_fit_vol][3420]): choice cp voltage as vbat [3840, 3835] <6>[ 1496.330237][T20929] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_temp_volt][7817]): e_ntc_type = 2,ntc_temp_volt = 860 <6>[ 1496.330284][T20929] [INFO]: OPLUS_CHG[MTK6895]([oplus_res_to_temp][7739]): tres :87755, chg_tmp :277 <6>[ 1496.330312][T20929] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_subboard_temp][8041]): temp:277, volt:860 <6>[ 1496.355480][T16029] [INFO]: OPLUS_CHG[STRATEGY_BS]([bs_update_data][911]): online=1 full=0 rm=2521 fcc=6784 soc=38 3716 3716(3625~3723) smooth_soc=38 3792 <3>[ 1496.359583][T15451] [zy0603_protect_check] return for is not zy0603 gauge <3>[ 1496.359622][T15451] [ERROR]: OPLUS_CHG[VIRTUAL_GAUGE]([oplus_chg_vg_protect_check][2370]): child ic[0] set protect check err, rc=-1 <3>[ 1496.359650][T15451] [ERROR]: OPLUS_CHG[MMS_GAUGE]([oplus_gauge_protect_check][679]): protect_check, rc=-1 <6>[ 1496.382136][ T89] OPLUS_CHG[oplus_charge_info]: BATTERY[277 277 3840 3840 -510 38 38 38 2521 6784 1 0x4000 63649], CHARGE[4490 600 0 0], WIRED[1 415 4843 500 1 0x0 0 0 0 2 0], WIRELESS[0 0 0 0 0 0x0 0 0 0], VOOC[0 0 0 0 0x0], UFCS[0 0 0 0x0], COMMON[5 0 0 0x0 0 1 1 6784 100 0] <3>[ 1496.382242][ T89] [ERROR]: OPLUS_CHG[MT6375]([oplus_chg_get_func][433]): this func(=2) is not supported <6>[ 1496.383300][T18882] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_get_property psp=4 <6>[ 1496.383615][T18882] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_field_get F_CHRDET_EXT, reg=0x01, val=1 <6>[ 1496.383663][T18882] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_get_property psp=64 <6>[ 1496.383693][T18882] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_get_property psp=65 <6>[ 1496.383734][T18882] [INFO]: OPLUS_CHG[MTK6895]([oplus_mt6375_set_aicl_point][5196]): set aicl point:4600 charger_type:1 <6>[ 1496.383766][T18882] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_set_mivr mivr=4600000 <6>[ 1496.383794][T18882] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_set_property psp=39 <6>[ 1496.383822][T18882] mt6375-chg 11280000.i2c:mt6375@34:chg: mt6375_chg_field_set F_VMIVR, val=4600 <6>[ 1496.384990][T18876] timesync boot 1496380530549 sched 1496384986952 android 01-01 05:24:56.764657 <14>[ 1496.388842][ T563] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Since 'android.hardware.biometrics.fingerprint.IFingerprint/default' could not be found trying to start it as a lazy AIDL service. (if it's not configured to be a lazy service, it may be stuck starting or still starting). <11>[ 1496.392150][ T1] init: Control message: Could not find 'aidl/android.hardware.biometrics.fingerprint.IFingerprint/default' for ctl.interface_start from pid: 563 (/system/bin/servicemanager) <14>[ 1496.392753][T28653] servicemanager: Caller(pid=1926,uid=1000,sid=u:r:system_server:s0) Tried to start aidl service android.hardware.biometrics.fingerprint.IFingerprint/default as a lazy service, but was unable to. Usually this happens when a service is not installed, but if the service is intended to be used as a lazy service, then it may be configured incorrectly. <6>[ 1496.547276][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_temp_volt][7817]): e_ntc_type = 2,ntc_temp_volt = 860 <6>[ 1496.547317][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_res_to_temp][7739]): tres :87755, chg_tmp :277 <6>[ 1496.547333][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_subboard_temp][8041]): temp:277, volt:860 <6>[ 1496.551041][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_temp_volt][7817]): e_ntc_type = 2,ntc_temp_volt = 860 <6>[ 1496.551061][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_res_to_temp][7739]): tres :87755, chg_tmp :277 <6>[ 1496.551072][ T318] [INFO]: OPLUS_CHG[MTK6895]([oplus_get_subboard_temp][8041]): temp:277, volt:860 <6>[ 1496.802705][ C6] [ccci1/dpmf]dpmaif-txq: 0-3(status=0xf)[2048]: 2048-0-0, 2048-0-0, 2048-0-0, 2048-0-0 <6>[ 1496.802790][ C6] [ccci1/dpmf]dpmaif-txq pos: w/r/rel=(0,0,0)(0,0,0)(0,0,0)(0,0,0), tx_busy=0,0,0,0, last_isr=0,0,0,0 <6>[ 1496.802822][ C6] [ccci1/dpmf]dpmaif-rxq0: received:0; q_state=1; budget:16383; w/r=(0,0) <6>[ 1496.803054][ T318] [ccci1/cif]total cnt=4684;rxq0 isr_cnt=24;rxq1 isr_cnt=149;rxq2 isr_cnt=0;rxq3 isr_cnt=0;rxq4 isr_cnt=3526;rxq5 isr_cnt=984;rxq6 isr_cnt=1;rxq7 isr_cnt=3;rxq8 isr_cnt=0;rxq9 isr_cnt=0;rxq10 isr_cnt=0;rxq11 isr_cnt=0;rxq12 isr_cnt=0;rxq13 isr_cnt=0;rxq14 isr_cnt=0;rxq15 isr_cnt=1;rxq16 isr_cnt=0;rxq17 isr_cnt=0;rxq18 isr_cnt=0;rxq19 isr_cnt=0;rxq20 isr_cnt=0;rxq21 isr_cnt=0;rxq22 isr_cnt=0;rxq23 isr_cnt=0;
10-18
[13:39:45.260]收←◆2025-7-29 10:0:0|[info example_mr_iot.c mr_main_loop 45]: ===== Starting DevLed layer test =====2025-7-29 10:0:0|[info ManagerInit.c initManagerComponent 9]: start 2025-7-29 10:0:0|[info Console.c createConsole 302]: pre-cmd :5 mairui@root:2025-7-29 10:0:0|[warn ConfigManager.c createConfig 447]: open config file failed. 2025-7-29 10:0:0|[warn MagicBox.c createMagicBox 350]: open ProductDefinition failed. 2025-7-29 10:0:0|[info PeripheralInit.c initPeripheralComponent 41]: start 2025-7-29 10:0:0|[warn MagicBox.c getProductDefinition 209]: no moudle in productDefinitionData:peripheral 2025-7-29 10:0:0|[info light.c createLight 443]: createLight: enter function 2025-7-29 10:0:0|[info light.c ws2812_init 207]: ws2812_init: enter function 2025-7-29 10:0:0|[info PeripheralInit.c mr_switch_loop 25]: mr_switch_loop start SWD PAD Port0_Pin31 is configured to funcID 2025-7-29 10:0:0|[info light.c ws2812_init 221]: APB clock configuration: reg=0xA5A5A555, divider=52025-7-29 10:0:0|[info light.c ws2812_init 222]: APB clock frequency: 40000000 Hz (expected 40000000 Hz)2025-7-29 10:0:0|[info light.c ws2812_init 245]: ws2812_init: LEDC initialized successfully 2025-7-29 10:0:0|[info light.c createLight 483]: createLight: WS2812 hardware initialized 2025-7-29 10:0:0|[info light.c createLight 498]: createLight: new instance created (handle=0x20016b40) 2025-7-29 10:0:0|[info example_mr_iot.c mr_main_loop 64]: createLight succeeded! Handle: 0x20016b402025-7-29 10:0:0|[info DevLed.c devLedLightInit 20]: devLedLightInit: initializing WS2812C with 218 LEDs 2025-7-29 10:0:0|[info DevLed.c devLedLightInit 32]: devLedLightInit: reuse existing Light instance2025-7-29 10:0:0|[info light.c createLight 443]: createLight: enter function 2025-7-29 10:0:0|[info light.c createLight 452]: createLight: reuse existing Light instance (handle=0x20016b40) 2025-7-29 10:0:0|[info DevLed.c devLedLightInit 45]: devLedLightInit: initialized successfully 2025-7-29 10:0:0|[info example_mr_iot.c mr_main_loop 73]: createDevLed succeeded! Device name=test_led2025-7-29 10:0:0|[info example_mr_iot.c printLayerStates 22]: ===== Layer status check =====2025-7-29 10:0:0|[info example_mr_iot.c printLayerStates 25]: Light layer: handle=0x20016b402025-7-29 10:0:0|[info example_mr_iot.c printLayerStates 31]: DevLed layer: name=test_led, last state=2025-7-29 10:0:0|[info example_mr_iot.c printLayerStates 35]: ============================= [13:39:46.302]收←◆[WLAN-A] IPS in [13:39:48.284]收←◆2025-7-29 10:0:0|[info example_mr_iot.c mr_main_loop 84]: Set charging state (expected green)2025-7-29 10:0:3|[info DevLed.c devLedUpdateLightByState 71]: devLedUpdateLightByState: setting to red for state running 2025-7-29 10:0:3|[info light.c light_setState 418]: light_setState: enter function, state[0]=1, state[1]=218 2025-7-29 10:0:3|[info light.c ws2812_data 252]: ws2812_data: enter function, isstop=1 Colour: red 2025-7-29 10:0:3|[info light.c light_setState 433]: 99992025-7-29 10:0:3|[info light.c ws2812_data 252]: ws2812_data: enter function, isstop=1 Colour: red 2025-7-29 10:0:3|[info light.c ws2812_lightagain 341]: ws2812_lightagain: DMA initialized (data len=872 bytes) 2025-7-29 10:0:3|[info light.c ws2812_lightagain 355]: ws2812_lightagain: LEDC enabled (transfer started) 2025-7-29 10:0:3|[info light.c ws2812_lightagain 356]: ws2812_lightagain: Transfer started (asynchronous) Hard Fault: Secure State: 1 Stacked: R0 = 0x20004000 R1 = 0x00000007 R2 = 0x200116f8 R3 = 0xe000e000 R12 = 0x00000000 LR = 0x0e03075f PC = 0x0e030928 PSR = 0x21100000 Current: EXC_RETURN = 0x0e0084a9 MSP = 0x20003f98 PSP = 0x20038920 xPSR = 0xa0000000 CFSR = 0x00000000 HFSR = 0x00000000 DFSR = 0x00000000 MMFAR = 0x00000000 BFAR = 0x00000000 AFSR = 0x00000000 PriMask = 0x00000000 SVC priority: 0x00 PendSVC priority: 0xe0 Systick priority: 0xe0 MSP_NS = 0x20004000 PSP_NS = 0x00000000 CFSR_NS = 0x00000000 HFSR_NS = 0x00000000 DFSR_NS = 0x00000000 MMFAR_NS = 0x00000000 BFAR_NS = 0x00000000 AFSR_NS = 0x00000__LedcDmaIrqHandler__ 000 SVC priority NS: 0x00 PendSVC priority NS: 0x00 Systick priority NS: 0x00 [LEDC INT]TRANS DONE 20001 2025-7-29 10:0:3|[info light.c ledc_irq_handler 89]: ledc_irq_handler: DMA resource released (chnl=0) 2025-7-29 10:0:3|[info light.c ledc_complete_callback 38]: ledc_complete_callback#include "ameba_soc.h" #include "os_wrapper.h" #include <stdio.h> #include <stdlib.h> #include "Robot/Light.h" #include "Infra/PrintLog.h" uint16_t showChooseLights = 0; // WS2812 #define LEDC_MODE LEDC_DMA_MODE // DMA模式 #define LED_NUM (218) // 灯珠总数(默认218) #define FRAME_NUM (1) #define TEST_BUF_SIZE (LED_NUM * FRAME_NUM) // 数据缓冲区大小 // LEDC 数据结构体 typedef struct { u32 *TxData; // 数据缓冲区 u32 TxLength; // 数据长度 u32 Result; // 结果 GDMA_InitTypeDef dmaConfig; // 新增:保存 DMA 配置,用于中断后释放 } LEDC_OBJ; u32 pixels[TEST_BUF_SIZE]; LEDC_OBJ ledc_obj; GDMA_InitTypeDef ledc_dma_t; u32 frame_color = 0; bool isstop = true; //false 绿 ture 红 static bool s_isWs2812Inited = false; static bool s_ledcInited = false; u32 set_rgb(u8 r, u8 g, u8 b) { u32 led_data = (g << 16) | (r << 8) | b; return led_data; } void ledc_complete_callback(void) { infof("ledc_complete_callback\n"); } // LEDC 中断处理函数 u32 ledc_irq_handler(void *param) { LEDC_OBJ *ledc_adapter = (LEDC_OBJ *)param; u32 ledc_fifothr; u32 InterruptStatus; u32 *startaddr = NULL; static u32 Translen = 0; // 关闭全局中断 LEDC_INTConfig(LEDC_DEV, LEDC_BIT_GLOBAL_INT_EN, DISABLE); InterruptStatus = LEDC_GetINT(LEDC_DEV); // 分支1:FIFO 请求中断(CPU 补充数据,非 DMA 模式用) if (InterruptStatus & LEDC_BIT_FIFO_CPUREQ_INT) { printf("[LEDC INT]CPU REQ %lx\n", InterruptStatus); LEDC_ClearINT(LEDC_DEV, LEDC_BIT_FIFO_CPUREQ_INT); // 清除中断标志 ledc_fifothr = LEDC_GetFIFOLevel(LEDC_DEV); startaddr = ledc_adapter->TxData + Translen; // 按 FIFO 容量补充数据到硬件 if ((ledc_adapter->TxLength - Translen) >= ledc_fifothr) { Translen += LEDC_SendData(LEDC_DEV, startaddr, ledc_fifothr); } else { Translen += LEDC_SendData(LEDC_DEV, startaddr, ledc_adapter->TxLength - Translen); } // 数据全部补充完成后,重置传输长度计数器 if (ledc_adapter->TxLength == Translen) { Translen = 0; } } // 分支2:传输完成中断(释放 DMA 资源) if (InterruptStatus & LEDC_BIT_LED_TRANS_FINISH_INT) { printf("[LEDC INT]TRANS DONE %lx\n\n", InterruptStatus); LEDC_ClearINT(LEDC_DEV, LEDC_BIT_LED_TRANS_FINISH_INT); // 清除中断标志(必须先做) // 关键:仅在 DMA 模式下,释放 DMA 资源(避免非 DMA 模式下的无效操作) if (LEDC_MODE == LEDC_DMA_MODE) { // 1. 禁用 DMA 通道(防止继续传输) GDMA_Cmd(ledc_adapter->dmaConfig.GDMA_Index, ledc_adapter->dmaConfig.GDMA_ChNum, DISABLE); // 2. 释放 DMA 通道(归还给系统,避免资源泄漏) GDMA_ChnlFree(ledc_adapter->dmaConfig.GDMA_Index, ledc_adapter->dmaConfig.GDMA_ChNum); infof("ledc_irq_handler: DMA resource released (chnl=%d)\n", ledc_adapter->dmaConfig.GDMA_ChNum); } // 3. 更新传输结果,重置 LEDC,调用完成回调 ledc_adapter->Result = RESULT_COMPLETE; LEDC_SoftReset(LEDC_DEV); // 重置 LEDC 硬件,准备下一次传输 ledc_complete_callback(); // 通知上层传输完成 } // 分支3:等待数据超时中断 if (InterruptStatus & LEDC_BIT_WAITDATA_TIMEOUT_INT) { printf("[LEDC INT]wait data timeout %lx\n", InterruptStatus); LEDC_ClearINT(LEDC_DEV, LEDC_BIT_WAITDATA_TIMEOUT_INT); ledc_adapter->Result = RESULT_ERR; LEDC_SoftReset(LEDC_DEV); // 超时后也需释放 DMA 资源(避免资源泄漏) if (LEDC_MODE == LEDC_DMA_MODE) { GDMA_Cmd(ledc_adapter->dmaConfig.GDMA_Index, ledc_adapter->dmaConfig.GDMA_ChNum, DISABLE); GDMA_ChnlFree(ledc_adapter->dmaConfig.GDMA_Index, ledc_adapter->dmaConfig.GDMA_ChNum); infof("ledc_irq_handler: DMA released (timeout err)\n"); } } // 分支4:FIFO 溢出中断(处理数据溢出错误) if (InterruptStatus & LEDC_BIT_FIFO_OVERFLOW_INT) { printf("[LEDC INT]FIFO OF %lx\n", InterruptStatus); LEDC_ClearINT(LEDC_DEV, LEDC_BIT_FIFO_OVERFLOW_INT); ledc_adapter->Result = RESULT_ERR; LEDC_SoftReset(LEDC_DEV); // 溢出后同样释放 DMA 资源 if (LEDC_MODE == LEDC_DMA_MODE) { GDMA_Cmd(ledc_adapter->dmaConfig.GDMA_Index, ledc_adapter->dmaConfig.GDMA_ChNum, DISABLE); GDMA_ChnlFree(ledc_adapter->dmaConfig.GDMA_Index, ledc_adapter->dmaConfig.GDMA_ChNum); infof("ledc_irq_handler: DMA released (FIFO overflow err)\n"); } } // 重新使能全局中断(允许后续中断触发) LEDC_INTConfig(LEDC_DEV, LEDC_BIT_GLOBAL_INT_EN, ENABLE); return 0; } void ledc_dma_deinit(void) { if (LEDC_MODE == LEDC_DMA_MODE && ledc_obj.dmaConfig.GDMA_ChNum != 0xFF) { GDMA_Cmd(ledc_obj.dmaConfig.GDMA_Index, ledc_obj.dmaConfig.GDMA_ChNum, DISABLE); GDMA_ChnlFree(ledc_obj.dmaConfig.GDMA_Index, ledc_obj.dmaConfig.GDMA_ChNum); infof("ledc_dma_deinit: DMA channel %d released\n", ledc_obj.dmaConfig.GDMA_ChNum); // 重置通道号,避免重复释放 ledc_obj.dmaConfig.GDMA_ChNum = 0xFF; } } u32 ledc_dma_irq(void *param) { (void)param; printf("__LedcDmaIrqHandler__\n"); // 清除DMA中断标志 GDMA_ClearINT(ledc_obj.dmaConfig.GDMA_Index, ledc_obj.dmaConfig.GDMA_ChNum); return TRUE; } // DMA 初始化 bool ledc_dma_init(PGDMA_InitTypeDef GDMA_InitStruct,IRQ_FUN CallbackFunc,void *CallbackData,u32 *GdmaScrAddr) { u8 gdma_chnl; u8 ledc_fifothr; assert_param(GDMA_InitStruct != NULL); gdma_chnl = GDMA_ChnlAlloc(0, (IRQ_FUN)CallbackFunc, (u32)CallbackData, 4); if (gdma_chnl == 0xFF) { return FALSE; } _memset((void *)GDMA_InitStruct, 0, sizeof(GDMA_InitTypeDef)); GDMA_InitStruct->GDMA_Index = 0; GDMA_InitStruct->GDMA_ChNum = gdma_chnl; GDMA_InitStruct->GDMA_DIR = TTFCMemToPeri_PerCtrl; // 内存到外设(外设控制) GDMA_InitStruct->GDMA_DstHandshakeInterface = GDMA_HANDSHAKE_INTERFACE_LEDC_TX; GDMA_InitStruct->GDMA_IsrType = (BlockType | TransferType | ErrType); GDMA_InitStruct->GDMA_SrcAddr = (u32)(GdmaScrAddr); GDMA_InitStruct->GDMA_DstAddr = (u32)&LEDC_DEV->LEDC_DATA_REG; GDMA_InitStruct->GDMA_DstInc = NoChange; GDMA_InitStruct->GDMA_SrcInc = IncType; // 配置FIFO级别与DMA传输大小 ledc_fifothr = LEDC_GetFIFOLevel(LEDC_DEV); if (ledc_fifothr == 8) { GDMA_InitStruct->GDMA_SrcMsize = MsizeEight; // 源数据块大小:8 GDMA_InitStruct->GDMA_DstMsize = MsizeEight; // 目标数据块大小:8 } else { LEDC_SetFIFOLevel(LEDC_DEV, 15); GDMA_InitStruct->GDMA_SrcMsize = MsizeSixteen; // 源数据块大小:16 GDMA_InitStruct->GDMA_DstMsize = MsizeSixteen; // 目标数据块大小:16 } // 数据宽度:4字节 GDMA_InitStruct->GDMA_SrcDataWidth = TrWidthFourBytes; GDMA_InitStruct->GDMA_DstDataWidth = TrWidthFourBytes; return TRUE; } // WS2812 初始化 void ws2812_init(void) { if (s_ledcInited) { infof("ws2812_init: already inited, skip\n"); return; } infof("ws2812_init: enter function\n"); LEDC_InitTypeDef LEDC_InitStruct; // 使能LEDC时钟 RCC_PeriphClockCmd(APBPeriph_LEDC, APBPeriph_LEDC_CLOCK, ENABLE); volatile u32* apb_clk_reg = (u32*)0x30006018; // APB时钟配置寄存器 u32 reg_val = *apb_clk_reg; reg_val &= ~(0xF << 4); // 清除分频位[7:4] reg_val |= (5 << 4); // 设置分频值为5(得到40MHz) *apb_clk_reg = reg_val; rtos_time_delay_us(10); // 等待时钟稳定 u32 apb_div = (reg_val >> 4) & 0xF; // 获取分频值(5) u32 cpu_clk = 240000000; // KM4 CPU时钟固定为240MHz u32 apb_freq = cpu_clk / (apb_div + 1); // 240MHz / (5+1) = 40MHz infof("APB clock configuration: reg=0x%08X, divider=%d", reg_val, apb_div); infof("APB clock frequency: %d Hz (expected 40000000 Hz)", apb_freq); // 配置引脚复用(LEDC_PIN = PA31) Pinmux_Swdoff(); Pinmux_Config(LEDC_PIN, PINMUX_FUNCTION_LEDC); // 初始化LEDC结构体 LEDC_StructInit(&LEDC_InitStruct); LEDC_InitStruct.t0h_ns = NS2VAL(LED_T0H); LEDC_InitStruct.t0l_ns = NS2VAL(LED_T0L); LEDC_InitStruct.t1h_ns = NS2VAL(LED_T1H); LEDC_InitStruct.t1l_ns = NS2VAL(LED_T1L); LEDC_InitStruct.reset_ns = NS2VAL(LED_RST); // 复位时长 LEDC_InitStruct.wait_data_time_ns = NS2VAL(LED_RST); // 等待数据时长 LEDC_InitStruct.wait_time1_ns = NS2VAL(F_INTERVAL_NS); // 间隔时长 LEDC_InitStruct.ledc_trans_mode = LEDC_MODE; // 传输模式:DMA LEDC_InitStruct.led_count = LED_NUM; // 灯珠数量 LEDC_InitStruct.data_length = LED_NUM*FRAME_NUM; // 数据长度 LEDC_Init(LEDC_DEV, &LEDC_InitStruct); // InterruptRegister((IRQ_FUN)ledc_irq_handler, LEDC_IRQ, (u32)&ledc_obj, INT_PRI_MIDDLE); InterruptEn(LEDC_IRQ, INT_PRI_MIDDLE); s_ledcInited = true; infof("ws2812_init: LEDC initialized successfully\n"); } // WS2812 颜色数据配置 void ws2812_data(void) { float brightness = 1.0; //亮度系数(0---1.0) infof("ws2812_data: enter function, isstop=%d\n", isstop); if (!isstop) { printf(" Colour: green\n"); frame_color = set_rgb(0, 255*brightness, 0); // 绿色(R=0, G=255*亮度, B=0) } else if (isstop) { printf(" Colour: red\n"); frame_color = set_rgb(255*brightness, 0, 0); // 红色(R=255*亮度, G=0, B=0) } // 白色就是灯珠数量没设对 if(showChooseLights == 109) { for (u32 i = 0; i < showChooseLights; i++) { pixels[i] = frame_color; } } else if(showChooseLights == 218) { for (u32 i = 0; i < showChooseLights; i++) { pixels[i] = frame_color; } } else { for (u32 i = 0; i < 218; i++) { pixels[i] = set_rgb(255, 255, 255); } } } // WS2812 点亮 void ws2812_light(void) { ws2812_data(); // 配置颜色数据 ledc_obj.Result = RESULT_RUNNING; ledc_obj.TxData = pixels; ledc_obj.TxLength = (FRAME_NUM * LED_NUM); // 设置LEDC总传输长度 LEDC_SetTotalLength(LEDC_DEV, ledc_obj.TxLength); // DMA模式下初始化DMA并启动传输 if (LEDC_MODE) { ledc_dma_init(&ledc_dma_t, ledc_dma_irq, NULL, ledc_obj.TxData); DCache_CleanInvalidate((u32)ledc_obj.TxData, (4 * ledc_obj.TxLength)); GDMA_Init(ledc_dma_t.GDMA_Index, ledc_dma_t.GDMA_ChNum, &ledc_dma_t); GDMA_Cmd(ledc_dma_t.GDMA_Index, ledc_dma_t.GDMA_ChNum, ENABLE); } // 使能LEDC传输 LEDC_Cmd(LEDC_DEV, ENABLE); if (ledc_obj.Result == RESULT_COMPLETE) { printf("\ntx done!\n"); } if (ledc_obj.Result == RESULT_ERR) { printf("\nledc err!\n"); } // 去初始化DMA // ledc_dma_deinit(); // // 删除当前任务 // rtos_task_delete(NULL); } void ws2812_lightagain(void) { if (ledc_obj.Result == RESULT_RUNNING) { infof("ws2812_lightagain: transfer is already running, skip\n"); return; } ws2812_data(); // 配置颜色数据 ledc_obj.Result = RESULT_RUNNING; // 设置状态为“发送中” ledc_obj.TxData = pixels; // 绑定数据缓冲区 ledc_obj.TxLength = (FRAME_NUM * LED_NUM); // 绑定数据长度 u32 totalDataLen = ledc_obj.TxLength * sizeof(u32); // 总字节数(218×4=872字节) // 设置LEDC总传输长度 LEDC_SetTotalLength(LEDC_DEV, ledc_obj.TxLength); // DMA模式下初始化DMA并启动传输 if (LEDC_MODE) { infof("ws2812_lightagain: DMA initialized (data len=%d bytes)\n", totalDataLen); if (!ledc_dma_init(&ledc_obj.dmaConfig, ledc_dma_irq, NULL, ledc_obj.TxData)) { infof("ws2812_lightagain: DMA init failed\n"); ledc_obj.Result = RESULT_ERR; return; } DCache_CleanInvalidate((u32)ledc_obj.TxData, (4 * ledc_obj.TxLength)); GDMA_Init(ledc_obj.dmaConfig.GDMA_Index, ledc_obj.dmaConfig.GDMA_ChNum, &ledc_obj.dmaConfig); GDMA_Cmd(ledc_obj.dmaConfig.GDMA_Index, ledc_obj.dmaConfig.GDMA_ChNum, ENABLE); } // 使能LEDC传输 LEDC_Cmd(LEDC_DEV, ENABLE); infof("ws2812_lightagain: LEDC enabled (transfer started)\n"); infof("ws2812_lightagain: Transfer started (asynchronous)\n"); infof("okok"); // 结果 // if (ledc_obj.Result == RESULT_COMPLETE) // { // printf("ws2812_lightagain: TRANS DONE\n"); // } else if (ledc_obj.Result == RESULT_ERR) { // infof("dddd"); // } else // { // infof("111111"); // printf ("ws2812_lightagain: TRANS RUNNING\n"); // infof("222222"); // } // infof("oooook"); // // 去初始化DMA // // ledc_dma_deinit(); } typedef struct LightPriv { LightDesc desc; // 设备描述(类型、灯珠数等) int32_t refCount; // 引用计数(防止重复释放) } LightPriv; static int32_t light_addRef(Light* thiz) { if (thiz == NULL || thiz->priv == NULL) return -1; LightPriv* priv = (LightPriv*)thiz->priv; priv->refCount++; return 0; } // 接口 - 释放接口资源 static int32_t light_release(Light* thiz) { if (thiz == NULL || thiz->priv == NULL) return -1; LightPriv* priv = (LightPriv*)thiz->priv; priv->refCount--; // 引用计数为0时,释放内存和DMA资源 if (priv->refCount <= 0) { ledc_dma_deinit(); free(priv); free(thiz); } return 0; } // 接口 - static int32_t light_setState(Light* thiz, uint32_t* state) { infof("light_setState: enter function, state[0]=%d, state[1]=%d\n", state[0], state[1]); if (thiz == NULL || thiz->priv == NULL || state == NULL) return -1; // LightPriv* priv = (LightPriv*)thiz->priv; // 仅支持 WS2812C 类型(type=1) if (priv->desc.type != 1) return -2; // 不支持的设备类型 isstop = (state[0] != 0); // state[0]=0→绿,state[0]≠0→红 showChooseLights = state[1]; // state[1]→灯珠数量(109/218) ws2812_data(); // 刷新颜色数据 infof("9999"); ws2812_lightagain(); infof("1010101010"); return 0; } // 接口 - 创建Light设备 int32_t createLight(const LightDesc* desc, Light** light) { infof("createLight: enter function\n"); if (desc == NULL || light == NULL) return -1; // 参数无效 static Light* s_globalLight = NULL; if (s_globalLight != NULL) { *light = s_globalLight; light_addRef(s_globalLight); infof("createLight: reuse existing Light instance (handle=0x%x)\n", (uint32_t)s_globalLight); return 0; } // type=1 if (desc->type != 1 || (desc->lednumber != 109 && desc->lednumber != 218)) return -2; // 不支持的配置 // 分配接口对象内存 Light* newLight = (Light*)malloc(sizeof(Light)); if (newLight == NULL) return -3; // 分配失败 // 分配私有数据内存 LightPriv* priv = (LightPriv*)malloc(sizeof(LightPriv)); if (priv == NULL) { free(newLight); return -3; // 分配失败 } // 初始化私有数据 priv->desc = *desc; // priv->refCount = 1; // 初始引用计数=1 showChooseLights = desc->lednumber; // 初始化灯珠数量 if (!s_isWs2812Inited) { ws2812_init(); s_isWs2812Inited = true; // 标记为已初始化 infof("createLight: WS2812 hardware initialized\n"); } else { infof("createLight: WS2812 hardware already inited, skip\n"); } newLight->priv = priv; newLight->addRef = light_addRef; newLight->release = light_release; newLight->setState = light_setState; // s_globalLight = newLight; *light = newLight; infof("createLight: new instance created (handle=0x%x)\n", (uint32_t)newLight); return 0; }
09-19
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值