"start up file มีไว้ทำอะไรมันทำงานยังไง"
ปกติ arm cortex m ก็จะเริ่มทำงานเหมือนกับ mcu ตัวอื่นๆ คือเริ่ม execute จาก address 0x00000000 (ใส่ offset ได้)
แต่ในบาง mcu นั้น address 0x00000000 นั้นจะเป็น address ที่ไม่ได้มี memory อยู่จริง เป็นแค่ address ที่ใช้ในการ
remap เท่านั้น สังเกตง่ายๆ mcu พวกนี้จะมี pin boot0, boot1 เช่น stm32 ถ้าต่อ pin boot0 ลง gnd จะ remap
address 0x00000000 ไปที่ address 0x08000000 ซึ่งเป็น internal flash ถ้าต่อ VDD จะ remap address ไปที่
0x20000000 ซึ่งก็คือ internal ram ถ้ามี boot1 ก็ remap ไป external ram ได้ด้วย แต่สำหรับ kinetis ผมดูจาก code
ของ k60 แล้วน่าจะไม่มีการ remap address เพราะมัน flash code ลง address 0x00000000 โดยตรงเลย

เพราะฉะนั้น address 0x00000000 ที่กล่าวถึงนี้อาจเป็น address แรกของ flash หรือ ram ก็ได้ ตามที่
mcu remap ไป
arm cortex m เริ่ม execute ที่ address 0x00000000 ก็จริง แต่มันก็มีบางอย่างที่ต้องทำเป็นอันดับแรกคือ
1. กำหนดค่า stack pointer - เมื่อเริ่มจ่ายไฟ arm cortex m core เริ่มทำงาน มันจะ fetch ข้อมูลจาก address
0x00000000 ขนาด 4 Bytes เอาไปใส่ใน stack pointer register (R13)
2. กำหนดค่า program counter - หลังจากกำหนดค่า stack pointer ก็จะ fetch ข้อมูลจาก address
0x00000004 ขนาด 4 Bytes เอาไปใส่ใน program counter register (R15)
ค่าใน address 0x00000004 เรามักจะเรียกกันว่า reset vector มันเป็นค่า address ของ function
แรกที่จะเริ่มทำงาน หรือเวลาทำการ software reset มันก็จะ jump มาที่ function นี้เช่นกัน บางทีอาจชื่อว่า startup
อะไรประมาณนี้ ส่วน address 0x00000008 และต่อจากนี้ก็จะเป็น interrupt vector อื่นๆ ต่อไป
โดยประมาณ 15 - 16 ตัวแรกจะเป็นของ arm cortex m core หลังจากนั้นจะเป็นของ peripheral
ก็จะแตกต่างไปตามแต่ละชิป

ในทางปฏิบัติการเขียน vector table ก็คือเขียน array ของ address ของ function interrupt ต่างๆ
แล้วก็สั่งให้ linker เอาตัวแปรนี้ไปไว้ที่ address 0x00000000 หรือ address แรกของ flash ก็ว่าไป

3. เริ่มทำงาน - cpu ก็จะเริ่มประมวลผลตาม code ตำแหน่งที่ program counter ชี้ไป ส่วนใหญ่ code ตรงนี้ก็จะทำการ initialize
ค่าที่สำคัญๆ เช่น master clock ของระบบ, init external ram (ถ้ามี), กำหนดค่าเริ่มต้นของพวกตัวแปร global,
เรียก constructor ของ static object กรณีใช้ c++ หลังจากนั้นค่อยเรียก function main

ปล. ผมไม่มีบอร์ด kinetis นะ ในรูป sim บน IAR เอา โดยเอา code มาจาก demo ของ FreeRTOS บนบอร์ด Kinetis K60 Tower
ปล.2 ส่วนการขับ GPIO ลองดดูลิ้งนี้
https://community.nxp.com/thread/353036 ผมว่าน่าจะลองผิดลองถูกได้ไม่ยาก
ตอนนี้อย่าพึ่งไป create project เองแบบเริ่มจาก 0 ลองเอา project ตัวอย่างมาตัด code ออก เหลือแต่ main (ยังไม่ต้องไปยุ่งกับ
startup files ใช้ default ของเค้าไปนั่นแหละ ปกติเค้ามักจะตั้งปรับ clock สูงสุดไว้แล้ว) แล้วลองเขียนคุม peripheral ดูก่อน
เรื่อง peripheral คงต้องพึ่ง datasheet และ google เพราะ kinetis มันไม่เป็นที่แพร่หลายในไทย พอเริ่มใช้ peripheral เป็นแล้ว
ค่อยลองพวก interrupt ต่อ เป็นแล้วค่อยไปลองเรื่องการปรับ clock