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設備
}
沒有留言:
張貼留言