STM32:STM32學習記錄2:跑馬燈及仿真

以下爲自己編寫的跑馬燈程序,其中PA8和PD2連接LED
使用的是官方固件庫3.4版本!!!!前提是配置好編譯器纔可以執行!!
配置流程
1:系統時鐘初始化,包括系統時鐘和要開放的IO口或者功能的時鐘配置。
2:IO口初始化,包括引腳,速率,輸入輸出模式等。
注意!!!
1:與51系列不同的是IO口還需要配置時鐘,這是STM32省電的一種技巧。
2:IO口需設置爲通用IO口,
推輓輸出。
    IO的輸出配置可以是推輓模式和開漏模式,具體區別看參考手冊108頁。
    IO口的一般配置流程:
    GPIO_InitTypeDef GPIO_InitStructure;//定義 GPIO_InitStructure爲    GPIO_InitTypeDef結構體類型
    特別注意用庫函數的話一定要定義結構體類型!!!!!!!!不僅是GPIO像串口等等的初始化都需要定義結體,    具體類型可以查看官方庫
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引腳選擇
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推輓輸出
    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

3:關於系統時鐘:系統時鐘可以是外接晶振的倍頻。我用9倍頻!在官方庫中選擇好定義的宏,直接調用函數即可實現RCC的設置,具體頻率設定由system_stm32f10xx.c(默認目錄在ARM/Startup/ST)文件中得宏定義,開放哪一個宏,當調用SystemInit()庫函數時,程序可以把頻率設定好。
系統時鐘的配置流程:
void RCC_Configuare(void)
{
    SystemInit();//頻率設定有system_stm32f10x.c文件中的宏定義 開放某個宏 當調用SystemInit()時即可設置好頻率
    RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能時鐘安全系統
}

流水燈的程序沒啥說的了,各種文檔滿天飛。這裏重點說明幾點:
1:時鐘系統,詳細看《零死角玩轉stm32-初級篇》 66頁。
2:仿真:
首先是仿真設置,主要是設置外部晶振頻率。
STM32重新學(2):流水燈及仿真 - zmurder - 起點的博客
 
STM32重新學(2):流水燈及仿真 - zmurder - 起點的博客

3:邏輯分析儀的使用
點邏輯分析儀----選setup---在Current Logic Analyser Signals中 添加 PORTA  然後選擇下面 Display Type 中選bit即可
4:MDK中的空語句寫法
__NOP();  注意前面是兩槓  定義在core_cm3.h中

以下爲原程序:
#include"stm32f10x.h"

#define LED0_ON  GPIO_SetBits(GPIOA,GPIO_Pin_8)    // LED0開
#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0關
#define LED1_ON  GPIO_SetBits(GPIOD,GPIO_Pin_2)     //LED1開
#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1關

//初始化IO端口
void IO_Configuart(void)   
{
    GPIO_InitTypeDef GPIO_InitStructure;//定義 GPIO_InitStructure爲    GPIO_InitTypeDef結構體類型

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允許總線CLOCK,在使用GPIO之前必須允許相應的端口時鐘

    //配置GPIOA_8
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引腳選擇
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推輓輸出
    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

    //配置GPIOD_2
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//引腳選擇
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推輓輸出
    GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化
}

//復位和系統時鐘控制
void RCC_Configuare(void)
{
    SystemInit();//頻率設定有system_stm32f10x.c文件中的宏定義 開放某個宏 當調用SystemInit()時即可設置好頻率
    RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能時鐘安全系統
}

void Delay(u16 speed)
{
    u16 i=0;
    while(speed!=0)
    {
        speed--;
        for(i=0;i<400;i++);
    }
}
int main(void)
{
    IO_Configuart();
    RCC_Configuare();
    while(1)
    {
        LED0_ON;
        LED1_OFF;
        Delay(2000);
        LED0_OFF;
        LED1_ON;
        Delay(2000);
    }
}


#include"stm32f10x.h"

#define LED0_ON  GPIO_SetBits(GPIOA,GPIO_Pin_8)    // LED0開
#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0關
#define LED1_ON  GPIO_SetBits(GPIOD,GPIO_Pin_2)     //LED1開
#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1關

//初始化IO端口
void IO_Configuart(void)   
{
    GPIO_InitTypeDef GPIO_InitStructure;//定義 GPIO_InitStructure爲    GPIO_InitTypeDef結構體類型

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允許總線CLOCK,在使用GPIO之前必須允許相應的端口時鐘

    //配置GPIOA_8
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引腳選擇
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推輓輸出
    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

    //配置GPIOD_2
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//引腳選擇
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推輓輸出
    GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化
}

//復位和系統時鐘控制
void RCC_Configuare(void)
{
    SystemInit();//頻率設定有system_stm32f10x.c文件中的宏定義 開放某個宏 當調用SystemInit()時即可設置好頻率
    RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能時鐘安全系統
}

void Delay(u16 speed)
{
    u16 i=0;
    while(speed!=0)
    {
        speed--;
        for(i=0;i<400;i++);
    }
}
int main(void)
{
    IO_Configuart();
    RCC_Configuare();
    while(1)
    {
        LED0_ON;
        LED1_OFF;
        Delay(2000);
        LED0_OFF;
        LED1_ON;
        Delay(2000);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章