STM32學前班教程之六:這些代碼大家都用得到 
2、 閱讀flash: 晶片內部記憶體flash操作函數
我的理解——對晶片內部flash進行操作的函數,包括讀取,狀態,擦除,寫入等等,可以允許程式去操作flash上的資料。
基礎應用1,FLASH時序延遲幾個週期,等待匯流排同步操作。推薦按照單片機系統運行頻率,0—24MHz時,取Latency=0;24—48MHz時,取Latency=1;48~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可以是0、1、2、3、4,分別代表搶佔優先順序有1、2、4、8、16個和回應優先順序有16、8、4、2、1個。規定兩種優先順序的數量後,所有的中斷級別必須在其中選擇,搶佔級別高的會打斷其他中斷優先執行,而回應級別高的會在其他中斷執行完優先執行。
 //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設備
}
沒有留言:
張貼留言