ARM GAS /tmp/ccrYTcjJ.s page 1 1 .cpu cortex-m4 2 .arch armv7e-m 3 .fpu fpv4-sp-d16 4 .eabi_attribute 27, 1 5 .eabi_attribute 28, 1 6 .eabi_attribute 20, 1 7 .eabi_attribute 21, 1 8 .eabi_attribute 23, 3 9 .eabi_attribute 24, 1 10 .eabi_attribute 25, 1 11 .eabi_attribute 26, 1 12 .eabi_attribute 30, 6 13 .eabi_attribute 34, 1 14 .eabi_attribute 18, 4 15 .file "can.c" 16 .text 17 .Ltext0: 18 .cfi_sections .debug_frame 19 .file 1 "Core/Src/can.c" 20 .global id_to_log 21 .section .bss.id_to_log,"aw",%nobits 24 id_to_log: 25 0000 00 .space 1 26 .global last_message 27 .section .bss.last_message,"aw",%nobits 28 .align 2 31 last_message: 32 0000 00000000 .space 8 32 00000000 33 .global can_status_timer 34 .section .bss.can_status_timer,"aw",%nobits 35 .align 2 38 can_status_timer: 39 0000 00000000 .space 4 40 .global can_log_timer 41 .section .bss.can_log_timer,"aw",%nobits 42 .align 2 45 can_log_timer: 46 0000 00000000 .space 4 47 .global can_timeout_timer 48 .section .bss.can_timeout_timer,"aw",%nobits 49 .align 2 52 can_timeout_timer: 53 0000 00000000 .space 4 54 .section .text.can_init,"ax",%progbits 55 .align 1 56 .global can_init 57 .syntax unified 58 .thumb 59 .thumb_func 61 can_init: 62 .LFB130: 1:Core/Src/can.c **** /* 2:Core/Src/can.c **** * can.h 3:Core/Src/can.c **** * 4:Core/Src/can.c **** * Created on: 07.07.2024 5:Core/Src/can.c **** * Author: Hamza ARM GAS /tmp/ccrYTcjJ.s page 2 6:Core/Src/can.c **** */ 7:Core/Src/can.c **** 8:Core/Src/can.c **** #include "can.h" 9:Core/Src/can.c **** #include "AMS_HighLevel.h" 10:Core/Src/can.c **** #include "PWM_control.h" 11:Core/Src/can.c **** #include "TMP1075.h" 12:Core/Src/can.c **** #include "can-halal.h" 13:Core/Src/can.c **** #include "eeprom.h" 14:Core/Src/can.c **** #include "soc_estimation.h" 15:Core/Src/can.c **** #include "state_machine.h" 16:Core/Src/can.c **** #include "stm32f3xx_hal.h" 17:Core/Src/can.c **** #include "stm32f3xx_hal_def.h" 18:Core/Src/can.c **** #include 19:Core/Src/can.c **** 20:Core/Src/can.c **** #define CAN_ID_IN 0x501 21:Core/Src/can.c **** #define CAN_ID_OUT 0x502 22:Core/Src/can.c **** #define CAN_ID_LOG 0x503 23:Core/Src/can.c **** 24:Core/Src/can.c **** // Every X ms, send message 25:Core/Src/can.c **** #define CAN_STATUS_FREQ 1000 26:Core/Src/can.c **** #define CAN_LOGGING_FREQ 200 27:Core/Src/can.c **** #define CAN_DUMP_FREQ 10 28:Core/Src/can.c **** 29:Core/Src/can.c **** // Max time to wait for CAN messages. If we reach it then we target state is set to STATE_ERROR. 30:Core/Src/can.c **** #define CAN_TIMEOUT 5000 31:Core/Src/can.c **** 32:Core/Src/can.c **** uint8_t id_to_log; 33:Core/Src/can.c **** uint8_t last_message[8]; 34:Core/Src/can.c **** uint32_t can_status_timer, can_log_timer, can_timeout_timer; 35:Core/Src/can.c **** 36:Core/Src/can.c **** void can_init(CAN_HandleTypeDef* hcan) { 63 .loc 1 36 40 64 .cfi_startproc 65 @ args = 0, pretend = 0, frame = 8 66 @ frame_needed = 1, uses_anonymous_args = 0 67 0000 80B5 push {r7, lr} 68 .cfi_def_cfa_offset 8 69 .cfi_offset 7, -8 70 .cfi_offset 14, -4 71 0002 82B0 sub sp, sp, #8 72 .cfi_def_cfa_offset 16 73 0004 00AF add r7, sp, #0 74 .cfi_def_cfa_register 7 75 0006 7860 str r0, [r7, #4] 37:Core/Src/can.c **** ftcan_init(hcan); 76 .loc 1 37 3 77 0008 7868 ldr r0, [r7, #4] 78 000a FFF7FEFF bl ftcan_init 38:Core/Src/can.c **** ftcan_add_filter(CAN_ID_IN, 0xFFF); 79 .loc 1 38 3 80 000e 40F6FF71 movw r1, #4095 81 0012 40F20150 movw r0, #1281 82 0016 FFF7FEFF bl ftcan_add_filter 39:Core/Src/can.c **** last_message[0] = -1; 83 .loc 1 39 19 84 001a 114B ldr r3, .L2 85 001c FF22 movs r2, #255 ARM GAS /tmp/ccrYTcjJ.s page 3 86 001e 1A70 strb r2, [r3] 40:Core/Src/can.c **** last_message[1] = -1; 87 .loc 1 40 19 88 0020 0F4B ldr r3, .L2 89 0022 FF22 movs r2, #255 90 0024 5A70 strb r2, [r3, #1] 41:Core/Src/can.c **** can_status_timer = HAL_GetTick() + CAN_STATUS_FREQ; 91 .loc 1 41 22 92 0026 FFF7FEFF bl HAL_GetTick 93 002a 0346 mov r3, r0 94 .loc 1 41 36 discriminator 1 95 002c 03F57A73 add r3, r3, #1000 96 .loc 1 41 20 discriminator 1 97 0030 0C4A ldr r2, .L2+4 98 0032 1360 str r3, [r2] 42:Core/Src/can.c **** can_log_timer = HAL_GetTick() + CAN_LOGGING_FREQ; 99 .loc 1 42 19 100 0034 FFF7FEFF bl HAL_GetTick 101 0038 0346 mov r3, r0 102 .loc 1 42 33 discriminator 1 103 003a C833 adds r3, r3, #200 104 .loc 1 42 17 discriminator 1 105 003c 0A4A ldr r2, .L2+8 106 003e 1360 str r3, [r2] 43:Core/Src/can.c **** can_timeout_timer = HAL_GetTick() + CAN_TIMEOUT; 107 .loc 1 43 23 108 0040 FFF7FEFF bl HAL_GetTick 109 0044 0346 mov r3, r0 110 .loc 1 43 37 discriminator 1 111 0046 03F59C53 add r3, r3, #4992 112 004a 0833 adds r3, r3, #8 113 .loc 1 43 21 discriminator 1 114 004c 074A ldr r2, .L2+12 115 004e 1360 str r3, [r2] 44:Core/Src/can.c **** id_to_log =0; 116 .loc 1 44 13 117 0050 074B ldr r3, .L2+16 118 0052 0022 movs r2, #0 119 0054 1A70 strb r2, [r3] 45:Core/Src/can.c **** } 120 .loc 1 45 1 121 0056 00BF nop 122 0058 0837 adds r7, r7, #8 123 .cfi_def_cfa_offset 8 124 005a BD46 mov sp, r7 125 .cfi_def_cfa_register 13 126 @ sp needed 127 005c 80BD pop {r7, pc} 128 .L3: 129 005e 00BF .align 2 130 .L2: 131 0060 00000000 .word last_message 132 0064 00000000 .word can_status_timer 133 0068 00000000 .word can_log_timer 134 006c 00000000 .word can_timeout_timer 135 0070 00000000 .word id_to_log 136 .cfi_endproc ARM GAS /tmp/ccrYTcjJ.s page 4 137 .LFE130: 139 .global __aeabi_i2d 140 .global __aeabi_ddiv 141 .global __aeabi_d2f 142 .section .text.can_handle_send_status,"ax",%progbits 143 .align 1 144 .global can_handle_send_status 145 .syntax unified 146 .thumb 147 .thumb_func 149 can_handle_send_status: 150 .LFB131: 46:Core/Src/can.c **** 47:Core/Src/can.c **** /* 48:Core/Src/can.c **** This function sends the status of the mvbms, the battery and of powerground. 49:Core/Src/can.c **** once every 1s in states: INACTIVE, PRECHARGE, DISCHARGE, CHARGING, ERROR. 50:Core/Src/can.c **** once every 0.5s in states: READY, ACTIVE. 51:Core/Src/can.c **** with format of: 52:Core/Src/can.c **** CAN Messages: 53:Core/Src/can.c **** Error bit 54:Core/Src/can.c **** MVBMS state 55:Core/Src/can.c **** Powerground Status 0-100% 56:Core/Src/can.c **** Errors 57:Core/Src/can.c **** Battery state of charge 58:Core/Src/can.c **** Pack Voltage 59:Core/Src/can.c **** Current 60:Core/Src/can.c **** Battery temperature (12 bit) 61:Core/Src/can.c **** 62:Core/Src/can.c **** Min/Max. Cell Temp (ID, Min Temp, ID, Max Temp)(3B), 63:Core/Src/can.c **** Min/Max Cell Voltage (ID, Min Voltage, ID, Max Voltage)(3B) 64:Core/Src/can.c **** 65:Core/Src/can.c **** bit 0 (1b): empty 66:Core/Src/can.c **** bit 1-3 (3b): state 67:Core/Src/can.c **** bit 4-11 (8b): powerground status 68:Core/Src/can.c **** bit 12-19 (8b): error 69:Core/Src/can.c **** bit 20-27 (8b): state of charge from 0-100% 70:Core/Src/can.c **** bit 28-39 (12b): battery voltage 71:Core/Src/can.c **** bit 40-51 (12b): current measurement 72:Core/Src/can.c **** bit 52-63 (12b): temperature of the cell with highest temperature 73:Core/Src/can.c **** 74:Core/Src/can.c **** 75:Core/Src/can.c **** bit 0-3 (4b): ID of the sensor with highest temperature 76:Core/Src/can.c **** bit 4-7 (4b): ID of the sensor with lowest temperataure 77:Core/Src/can.c **** bit 8-19 (12b): temperature of the coldest cell 78:Core/Src/can.c **** bit 20-23 (4b): ID of the cell with the lowest voltage 79:Core/Src/can.c **** bit 24-35 (12b): lowest cell voltage 80:Core/Src/can.c **** bit 36-39 (4b): ID of the cell the the highest voltage 81:Core/Src/can.c **** bit 40-51 (12b): highest cell voltage 82:Core/Src/can.c **** bit 52-63 (12b): empty 83:Core/Src/can.c **** */ 84:Core/Src/can.c **** 85:Core/Src/can.c **** void can_handle_send_status() { 151 .loc 1 85 31 152 .cfi_startproc 153 @ args = 0, pretend = 0, frame = 24 154 @ frame_needed = 1, uses_anonymous_args = 0 155 0000 80B5 push {r7, lr} ARM GAS /tmp/ccrYTcjJ.s page 5 156 .cfi_def_cfa_offset 8 157 .cfi_offset 7, -8 158 .cfi_offset 14, -4 159 0002 86B0 sub sp, sp, #24 160 .cfi_def_cfa_offset 32 161 0004 00AF add r7, sp, #0 162 .cfi_def_cfa_register 7 86:Core/Src/can.c **** if (can_status_timer > HAL_GetTick()) 163 .loc 1 86 26 164 0006 FFF7FEFF bl HAL_GetTick 165 000a 0246 mov r2, r0 166 .loc 1 86 24 discriminator 1 167 000c 4D4B ldr r3, .L8 168 000e 1B68 ldr r3, [r3] 169 .loc 1 86 6 discriminator 1 170 0010 9A42 cmp r2, r3 171 0012 C0F09380 bcc .L7 172 .LBB2: 87:Core/Src/can.c **** return; 88:Core/Src/can.c **** else { 89:Core/Src/can.c **** uint8_t data[8] = {}; 173 .loc 1 89 13 174 0016 07F11003 add r3, r7, #16 175 001a 0022 movs r2, #0 176 001c 1A60 str r2, [r3] 177 001e 5A60 str r2, [r3, #4] 90:Core/Src/can.c **** can_status_timer = HAL_GetTick() + CAN_STATUS_FREQ; 178 .loc 1 90 24 179 0020 FFF7FEFF bl HAL_GetTick 180 0024 0346 mov r3, r0 181 .loc 1 90 38 discriminator 1 182 0026 03F57A73 add r3, r3, #1000 183 .loc 1 90 22 discriminator 1 184 002a 464A ldr r2, .L8 185 002c 1360 str r3, [r2] 91:Core/Src/can.c **** 92:Core/Src/can.c **** uint8_t id_highest_temp = 0; 186 .loc 1 92 13 187 002e 0023 movs r3, #0 188 0030 FB73 strb r3, [r7, #15] 93:Core/Src/can.c **** uint16_t highest_temp = 0; 189 .loc 1 93 14 190 0032 0023 movs r3, #0 191 0034 BB81 strh r3, [r7, #12] @ movhi 94:Core/Src/can.c **** sm_check_battery_temperature(&id_highest_temp, &highest_temp); 192 .loc 1 94 5 193 0036 07F10C02 add r2, r7, #12 194 003a 07F10F03 add r3, r7, #15 195 003e 1146 mov r1, r2 196 0040 1846 mov r0, r3 197 0042 FFF7FEFF bl sm_check_battery_temperature 95:Core/Src/can.c **** 96:Core/Src/can.c **** data[0] = (state.current_state); // 8 bit state (only 3 are use) 198 .loc 1 96 21 199 0046 404B ldr r3, .L8+4 200 0048 1B78 ldrb r3, [r3] @ zero_extendqisi2 201 .loc 1 96 13 ARM GAS /tmp/ccrYTcjJ.s page 6 202 004a 3B74 strb r3, [r7, #16] 97:Core/Src/can.c **** data[1] = (current_powerground_status); // 8 bit powerground 203 .loc 1 97 13 204 004c 3F4B ldr r3, .L8+8 205 004e 1B78 ldrb r3, [r3] @ zero_extendqisi2 206 0050 7B74 strb r3, [r7, #17] 98:Core/Src/can.c **** data[2] = (state.error_source); // 8 bit error 207 .loc 1 98 21 208 0052 3D4B ldr r3, .L8+4 209 0054 5B88 ldrh r3, [r3, #2] 210 .loc 1 98 13 211 0056 DBB2 uxtb r3, r3 212 0058 BB74 strb r3, [r7, #18] 99:Core/Src/can.c **** data[3] = ((int) current_soc); // 8 bit state of charge 213 .loc 1 99 16 214 005a 3D4B ldr r3, .L8+12 215 005c D3ED007A vldr.32 s15, [r3] 216 0060 FDEEE77A vcvt.s32.f32 s15, s15 217 0064 C7ED017A vstr.32 s15, [r7, #4] @ int 218 .loc 1 99 13 219 0068 3B79 ldrb r3, [r7, #4] @ zero_extendqisi2 220 006a FB74 strb r3, [r7, #19] 100:Core/Src/can.c **** data[4] = (roundf(RELAY_BAT_SIDE_VOLTAGE / 1000.0)); // 8 bit battery voltage 221 .loc 1 100 46 222 006c 394B ldr r3, .L8+16 223 006e 1B68 ldr r3, [r3] 224 0070 1846 mov r0, r3 225 0072 FFF7FEFF bl __aeabi_i2d 226 0076 4FF00002 mov r2, #0 227 007a 374B ldr r3, .L8+20 228 007c FFF7FEFF bl __aeabi_ddiv 229 0080 0246 mov r2, r0 230 0082 0B46 mov r3, r1 231 .loc 1 100 16 232 0084 1046 mov r0, r2 233 0086 1946 mov r1, r3 234 0088 FFF7FEFF bl __aeabi_d2f 235 008c 0346 mov r3, r0 @ float 236 008e 00EE103A vmov s0, r3 237 0092 FFF7FEFF bl roundf 238 0096 F0EE407A vmov.f32 s15, s0 239 .loc 1 100 13 discriminator 1 240 009a FCEEE77A vcvt.u32.f32 s15, s15 241 009e C7ED017A vstr.32 s15, [r7, #4] @ int 242 00a2 3B79 ldrb r3, [r7, #4] 243 00a4 DBB2 uxtb r3, r3 244 00a6 3B75 strb r3, [r7, #20] 101:Core/Src/can.c **** data[5] = (roundf(RELAY_ESC_SIDE_VOLTAGE / 1000.0)); // 8 bit Inverter voltage 245 .loc 1 101 46 246 00a8 2C4B ldr r3, .L8+24 247 00aa 1B68 ldr r3, [r3] 248 00ac 1846 mov r0, r3 249 00ae FFF7FEFF bl __aeabi_i2d 250 00b2 4FF00002 mov r2, #0 251 00b6 284B ldr r3, .L8+20 252 00b8 FFF7FEFF bl __aeabi_ddiv 253 00bc 0246 mov r2, r0 ARM GAS /tmp/ccrYTcjJ.s page 7 254 00be 0B46 mov r3, r1 255 .loc 1 101 16 256 00c0 1046 mov r0, r2 257 00c2 1946 mov r1, r3 258 00c4 FFF7FEFF bl __aeabi_d2f 259 00c8 0346 mov r3, r0 @ float 260 00ca 00EE103A vmov s0, r3 261 00ce FFF7FEFF bl roundf 262 00d2 F0EE407A vmov.f32 s15, s0 263 .loc 1 101 13 discriminator 1 264 00d6 FCEEE77A vcvt.u32.f32 s15, s15 265 00da C7ED017A vstr.32 s15, [r7, #4] @ int 266 00de 3B79 ldrb r3, [r7, #4] 267 00e0 DBB2 uxtb r3, r3 268 00e2 7B75 strb r3, [r7, #21] 102:Core/Src/can.c **** data[6] = (roundf(CURRENT_MEASUREMENT / 1000.0)); // 8 bit Current 269 .loc 1 102 43 270 00e4 1E4B ldr r3, .L8+28 271 00e6 1B68 ldr r3, [r3] 272 00e8 1846 mov r0, r3 273 00ea FFF7FEFF bl __aeabi_i2d 274 00ee 4FF00002 mov r2, #0 275 00f2 194B ldr r3, .L8+20 276 00f4 FFF7FEFF bl __aeabi_ddiv 277 00f8 0246 mov r2, r0 278 00fa 0B46 mov r3, r1 279 .loc 1 102 16 280 00fc 1046 mov r0, r2 281 00fe 1946 mov r1, r3 282 0100 FFF7FEFF bl __aeabi_d2f 283 0104 0346 mov r3, r0 @ float 284 0106 00EE103A vmov s0, r3 285 010a FFF7FEFF bl roundf 286 010e F0EE407A vmov.f32 s15, s0 287 .loc 1 102 13 discriminator 1 288 0112 FCEEE77A vcvt.u32.f32 s15, s15 289 0116 C7ED017A vstr.32 s15, [r7, #4] @ int 290 011a 3B79 ldrb r3, [r7, #4] 291 011c DBB2 uxtb r3, r3 292 011e BB75 strb r3, [r7, #22] 103:Core/Src/can.c **** data[7] = ((highest_temp) >> 4); // 8 bit highest cell temperature 293 .loc 1 103 13 294 0120 BB89 ldrh r3, [r7, #12] 295 0122 1B09 lsrs r3, r3, #4 296 0124 9BB2 uxth r3, r3 297 0126 DBB2 uxtb r3, r3 298 0128 FB75 strb r3, [r7, #23] 104:Core/Src/can.c **** //data[7] = state.error_source; 105:Core/Src/can.c **** ftcan_transmit(CAN_ID_OUT, data, sizeof(data)); 299 .loc 1 105 5 300 012a 07F11003 add r3, r7, #16 301 012e 0822 movs r2, #8 302 0130 1946 mov r1, r3 303 0132 40F20250 movw r0, #1282 304 0136 FFF7FEFF bl ftcan_transmit 305 013a 00E0 b .L4 306 .L7: ARM GAS /tmp/ccrYTcjJ.s page 8 307 .LBE2: 87:Core/Src/can.c **** else { 308 .loc 1 87 5 309 013c 00BF nop 310 .L4: 106:Core/Src/can.c **** } 107:Core/Src/can.c **** } 311 .loc 1 107 1 312 013e 1837 adds r7, r7, #24 313 .cfi_def_cfa_offset 8 314 0140 BD46 mov sp, r7 315 .cfi_def_cfa_register 13 316 @ sp needed 317 0142 80BD pop {r7, pc} 318 .L9: 319 .align 2 320 .L8: 321 0144 00000000 .word can_status_timer 322 0148 00000000 .word state 323 014c 00000000 .word current_powerground_status 324 0150 00000000 .word current_soc 325 0154 00000000 .word RELAY_BAT_SIDE_VOLTAGE 326 0158 00408F40 .word 1083129856 327 015c 00000000 .word RELAY_ESC_SIDE_VOLTAGE 328 0160 00000000 .word CURRENT_MEASUREMENT 329 .cfi_endproc 330 .LFE131: 332 .section .text.can_handle_send_log,"ax",%progbits 333 .align 1 334 .global can_handle_send_log 335 .syntax unified 336 .thumb 337 .thumb_func 339 can_handle_send_log: 340 .LFB132: 108:Core/Src/can.c **** 109:Core/Src/can.c **** void can_handle_send_log(){ 341 .loc 1 109 27 342 .cfi_startproc 343 @ args = 0, pretend = 0, frame = 8 344 @ frame_needed = 1, uses_anonymous_args = 0 345 0000 80B5 push {r7, lr} 346 .cfi_def_cfa_offset 8 347 .cfi_offset 7, -8 348 .cfi_offset 14, -4 349 0002 82B0 sub sp, sp, #8 350 .cfi_def_cfa_offset 16 351 0004 00AF add r7, sp, #0 352 .cfi_def_cfa_register 7 110:Core/Src/can.c **** if (can_log_timer > HAL_GetTick()) 353 .loc 1 110 23 354 0006 FFF7FEFF bl HAL_GetTick 355 000a 0246 mov r2, r0 356 .loc 1 110 21 discriminator 1 357 000c 214B ldr r3, .L15 358 000e 1B68 ldr r3, [r3] 359 .loc 1 110 6 discriminator 1 ARM GAS /tmp/ccrYTcjJ.s page 9 360 0010 9A42 cmp r2, r3 361 0012 3BD3 bcc .L14 362 .LBB3: 111:Core/Src/can.c **** return; 112:Core/Src/can.c **** else { 113:Core/Src/can.c **** uint8_t data[4] = {}; 363 .loc 1 113 13 364 0014 0023 movs r3, #0 365 0016 7B60 str r3, [r7, #4] 114:Core/Src/can.c **** can_log_timer = HAL_GetTick() + CAN_LOGGING_FREQ; 366 .loc 1 114 21 367 0018 FFF7FEFF bl HAL_GetTick 368 001c 0346 mov r3, r0 369 .loc 1 114 35 discriminator 1 370 001e C833 adds r3, r3, #200 371 .loc 1 114 19 discriminator 1 372 0020 1C4A ldr r2, .L15 373 0022 1360 str r3, [r2] 115:Core/Src/can.c **** data[0] = id_to_log; 374 .loc 1 115 13 375 0024 1C4B ldr r3, .L15+4 376 0026 1B78 ldrb r3, [r3] @ zero_extendqisi2 377 0028 3B71 strb r3, [r7, #4] 116:Core/Src/can.c **** data[1] = module.cellVoltages[id_to_log] >> 8; 378 .loc 1 116 34 379 002a 1B4B ldr r3, .L15+4 380 002c 1B78 ldrb r3, [r3] @ zero_extendqisi2 381 002e 1A46 mov r2, r3 382 0030 1A4B ldr r3, .L15+8 383 0032 33F91230 ldrsh r3, [r3, r2, lsl #1] 384 .loc 1 116 13 385 0036 1B12 asrs r3, r3, #8 386 0038 1BB2 sxth r3, r3 387 003a DBB2 uxtb r3, r3 388 003c 7B71 strb r3, [r7, #5] 117:Core/Src/can.c **** data[2] = module.cellVoltages[id_to_log]; 389 .loc 1 117 34 390 003e 164B ldr r3, .L15+4 391 0040 1B78 ldrb r3, [r3] @ zero_extendqisi2 392 0042 1A46 mov r2, r3 393 0044 154B ldr r3, .L15+8 394 0046 33F91230 ldrsh r3, [r3, r2, lsl #1] 395 .loc 1 117 13 396 004a DBB2 uxtb r3, r3 397 004c BB71 strb r3, [r7, #6] 118:Core/Src/can.c **** data[3] = tmp1075_temps[id_to_log] >> 4; 398 .loc 1 118 28 399 004e 124B ldr r3, .L15+4 400 0050 1B78 ldrb r3, [r3] @ zero_extendqisi2 401 0052 1A46 mov r2, r3 402 0054 124B ldr r3, .L15+12 403 0056 33F91230 ldrsh r3, [r3, r2, lsl #1] 404 .loc 1 118 13 405 005a 1B11 asrs r3, r3, #4 406 005c 1BB2 sxth r3, r3 407 005e DBB2 uxtb r3, r3 408 0060 FB71 strb r3, [r7, #7] ARM GAS /tmp/ccrYTcjJ.s page 10 119:Core/Src/can.c **** ftcan_transmit(CAN_ID_LOG, data, 4); 409 .loc 1 119 5 410 0062 3B1D adds r3, r7, #4 411 0064 0422 movs r2, #4 412 0066 1946 mov r1, r3 413 0068 40F20350 movw r0, #1283 414 006c FFF7FEFF bl ftcan_transmit 120:Core/Src/can.c **** id_to_log++; 415 .loc 1 120 14 416 0070 094B ldr r3, .L15+4 417 0072 1B78 ldrb r3, [r3] @ zero_extendqisi2 418 0074 0133 adds r3, r3, #1 419 0076 DAB2 uxtb r2, r3 420 0078 074B ldr r3, .L15+4 421 007a 1A70 strb r2, [r3] 121:Core/Src/can.c **** if (id_to_log == 13) 422 .loc 1 121 19 423 007c 064B ldr r3, .L15+4 424 007e 1B78 ldrb r3, [r3] @ zero_extendqisi2 425 .loc 1 121 8 426 0080 0D2B cmp r3, #13 427 0082 04D1 bne .L10 122:Core/Src/can.c **** id_to_log = 0; 428 .loc 1 122 17 429 0084 044B ldr r3, .L15+4 430 0086 0022 movs r2, #0 431 0088 1A70 strb r2, [r3] 432 008a 00E0 b .L10 433 .L14: 434 .LBE3: 111:Core/Src/can.c **** else { 435 .loc 1 111 5 436 008c 00BF nop 437 .L10: 123:Core/Src/can.c **** } 124:Core/Src/can.c **** /* 125:Core/Src/can.c **** 021E 30 126:Core/Src/can.c **** 0232 50 127:Core/Src/can.c **** 0238 60 128:Core/Src/can.c **** 0246 70 129:Core/Src/can.c **** 0250 80 130:Core/Src/can.c **** 025A 90 131:Core/Src/can.c **** 0264 100 132:Core/Src/can.c **** */ 133:Core/Src/can.c **** } 438 .loc 1 133 1 439 008e 0837 adds r7, r7, #8 440 .cfi_def_cfa_offset 8 441 0090 BD46 mov sp, r7 442 .cfi_def_cfa_register 13 443 @ sp needed 444 0092 80BD pop {r7, pc} 445 .L16: 446 .align 2 447 .L15: 448 0094 00000000 .word can_log_timer 449 0098 00000000 .word id_to_log ARM GAS /tmp/ccrYTcjJ.s page 11 450 009c 00000000 .word module 451 00a0 00000000 .word tmp1075_temps 452 .cfi_endproc 453 .LFE132: 455 .section .text.can_handle_recieve_command,"ax",%progbits 456 .align 1 457 .global can_handle_recieve_command 458 .syntax unified 459 .thumb 460 .thumb_func 462 can_handle_recieve_command: 463 .LFB133: 134:Core/Src/can.c **** 135:Core/Src/can.c **** /* 136:Core/Src/can.c **** can_handle_recieve_command() should only check if the message is valid and then hand it 137:Core/Src/can.c **** to the sm_handle_ams_in() which handles the state machine transition. 138:Core/Src/can.c **** 139:Core/Src/can.c **** This function recieves a command from the Autobox with the CAN ID of 0x501. 140:Core/Src/can.c **** with format of: 141:Core/Src/can.c **** data[0] = target state 142:Core/Src/can.c **** 0x00 STATE_INACTIVE | disconnect power to the ESC of powerground. Send it to return the mvbms to 143:Core/Src/can.c **** 0x01 STATE_READY | connect power to the ESC of powerground and but with no PWM signal. 144:Core/Src/can.c **** 0x02 STATE_ACTIVE | activate powerground at (data[1]) percent. 145:Core/Src/can.c **** 146:Core/Src/can.c **** allowed transitions: 147:Core/Src/can.c **** STATE_INACTIVE -> STATE_READY 148:Core/Src/can.c **** STATE_READY -> STATE_INACTIVE, STATE_ACTIVE 149:Core/Src/can.c **** STATE_ACTIVE -> STATE_INACTIVE, STATE_READY 150:Core/Src/can.c **** */ 151:Core/Src/can.c **** void can_handle_recieve_command(const uint8_t *data){ 464 .loc 1 151 53 465 .cfi_startproc 466 @ args = 0, pretend = 0, frame = 8 467 @ frame_needed = 1, uses_anonymous_args = 0 468 0000 80B5 push {r7, lr} 469 .cfi_def_cfa_offset 8 470 .cfi_offset 7, -8 471 .cfi_offset 14, -4 472 0002 82B0 sub sp, sp, #8 473 .cfi_def_cfa_offset 16 474 0004 00AF add r7, sp, #0 475 .cfi_def_cfa_register 7 476 0006 7860 str r0, [r7, #4] 152:Core/Src/can.c **** if (data[0] == 0x00){ 477 .loc 1 152 11 478 0008 7B68 ldr r3, [r7, #4] 479 000a 1B78 ldrb r3, [r3] @ zero_extendqisi2 480 .loc 1 152 6 481 000c 002B cmp r3, #0 482 000e 03D1 bne .L18 153:Core/Src/can.c **** sm_handle_ams_in(data); 483 .loc 1 153 5 484 0010 7868 ldr r0, [r7, #4] 485 0012 FFF7FEFF bl sm_handle_ams_in 154:Core/Src/can.c **** } else if (data[0] == 0x01 && data[1] == 0x00){ 155:Core/Src/can.c **** sm_handle_ams_in(data); 156:Core/Src/can.c **** } else if (data[0] == 0x02 && data[1] <= 100) { ARM GAS /tmp/ccrYTcjJ.s page 12 157:Core/Src/can.c **** sm_handle_ams_in(data); 158:Core/Src/can.c **** } else if (data[0] == 0xF0 && data[1] == 0x00) { 159:Core/Src/can.c **** sm_handle_ams_in(data); 160:Core/Src/can.c **** } else if (data[0] == 0xF1 && data[1] == 0x00) { 161:Core/Src/can.c **** sm_handle_ams_in(data); 162:Core/Src/can.c **** } else if (data[0] == 0xFF && data[1] == 0x00) { 163:Core/Src/can.c **** sm_handle_ams_in(data); 164:Core/Src/can.c **** } 165:Core/Src/can.c **** } 486 .loc 1 165 1 487 0016 40E0 b .L24 488 .L18: 154:Core/Src/can.c **** } else if (data[0] == 0x01 && data[1] == 0x00){ 489 .loc 1 154 18 490 0018 7B68 ldr r3, [r7, #4] 491 001a 1B78 ldrb r3, [r3] @ zero_extendqisi2 154:Core/Src/can.c **** } else if (data[0] == 0x01 && data[1] == 0x00){ 492 .loc 1 154 13 493 001c 012B cmp r3, #1 494 001e 08D1 bne .L20 154:Core/Src/can.c **** } else if (data[0] == 0x01 && data[1] == 0x00){ 495 .loc 1 154 37 discriminator 1 496 0020 7B68 ldr r3, [r7, #4] 497 0022 0133 adds r3, r3, #1 498 0024 1B78 ldrb r3, [r3] @ zero_extendqisi2 154:Core/Src/can.c **** } else if (data[0] == 0x01 && data[1] == 0x00){ 499 .loc 1 154 30 discriminator 1 500 0026 002B cmp r3, #0 501 0028 03D1 bne .L20 155:Core/Src/can.c **** } else if (data[0] == 0x02 && data[1] <= 100) { 502 .loc 1 155 5 503 002a 7868 ldr r0, [r7, #4] 504 002c FFF7FEFF bl sm_handle_ams_in 505 0030 33E0 b .L19 506 .L20: 156:Core/Src/can.c **** sm_handle_ams_in(data); 507 .loc 1 156 18 508 0032 7B68 ldr r3, [r7, #4] 509 0034 1B78 ldrb r3, [r3] @ zero_extendqisi2 156:Core/Src/can.c **** sm_handle_ams_in(data); 510 .loc 1 156 13 511 0036 022B cmp r3, #2 512 0038 08D1 bne .L21 156:Core/Src/can.c **** sm_handle_ams_in(data); 513 .loc 1 156 37 discriminator 1 514 003a 7B68 ldr r3, [r7, #4] 515 003c 0133 adds r3, r3, #1 516 003e 1B78 ldrb r3, [r3] @ zero_extendqisi2 156:Core/Src/can.c **** sm_handle_ams_in(data); 517 .loc 1 156 30 discriminator 1 518 0040 642B cmp r3, #100 519 0042 03D8 bhi .L21 157:Core/Src/can.c **** } else if (data[0] == 0xF0 && data[1] == 0x00) { 520 .loc 1 157 5 521 0044 7868 ldr r0, [r7, #4] 522 0046 FFF7FEFF bl sm_handle_ams_in 523 004a 26E0 b .L19 ARM GAS /tmp/ccrYTcjJ.s page 13 524 .L21: 158:Core/Src/can.c **** sm_handle_ams_in(data); 525 .loc 1 158 18 526 004c 7B68 ldr r3, [r7, #4] 527 004e 1B78 ldrb r3, [r3] @ zero_extendqisi2 158:Core/Src/can.c **** sm_handle_ams_in(data); 528 .loc 1 158 13 529 0050 F02B cmp r3, #240 530 0052 08D1 bne .L22 158:Core/Src/can.c **** sm_handle_ams_in(data); 531 .loc 1 158 37 discriminator 1 532 0054 7B68 ldr r3, [r7, #4] 533 0056 0133 adds r3, r3, #1 534 0058 1B78 ldrb r3, [r3] @ zero_extendqisi2 158:Core/Src/can.c **** sm_handle_ams_in(data); 535 .loc 1 158 30 discriminator 1 536 005a 002B cmp r3, #0 537 005c 03D1 bne .L22 159:Core/Src/can.c **** } else if (data[0] == 0xF1 && data[1] == 0x00) { 538 .loc 1 159 5 539 005e 7868 ldr r0, [r7, #4] 540 0060 FFF7FEFF bl sm_handle_ams_in 541 0064 19E0 b .L19 542 .L22: 160:Core/Src/can.c **** sm_handle_ams_in(data); 543 .loc 1 160 18 544 0066 7B68 ldr r3, [r7, #4] 545 0068 1B78 ldrb r3, [r3] @ zero_extendqisi2 160:Core/Src/can.c **** sm_handle_ams_in(data); 546 .loc 1 160 13 547 006a F12B cmp r3, #241 548 006c 08D1 bne .L23 160:Core/Src/can.c **** sm_handle_ams_in(data); 549 .loc 1 160 37 discriminator 1 550 006e 7B68 ldr r3, [r7, #4] 551 0070 0133 adds r3, r3, #1 552 0072 1B78 ldrb r3, [r3] @ zero_extendqisi2 160:Core/Src/can.c **** sm_handle_ams_in(data); 553 .loc 1 160 30 discriminator 1 554 0074 002B cmp r3, #0 555 0076 03D1 bne .L23 161:Core/Src/can.c **** } else if (data[0] == 0xFF && data[1] == 0x00) { 556 .loc 1 161 5 557 0078 7868 ldr r0, [r7, #4] 558 007a FFF7FEFF bl sm_handle_ams_in 559 007e 0CE0 b .L19 560 .L23: 162:Core/Src/can.c **** sm_handle_ams_in(data); 561 .loc 1 162 18 562 0080 7B68 ldr r3, [r7, #4] 563 0082 1B78 ldrb r3, [r3] @ zero_extendqisi2 162:Core/Src/can.c **** sm_handle_ams_in(data); 564 .loc 1 162 13 565 0084 FF2B cmp r3, #255 566 0086 08D1 bne .L24 162:Core/Src/can.c **** sm_handle_ams_in(data); 567 .loc 1 162 37 discriminator 1 ARM GAS /tmp/ccrYTcjJ.s page 14 568 0088 7B68 ldr r3, [r7, #4] 569 008a 0133 adds r3, r3, #1 570 008c 1B78 ldrb r3, [r3] @ zero_extendqisi2 162:Core/Src/can.c **** sm_handle_ams_in(data); 571 .loc 1 162 30 discriminator 1 572 008e 002B cmp r3, #0 573 0090 03D1 bne .L24 163:Core/Src/can.c **** } 574 .loc 1 163 5 575 0092 7868 ldr r0, [r7, #4] 576 0094 FFF7FEFF bl sm_handle_ams_in 577 .loc 1 165 1 578 0098 FFE7 b .L24 579 .L19: 580 .L24: 581 009a 00BF nop 582 009c 0837 adds r7, r7, #8 583 .cfi_def_cfa_offset 8 584 009e BD46 mov sp, r7 585 .cfi_def_cfa_register 13 586 @ sp needed 587 00a0 80BD pop {r7, pc} 588 .cfi_endproc 589 .LFE133: 591 .section .text.can_handle_dump,"ax",%progbits 592 .align 1 593 .global can_handle_dump 594 .syntax unified 595 .thumb 596 .thumb_func 598 can_handle_dump: 599 .LFB134: 166:Core/Src/can.c **** 167:Core/Src/can.c **** void can_handle_dump() { 600 .loc 1 167 24 601 .cfi_startproc 602 @ args = 0, pretend = 0, frame = 16 603 @ frame_needed = 1, uses_anonymous_args = 0 604 0000 80B5 push {r7, lr} 605 .cfi_def_cfa_offset 8 606 .cfi_offset 7, -8 607 .cfi_offset 14, -4 608 0002 84B0 sub sp, sp, #16 609 .cfi_def_cfa_offset 24 610 0004 00AF add r7, sp, #0 611 .cfi_def_cfa_register 7 168:Core/Src/can.c **** uint8_t* data = {}; 612 .loc 1 168 12 613 0006 0023 movs r3, #0 614 0008 BB60 str r3, [r7, #8] 169:Core/Src/can.c **** HAL_StatusTypeDef status = HAL_OK; 615 .loc 1 169 21 616 000a 0023 movs r3, #0 617 000c FB71 strb r3, [r7, #7] 170:Core/Src/can.c **** while (status == HAL_OK){ 618 .loc 1 170 9 619 000e 22E0 b .L26 ARM GAS /tmp/ccrYTcjJ.s page 15 620 .L29: 171:Core/Src/can.c **** HAL_Delay(2); 621 .loc 1 171 5 622 0010 0220 movs r0, #2 623 0012 FFF7FEFF bl HAL_Delay 172:Core/Src/can.c **** eeprom_read(data, 62); 624 .loc 1 172 5 625 0016 3E21 movs r1, #62 626 0018 B868 ldr r0, [r7, #8] 627 001a FFF7FEFF bl eeprom_read 628 .LBB4: 173:Core/Src/can.c **** for (int i = 0; i < (EEPROM_MEMORY_SIZE-8)/8; i += 8) { 629 .loc 1 173 14 630 001e 0023 movs r3, #0 631 0020 FB60 str r3, [r7, #12] 632 .loc 1 173 5 633 0022 0BE0 b .L27 634 .L28: 174:Core/Src/can.c **** ftcan_transmit(CAN_ID_OUT, &data[i], 8); 635 .loc 1 174 7 636 0024 FB68 ldr r3, [r7, #12] 637 .loc 1 174 34 638 0026 BA68 ldr r2, [r7, #8] 639 0028 1344 add r3, r3, r2 640 .loc 1 174 7 641 002a 0822 movs r2, #8 642 002c 1946 mov r1, r3 643 002e 40F20250 movw r0, #1282 644 0032 FFF7FEFF bl ftcan_transmit 173:Core/Src/can.c **** for (int i = 0; i < (EEPROM_MEMORY_SIZE-8)/8; i += 8) { 645 .loc 1 173 53 discriminator 3 646 0036 FB68 ldr r3, [r7, #12] 647 0038 0833 adds r3, r3, #8 648 003a FB60 str r3, [r7, #12] 649 .L27: 173:Core/Src/can.c **** for (int i = 0; i < (EEPROM_MEMORY_SIZE-8)/8; i += 8) { 650 .loc 1 173 23 discriminator 1 651 003c FB68 ldr r3, [r7, #12] 652 003e 43F6FE72 movw r2, #16382 653 0042 9342 cmp r3, r2 654 0044 EEDD ble .L28 655 .LBE4: 175:Core/Src/can.c **** } 176:Core/Src/can.c **** ftcan_transmit(CAN_ID_OUT, &data[56], 6); 656 .loc 1 176 32 657 0046 BB68 ldr r3, [r7, #8] 658 0048 3833 adds r3, r3, #56 659 .loc 1 176 5 660 004a 0622 movs r2, #6 661 004c 1946 mov r1, r3 662 004e 40F20250 movw r0, #1282 663 0052 FFF7FEFF bl ftcan_transmit 664 .L26: 170:Core/Src/can.c **** HAL_Delay(2); 665 .loc 1 170 17 666 0056 FB79 ldrb r3, [r7, #7] @ zero_extendqisi2 667 0058 002B cmp r3, #0 ARM GAS /tmp/ccrYTcjJ.s page 16 668 005a D9D0 beq .L29 177:Core/Src/can.c **** } 178:Core/Src/can.c **** read_address = 0; 669 .loc 1 178 16 670 005c 034B ldr r3, .L30 671 005e 0022 movs r2, #0 672 0060 1A60 str r2, [r3] 179:Core/Src/can.c **** } 673 .loc 1 179 1 674 0062 00BF nop 675 0064 1037 adds r7, r7, #16 676 .cfi_def_cfa_offset 8 677 0066 BD46 mov sp, r7 678 .cfi_def_cfa_register 13 679 @ sp needed 680 0068 80BD pop {r7, pc} 681 .L31: 682 006a 00BF .align 2 683 .L30: 684 006c 00000000 .word read_address 685 .cfi_endproc 686 .LFE134: 688 .section .text.ftcan_msg_received_cb,"ax",%progbits 689 .align 1 690 .global ftcan_msg_received_cb 691 .syntax unified 692 .thumb 693 .thumb_func 695 ftcan_msg_received_cb: 696 .LFB135: 180:Core/Src/can.c **** 181:Core/Src/can.c **** /* 182:Core/Src/can.c **** implements the _weak method ftcan_msg_recieved_cb() which throws an interrupt when a CAN message is 183:Core/Src/can.c **** it only checks if the id is and datalen is correct thans hands data over to can_handle_recieve_comm 184:Core/Src/can.c **** 185:Core/Src/can.c **** in MXCUBE under CAN NVIC settings "USB low priority or CAN_RX0 interrupts" has to be on 186:Core/Src/can.c **** */ 187:Core/Src/can.c **** void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data){ 697 .loc 1 187 77 698 .cfi_startproc 699 @ args = 0, pretend = 0, frame = 16 700 @ frame_needed = 1, uses_anonymous_args = 0 701 0000 80B5 push {r7, lr} 702 .cfi_def_cfa_offset 8 703 .cfi_offset 7, -8 704 .cfi_offset 14, -4 705 0002 84B0 sub sp, sp, #16 706 .cfi_def_cfa_offset 24 707 0004 00AF add r7, sp, #0 708 .cfi_def_cfa_register 7 709 0006 0346 mov r3, r0 710 0008 B960 str r1, [r7, #8] 711 000a 7A60 str r2, [r7, #4] 712 000c FB81 strh r3, [r7, #14] @ movhi 188:Core/Src/can.c **** if (programming_mode == 1){ 713 .loc 1 188 24 714 000e 1F4B ldr r3, .L37 ARM GAS /tmp/ccrYTcjJ.s page 17 715 0010 1B78 ldrb r3, [r3] @ zero_extendqisi2 716 .loc 1 188 6 717 0012 002B cmp r3, #0 718 0014 03D0 beq .L33 189:Core/Src/can.c **** can_handle_recieve_command(data); 719 .loc 1 189 5 720 0016 7868 ldr r0, [r7, #4] 721 0018 FFF7FEFF bl can_handle_recieve_command 190:Core/Src/can.c **** return; 722 .loc 1 190 5 723 001c 32E0 b .L32 724 .L33: 191:Core/Src/can.c **** } 192:Core/Src/can.c **** 193:Core/Src/can.c **** if (id == 0x501 && datalen == 2){ 725 .loc 1 193 6 726 001e FB89 ldrh r3, [r7, #14] 727 0020 40F20152 movw r2, #1281 728 0024 9342 cmp r3, r2 729 0026 2DD1 bne .L32 730 .loc 1 193 19 discriminator 1 731 0028 BB68 ldr r3, [r7, #8] 732 002a 022B cmp r3, #2 733 002c 2AD1 bne .L32 194:Core/Src/can.c **** can_timeout_timer = HAL_GetTick() + CAN_TIMEOUT; 734 .loc 1 194 25 735 002e FFF7FEFF bl HAL_GetTick 736 0032 0346 mov r3, r0 737 .loc 1 194 39 discriminator 1 738 0034 03F59C53 add r3, r3, #4992 739 0038 0833 adds r3, r3, #8 740 .loc 1 194 23 discriminator 1 741 003a 154A ldr r2, .L37+4 742 003c 1360 str r3, [r2] 195:Core/Src/can.c **** if (state.current_state == STATE_ERROR){ 743 .loc 1 195 14 744 003e 154B ldr r3, .L37+8 745 0040 1B78 ldrb r3, [r3] @ zero_extendqisi2 746 .loc 1 195 8 747 0042 072B cmp r3, #7 748 0044 05D1 bne .L35 196:Core/Src/can.c **** last_message[0] = 0; 749 .loc 1 196 23 750 0046 144B ldr r3, .L37+12 751 0048 0022 movs r2, #0 752 004a 1A70 strb r2, [r3] 197:Core/Src/can.c **** last_message[1] = 0; 753 .loc 1 197 23 754 004c 124B ldr r3, .L37+12 755 004e 0022 movs r2, #0 756 0050 5A70 strb r2, [r3, #1] 757 .L35: 198:Core/Src/can.c **** } 199:Core/Src/can.c **** if (last_message[0] != data[0] || last_message[1] != data[1]){ 758 .loc 1 199 21 759 0052 114B ldr r3, .L37+12 760 0054 1A78 ldrb r2, [r3] @ zero_extendqisi2 ARM GAS /tmp/ccrYTcjJ.s page 18 761 .loc 1 199 25 762 0056 7B68 ldr r3, [r7, #4] 763 0058 1B78 ldrb r3, [r3] @ zero_extendqisi2 764 .loc 1 199 8 765 005a 9A42 cmp r2, r3 766 005c 06D1 bne .L36 767 .loc 1 199 51 discriminator 1 768 005e 0E4B ldr r3, .L37+12 769 0060 5A78 ldrb r2, [r3, #1] @ zero_extendqisi2 770 .loc 1 199 62 discriminator 1 771 0062 7B68 ldr r3, [r7, #4] 772 0064 0133 adds r3, r3, #1 773 .loc 1 199 55 discriminator 1 774 0066 1B78 ldrb r3, [r3] @ zero_extendqisi2 775 .loc 1 199 36 discriminator 1 776 0068 9A42 cmp r2, r3 777 006a 0BD0 beq .L32 778 .L36: 200:Core/Src/can.c **** last_message[0] = data[0]; 779 .loc 1 200 29 780 006c 7B68 ldr r3, [r7, #4] 781 006e 1A78 ldrb r2, [r3] @ zero_extendqisi2 782 .loc 1 200 23 783 0070 094B ldr r3, .L37+12 784 0072 1A70 strb r2, [r3] 201:Core/Src/can.c **** last_message[1] = data[1]; 785 .loc 1 201 29 786 0074 7B68 ldr r3, [r7, #4] 787 0076 0133 adds r3, r3, #1 788 0078 1A78 ldrb r2, [r3] @ zero_extendqisi2 789 .loc 1 201 23 790 007a 074B ldr r3, .L37+12 791 007c 5A70 strb r2, [r3, #1] 202:Core/Src/can.c **** can_handle_recieve_command(data); 792 .loc 1 202 7 793 007e 7868 ldr r0, [r7, #4] 794 0080 FFF7FEFF bl can_handle_recieve_command 795 .L32: 203:Core/Src/can.c **** } 204:Core/Src/can.c **** } 205:Core/Src/can.c **** } 796 .loc 1 205 1 797 0084 1037 adds r7, r7, #16 798 .cfi_def_cfa_offset 8 799 0086 BD46 mov sp, r7 800 .cfi_def_cfa_register 13 801 @ sp needed 802 0088 80BD pop {r7, pc} 803 .L38: 804 008a 00BF .align 2 805 .L37: 806 008c 00000000 .word programming_mode 807 0090 00000000 .word can_timeout_timer 808 0094 00000000 .word state 809 0098 00000000 .word last_message 810 .cfi_endproc 811 .LFE135: ARM GAS /tmp/ccrYTcjJ.s page 19 813 .text 814 .Letext0: 815 .file 2 "/nix/store/p8vkamc9b2vlibs9aw76vnasdbifhcbm-gcc-arm-embedded-13.2.rel1/arm-none-eabi/incl 816 .file 3 "/nix/store/p8vkamc9b2vlibs9aw76vnasdbifhcbm-gcc-arm-embedded-13.2.rel1/arm-none-eabi/incl 817 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" 818 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" 819 .file 6 "/nix/store/p8vkamc9b2vlibs9aw76vnasdbifhcbm-gcc-arm-embedded-13.2.rel1/lib/gcc/arm-none-e 820 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" 821 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h" 822 .file 9 "Core/Inc/ADBMS_LL_Driver.h" 823 .file 10 "Core/Inc/ADBMS_Abstraction.h" 824 .file 11 "Core/Inc/AMS_HighLevel.h" 825 .file 12 "Core/Inc/soc_estimation.h" 826 .file 13 "Core/Inc/TMP1075.h" 827 .file 14 "Core/Inc/eeprom.h" 828 .file 15 "Core/Inc/PWM_control.h" 829 .file 16 "Core/Inc/state_machine.h" 830 .file 17 "Core/Inc/can.h" 831 .file 18 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" 832 .file 19 "Core/Lib/can-halal/can-halal.h" 833 .file 20 "/nix/store/p8vkamc9b2vlibs9aw76vnasdbifhcbm-gcc-arm-embedded-13.2.rel1/arm-none-eabi/inc ARM GAS /tmp/ccrYTcjJ.s page 20 DEFINED SYMBOLS *ABS*:00000000 can.c /tmp/ccrYTcjJ.s:24 .bss.id_to_log:00000000 id_to_log /tmp/ccrYTcjJ.s:25 .bss.id_to_log:00000000 $d /tmp/ccrYTcjJ.s:31 .bss.last_message:00000000 last_message /tmp/ccrYTcjJ.s:28 .bss.last_message:00000000 $d /tmp/ccrYTcjJ.s:38 .bss.can_status_timer:00000000 can_status_timer /tmp/ccrYTcjJ.s:35 .bss.can_status_timer:00000000 $d /tmp/ccrYTcjJ.s:45 .bss.can_log_timer:00000000 can_log_timer /tmp/ccrYTcjJ.s:42 .bss.can_log_timer:00000000 $d /tmp/ccrYTcjJ.s:52 .bss.can_timeout_timer:00000000 can_timeout_timer /tmp/ccrYTcjJ.s:49 .bss.can_timeout_timer:00000000 $d /tmp/ccrYTcjJ.s:55 .text.can_init:00000000 $t /tmp/ccrYTcjJ.s:61 .text.can_init:00000000 can_init /tmp/ccrYTcjJ.s:131 .text.can_init:00000060 $d /tmp/ccrYTcjJ.s:143 .text.can_handle_send_status:00000000 $t /tmp/ccrYTcjJ.s:149 .text.can_handle_send_status:00000000 can_handle_send_status /tmp/ccrYTcjJ.s:321 .text.can_handle_send_status:00000144 $d /tmp/ccrYTcjJ.s:333 .text.can_handle_send_log:00000000 $t /tmp/ccrYTcjJ.s:339 .text.can_handle_send_log:00000000 can_handle_send_log /tmp/ccrYTcjJ.s:448 .text.can_handle_send_log:00000094 $d /tmp/ccrYTcjJ.s:456 .text.can_handle_recieve_command:00000000 $t /tmp/ccrYTcjJ.s:462 .text.can_handle_recieve_command:00000000 can_handle_recieve_command /tmp/ccrYTcjJ.s:592 .text.can_handle_dump:00000000 $t /tmp/ccrYTcjJ.s:598 .text.can_handle_dump:00000000 can_handle_dump /tmp/ccrYTcjJ.s:684 .text.can_handle_dump:0000006c $d /tmp/ccrYTcjJ.s:689 .text.ftcan_msg_received_cb:00000000 $t /tmp/ccrYTcjJ.s:695 .text.ftcan_msg_received_cb:00000000 ftcan_msg_received_cb /tmp/ccrYTcjJ.s:806 .text.ftcan_msg_received_cb:0000008c $d UNDEFINED SYMBOLS ftcan_init ftcan_add_filter HAL_GetTick __aeabi_i2d __aeabi_ddiv __aeabi_d2f sm_check_battery_temperature roundf ftcan_transmit state current_powerground_status current_soc RELAY_BAT_SIDE_VOLTAGE RELAY_ESC_SIDE_VOLTAGE CURRENT_MEASUREMENT module tmp1075_temps sm_handle_ams_in HAL_Delay eeprom_read read_address programming_mode