welcom ! Handel home

2014年6月17日 星期二

STM32教程(6)

STM32學前班教程之六:這些代碼大家都用得到 


2
閱讀flash 晶片內部記憶體flash操作函數
我的理解——對晶片內部flash進行操作的函數,包括讀取,狀態,擦除,寫入等等,可以允許程式去操作flash上的資料。
基礎應用1FLASH時序延遲幾個週期,等待匯流排同步操作。推薦按照單片機系統運行頻率,0—24MHz時,取Latency=024—48MHz時,取Latency=148~72MHz時,取Latency=2。所有程式中必須的
用法:FLASH_SetLatency(FLASH_Latency_2);
位置:RCC初始化子函數裡面,時鐘起振之後。
基礎應用2,開啟FLASH預讀緩衝功能,加速FLASH的讀取。所有程式中必須的
用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
位置:RCC初始化子函數裡面,時鐘起振之後。

3
閱讀lib:調試所有外設初始化的函數。
我的理解——不理解,也不需要理解。只要知道所有外設在調試的時候,EWRAM需要從這個函數裡面獲得調試所需資訊的位址或者指標之類的資訊。
基礎應用1,只有一個函數debug。所有程式中必須的。
用法: 

#ifdef DEBUG
    debug();
#endif
位置:main函數開頭,聲明變數之後。


4
閱讀nvic:系統中斷管理。
我的理解——管理系統內部的中斷,負責打開和關閉中斷。
基礎應用1,中斷的初始化函數,包括設置中斷向量表位置,和開啟所需的中斷兩部分。所有程式中必須的。
用法: 

void NVIC_Configuration(void){
  NVIC_InitTypeDef NVIC_InitStructure;//
中斷管理恢復默認參數
 #ifdef  VECT_TAB_RAM  
 //
如果C/C++ Compiler\Preprocessor\Defined symbols中的定義了VECT_TAB_RAM(見程式庫更改內容的表格)
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //
則在RAM調試
 #else        //
如果沒有定義VECT_TAB_RAM
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//
則在Flash裡調試
 #endif        //
結束判斷語句

 //
以下為中斷的開啟過程,不是所有程式必須的。
 //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
 //
設置NVIC優先順序分組,方式。
 //
注:一共16個優先順序,分為搶佔式和回應式。兩種優先順序所占的數量由此代碼 確定,NVIC_PriorityGroup_x可以是01234,分別代表搶佔優先順序有124816個和回應優先順序有168421個。規定兩種優先順序的數量後,所有的中斷級別必須在其中選擇,搶佔級別高的會打斷其他中斷優先執行,而回應級別高的會在其他中斷執行完優先執行。
 //NVIC_InitStructure.NVIC_IRQChannel =
中斷通道名;
 //
開中斷,中斷名稱見函式程式庫
 //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 //
搶佔優先順序
 //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
 //
回應優先順序
 //NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//
啟動此通道的中斷
 //NVIC_Init(&NVIC_InitStructure);     //
中斷初始化
}



5
閱讀rcc:單片機時鐘管理。
我的理解——管理外部、內部和外設的時鐘,設置、打開和關閉這些時鐘。
基礎應用1:時鐘的初始化函數過程——
用法:


void RCC_Configuration(void)    //時鐘初始化函數
{
    ErrorStatus HSEStartUpStatus;     //等待時鐘的穩定
    RCC_DeInit();         //時鐘管理重置
    RCC_HSEConfig(RCC_HSE_ON);      //打開外部晶振
    HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部晶振就緒
    if (HSEStartUpStatus == SUCCESS)
    {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        //flash讀取緩衝,加速
        FLASH_SetLatency(FLASH_Latency_2); //flash操作的延時
        RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB使用系統時鐘
        RCC_PCLK2Config(RCC_HCLK_Div2);  //APB2(高速)為HCLK的一半
        RCC_PCLK1Config(RCC_HCLK_Div2);  //APB1(低速)為HCLK的一半
        //注:AHB主要負責外部記憶體時鐘。PB2負責AD,I/O,高級TIM,串口1。APB1負責DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

        //PLLCLK = 8MHz * 9 = 72 MHz
        RCC_PLLCmd(ENABLE);     //啟動PLL
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}

        //等待PLL啟動
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        //將PLL設置為系統時鐘源
        while (RCC_GetSYSCLKSource() != 0x08) {}
        //等待系統時鐘源的啟動
    }
    //RCC_AHBPeriphClockCmd(ABP2設備1 | ABP2設備2 |, ENABLE);
    //啟動AHP設備
    //RCC_APB2PeriphClockCmd(ABP2設備1 | ABP2設備2 |, ENABLE);
    //啟動ABP2設備
    //RCC_APB1PeriphClockCmd(ABP2設備1 | ABP2設備2 |, ENABLE);
    //啟動ABP1設備
}

沒有留言: