初體驗FM33L0-Systick-單發中斷

墮落小生發表於2021-03-17

最近單位上馬了一個 FM33L0的專案,剛剛接觸 ARM 核 MCU,困難肯定是有的,但是作為一個生長在紅旗下的有為青年,困難肯定是用來克服的。

程式碼中的驅動檔案是在官網下載的。

注意編譯器版本 version 6 跟 version 5 的區別,主要是 version 6 支援 c99。

除錯,我用的是 J-LINK SWD 模式,keil 還不能正確識別出晶片型號,在彈出的對話方塊中選擇一個標準的 M0 核心的選項就可以了。 enter image description here

編譯,Preprocessor Symbols 裡面 Define:填上 __VTOR_PRESENT,__DEBUG ,前一個是支援向量表,後一個應該是關於除錯的。

SysTick_Config() 函式要在系統初始化完成之後再呼叫一次,中斷才能正常工作,還沒有弄明白是怎麼回事。

#include "FM33L0XX.h"
#include "fm33l0xx_rcc.h"
#include "fm33l0xx_gpio.h"

void systemInit(void);
void ledOutputCfg(void);


void SysTick_Handler(void)
{
    GPIO_ToggleBits(GPIOC,GPIO_Pin_0);    
}



int main()
{

    SystemInit();
    ledOutputCfg();
//    SysTick->LOAD = 4000000;
//    SysTick->VAL = 0;
//    SysTick->CTRL = 0x07;
    SysTick_Config(0x1000000);

    while(1)
    {

    }
}

void systemInit(void)
{
    RCC_RCHF_InitTypeDef RCHF_InitStruct;
    RCC_SYSCLK_InitTypeDef SYSCLK_InitStruct;

    __disable_irq();

    SysTick_Config(8000000);

    for (int i = 0; i < 4000000; i++)
    {
    }

    RCHF_InitStruct.FSEL   = RCC_RCHF_CR_FSEL_8MHZ;     // RCHF 8M
    RCHF_InitStruct.RCHFEN = ENABLE;                    // 使能 RCHF

    RCC_RCHF_Init(&RCHF_InitStruct);

    SYSCLK_InitStruct.SYSCLKSEL  = RCC_SYSCLK_CR_SYSCLKSEL_RCHF;    // RCHF 做主時鐘
    SYSCLK_InitStruct.STCLKSEL   = RCC_SYSCLK_CR_STCLKSEL_SCLK;     // SCLK 做 systick 時鐘
    SYSCLK_InitStruct.AHBPRES    = RCC_SYSCLK_CR_AHBPRES_DIV1;      // AHB 不分頻
    SYSCLK_InitStruct.APBPRES    = RCC_SYSCLK_CR_APBPRES_DIV1;      // APB 不分頻
    SYSCLK_InitStruct.SLP_ENEXTI = ENABLE;      // 休眠時使能外部中斷取樣
    SYSCLK_InitStruct.LSCATS     = ENABLE;      // LSCLK 自動切換

    RCC_SysClk_Init(&SYSCLK_InitStruct);





    __enable_irq();    

}


void ledOutputCfg(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_PERCLK_SetableEx( PADCLK,     ENABLE ); // 使能 APH GPIO 時鐘

    GPIO_ResetBits(GPIOC,GPIO_Pin_0);

    GPIO_InitStructure.Pin = GPIO_Pin_0;
    GPIO_InitStructure.PxINEN = GPIO_IN_Dis;
    GPIO_InitStructure.PxODEN = GPIO_OD_Dis;
    GPIO_InitStructure.PxPUEN = GPIO_PU_Dis;
    GPIO_InitStructure.PxFCR = GPIO_FCR_OUT;

    GPIO_Init(GPIOC,&GPIO_InitStructure);

}

編輯器要是能左右分欄編輯和預覽,感覺會更好一點。