[Help] Cấu Hình Dao Động Cho LM3S9B96

lee_trieu

Gà con
Chào Mọi người!!!
Em mới tìm hiểu dòng Stellaris của TI không lâu, đang dùng KIT DK-LM3S9B96 để thực hành. Anh chị cho em hỏi cách cấu hình dao động nội để KIT hoạt động.
Cho em hỏi là KIT này chạy với tần số tối đa là bao nhiêu???
Em muốn cấu hình dao động nội 1Mhz thì làm như thế nào ạ >>>????
Em có viết một đoạn code dùng Systick để nháy LED nhưng chưa kiểm soát được tấn số dao động, mong anh chị và các bạn giúp đỡ !!!
Em xin cảm ơn!!!!:)
PHP:
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.c"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "inc/hw_ints.h"
#include "inc/hw_gpio.h"
#include "driverlib/timer.h"
#include "driverlib/systick.h"
 
#include "LM3S9B96.h"
void cfg_PERIPHERAL(){
// enable PORT D
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
}
void cfg_IN_OUT(){
// PORTD.2 OUTPUT 
  GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_2);
}
 
void Init_SysTick (void){
    // Configure the SysTick counter.
    SysTickPeriodSet(SysCtlClockGet()*10);
    // Configure the SysTick interrupt
    SysTickIntEnable();
    // Enable the SysTick counter.
    SysTickEnable();
}
 
void SysTick_Handler (void){
 
    // Set the tick flag
    GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2, ~GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_2));
}
 
int main(){
IntMasterDisable();
  cfg_PERIPHERAL();
cfg_IN_OUT();
Init_SysTick();
IntMasterEnable();
while(true){}
}
 

lee_trieu

Gà con
Anh có config clock của chip chưa ạ?
Vẫn đề này mình đang vướn mắc đấy !!:-( Vẫn chưa config được Clock, code trên mình dùng clock mặc định luôn, không biết cụ thể là bao nhiêu nữa:5cool_sweat:
 

cowboyhere

Cố Vấn CLB
Staff member
để coi tần số tối đa của chip bạn xem trong datasheet
sử dụng PLL với thạch anh nội hoặc ngoại tần số nhân lên khoảng 400Mhz rồi chia xuống tuỳ programer, max system clock khoảng 80Mhz
SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
VD trên config clock system 16Mhz bằng thư viện stellaris ware, bạn xem thêm trong document technical để config theo ý mình
còn nháy led dùng delay: SysCtlDelay(SysCtlClockGet()/10); cho delay 0.1s hàm SysCtlClockGet sẽ giúp ích khi tần số clock thay đổi, mình ko cần tính toán lại thời gian delay.
nháy led dùng timer bạn xem trong code example
 

lee_trieu

Gà con
sử dụng PLL với thạch anh nội hoặc ngoại tần số nhân lên khoảng 400Mhz rồi chia xuống tuỳ programer
Có thể nói rõ hơn giúp mình chỗ này không ạ:-(Sao phải nhân lên 400Mhz rồi chia xuống ạ????:5cool_sweat:Cảm ơn cowboyhere nhiều !!:)
 

Manhdd

Cố Vấn CLB
Staff member
Có thể nói rõ hơn giúp mình chỗ này không ạ:-(Sao phải nhân lên 400Mhz rồi chia xuống ạ????:5cool_sweat:Cảm ơn cowboyhere nhiều !!:)
Nhớ là qua PLL thì nó cứ nhân lên 400 Mhz thôi. Còn để cho core chạy được thì phải chia xuống chí ít là 80 MHz :)
 

lee_trieu

Gà con
Nhớ là qua PLL thì nó cứ nhân lên 400 Mhz thôi. Còn để cho core chạy được thì phải chia xuống chí ít là 80 MHz :)
Vậy như bài ở trên em có thể sửa 16MHz trong code bên dưới thành các tần số khác như msp430 không anh????:-(
PHP:
SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
 

Manhdd

Cố Vấn CLB
Staff member
Vậy như bài ở trên em có thể sửa 16MHz trong code bên dưới thành các tần số khác như msp430 không anh????:-(
PHP:
SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
SYSCTL_XTAL_16MHZ là khai báo tần số thạch anh của hệ thống, nếu không dùng PLL thì clock sẽ theo giá trị này (tương ứng với thạch anh ngoài).
Vì dùng PLL (SYSCTL_USE_PLL ) nên tần số sẽ được chia ra theo SYSCTL_SYSDIV_5. DIV_5 -> 200MHz/5 = 40 MHz (sau PLL 400 MHz có sẵn 1 bộ chia đôi tần số mà hàm này không đụng đến)
Em có thể kiểm tra cloack bằng hàm SysCtlClockGet()

Tìm hiểu thêm theo bài giảng của TI: http://processors.wiki.ti.com/index.php/Getting_Started_with_the_TIVA™_C-Series_TM4C123G_LaunchPad?DCMP=tivac&HQS=TM4C123G-Launchpad-Workshop
 

dungpic

Trứng gà
Chào các Anh. Em đang thắc mắc về cách tính giá trị khoảng thời gian giữa 2 lần liên tiếp vào ngắt Timer và hàm nào làm nhiệm vụ tạo ra khoảng thời gian giữa 2 lần liên tiếp vào ngắt Timer.
+ Giá trị khoảng thời gian giữa 2 lần liên tiếp vào ngắt Timer cụ thể trong đoạn code bên dưới bằng bao nhiêu. Dùng công thức gì để tính toán ra được giá trị đó.
+ Ngoài ra em muốn hỏi thêm về hàm TimerLoadSet, ý nghĩa của hàm này là gì.
Cụ thể trong đoạn code bên dưới là : TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 4);.
Hàm này tạo ra 1 khoảng thời gian, vậy cách tính giá trị khoảng thời gian này như thế nào, dùng công thức gì để tính toán ra giá trị đó.
Mong các anh giải đáp cho em. Em cám ơn.
Em gửi anh 1 đoạn code bên dưới. Em dùng chip LM3S9B96 và dùng Xtal (MHZ) = 8MHZ.
#define SYSTICKHZ 100
#define SYSTICKMS (1000 / SYSTICKHZ)
void
SysTickIntHandler(void)
{
//
// Call the lwIP timer handler.
//
lwIPTimer(SYSTICKMS);
disk_timerproc();
}
void
Timer0IntHandler(void)
{
}
int
main(void)
{
//
// Set the system clock to run at 50MHz from the PLL.
//
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 4);
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
IntEnable(INT_TIMER0A);
TimerEnable(TIMER0_BASE, TIMER_A);
//
// Configure SysTick for a periodic interrupt.
//
SysTickPeriodSet(SysCtlClockGet() / SYSTICKHZ);
SysTickEnable();
SysTickIntEnable();
//
// Enable processor interrupts.
//
IntMasterEnable();
}
 
Top