MF9BF506N DMAC

Started by tha, February 18, 2015, 08:36:17 AM

Previous topic - Next topic

tha

ขอแก้ตัวแปรตรงนี้หน่อย ควรใช้ตัวแปรอื่นมารับค่า adc ตรงนี้เพราะถ้าใช้ตัวแปรเดิมอาจโดนทับกลางทางได้ (ประกาศตัวแปร adc_value0, adc_value1 เพิ่มมา)

    adc_value0 = (adc_value[0]>>20)*3300/4095;
    result[0] = (adc_value0/1000) + '0';
    result[1] = '.';
    result[2] = (adc_value0%1000/100) + '0';
    result[3] = (adc_value0%100/10) + '0';
    result[4] = adc_value0%10 + '0';

tha

ว่าจะทำ uart dma เลยศึกษา uart ในหนังสือ ARM Fujitsu ก่อน เอาตัวอย่างอาจารย์เขามาทำด้วย แปลงเป็น keil armcc แต่กลับแสดงเป็นตัวอักษรแปลกๆใน hyperterminal ไม่รู้เป็นที่ hardware หรือ software ท่านใดว่างช่วยเช็คดูให้หน่อย (เคยทำตามหนังสือนานมาแล้วยังได้อยู่เลย)
https://mega.co.nz/#!4V9HHTZC!w2_1UtJIQe-6W9HZryvts1_PY_wlZjrW7hc-MjmbRkM


tha

เจอข้อผิดพลาดแล้วครับ เกิดจาก human error  เอง ไปตั้งบ็อตเรตที่ hyperterminal เป็น 9600 นี่เอง  ;D ;D ;D

tha

ลองทำโปรแกรม uart บน EmIDE ดู ก็สามารถทำได้
https://mega.co.nz/#!RJdgGKaI!xS78WfRdAQiYeE5BaXBNVSd3WTGxihNC4T8M2FB9Ti0
เอาไฟล์ startup_mb9bf50x.s กับไฟล์ MB9BF506_rom.ld ของหนังสือ ARM Fujitsu มาใส่แทน

ที่ไฟล์ startup_mb9bf50x.s แก้

.if (Debug_RAM) ไปเป็น .if (Debug_RAM==1) ไม่ทราบว่าถูกต้องหรือเปล่าแต่ถ้าไม่แก้จะ error ถ้าเป็นตัวอย่าง keil gcc ในหนังสือจะกำหนด Debug_RAM= 0 ไว้ตรงนี้



linker script กำหนดไว้ตรงนี้



สามารถ debug ด้วย j-link โดย j-link GDB Debugger

tha

ลองทำโปรแกรม adc dmac 1 channel มาทำบน EmIDE ดู ก็สามารถทำได้ แต่จะมีปัญหาการ delay โดย systick จะช้าผิดปกติ คาดว่าสาเหตคงมาจาก clock

https://mega.co.nz/#!9VN1TCgT!P2rB7tVWzQrNtP7EVMQmTcyGABzZ_RjNSmk_FsVakvc

เดี๋ยวจะลองเอาไฟล์ system_mb9bf50x.c, system_mb9bf50x.h อีกแบบมาใส่แทนเปรียบเทียบดู

tha

ที่ systick delay ช้ามากคงมาจาก compiler มองไม่เห็น   uint32_t SystemCoreClock = __HCLK; ในไฟล์ system_mb9bf50x.c
ผมเลยแก้ใขโดยตัด SystemInit ที start main: ในไฟล์ startup_mb9bf50x.s ออก
ตัด //extern uint32_t SystemCoreClock;  ออกจากไฟล์ system_mb9bf50x.h
แล้วไปใส่  SystemInit(); กับ uint32_t SystemCoreClock = __HCLK; ในไฟล์  main.c แทน

ตั้งค่า PLLN = 13 ให้ได้ clock = 52MHz ซึ่งน้อยกว่า 54MHz ซึ่งเป็นค่า clock สูงสุดที่ adc module จะทำได้ ดูรายละเอียดใน ADC characteristic ใน data sheet
//#define PLL_CTL2_Val          0x00000013    // <<< Define PLL_CTL2 here
#define PLL_CTL2_Val          0x0000000C    // <<< Define PLL_CTL2 here

ลด pllclkmin จาก 60000000 ลงมา 40000000 เพื่อให้คอมไพล์ผ่าน
//#define __PLLCLKMIN   ( 60000000UL)
#define __PLLCLKMIN   ( 40000000UL)

https://mega.co.nz/#!8VkAUaIS!CV-BXJmcsOvbrvj3-hNJCIpOnkTU8nbe4yy2EkqC4Fg

สามารถดีบักดูค่า SystemCoreClock ได้  :)


tha

ลอง 2 channel เอา  uint32_t SystemCoreClock = __HCLK; มาใส่ที่ main อย่างเดียวก็ได้

https://mega.co.nz/#!8c9T3Q7a!Hv3MCQUp9mEfvR6cRrunRqbrJajrTGo_ds9zoS6d6NQ