welcom ! Handel home
2014年6月17日 星期二
ST32教程(7)
1、閱讀exti:外部設備中斷函數
我的理解——外部設備通過引腳給出的硬體中斷,也可以產生軟體插斷,19個上升、下降或都觸發。EXTI0~EXTI15連接到管腳,EXTI線16連接到PVD(VDD監視),EXTI線17連接到RTC(鬧鐘),EXTI線18連接到USB(喚醒)。
基礎應用1,設定外部中斷初始化函數。按需求,不是必須代碼。
用法: void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure; //外部設備中斷恢復默認參數
EXTI_InitStructure.EXTI_Line = 通道1|通道2;
//設定所需產生外部中斷的通道,一共19個。
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //產生中斷
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//上升下降沿都觸發
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //啟動中斷的接收
EXTI_Init(&EXTI_InitStructure); //外部設備中斷啟動
}
2、閱讀dma:通過匯流排而越過CPU讀取外設資料
我的理解——通過DMA應用可以加速單片機外設、記憶體之間的資料傳輸,並在傳輸期間不影響CPU進行其他事情。這對於入門開發基本功能來說沒有太大必要,這個內容先行跳過。
3、閱讀systic:系統計時器
我的理解——可以輸出和利用系統時鐘的計數、狀態。
基礎應用1,精確計時的延時子函數。推薦使用的代碼。
用法:
static vu32 TimingDelay;//全域變數聲明
void SysTick_Config(void)//systick初始化函數
{
SysTick_CounterCmd(SysTick_Counter_Disable);//停止系統計時器
SysTick_ITConfig(DISABLE); //停止systick中斷
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
//systick使用HCLK作為時鐘源,頻率值除以8。
SysTick_SetReload(9000);//重置時間1毫秒(以72MHz為基礎計算)
SysTick_ITConfig(ENABLE);//開啟systic中斷
}
void Delay (u32 nTime) //延遲一毫秒的函數
{
SysTick_CounterCmd(SysTick_Counter_Enable); //systic開始計時
TimingDelay = nTime; //計時長度賦值給遞減變數
while(TimingDelay != 0); //檢測是否計時完成
SysTick_CounterCmd(SysTick_Counter_Disable); //關閉計數器
SysTick_CounterCmd(SysTick_Counter_Clear); //清除計數值
}
void TimingDelay_Decrement(void)
//遞減變數函數,函數名由“stm32f10x_it.c”中的中斷回應函式定義好了。
{
if (TimingDelay != 0x00) //檢測計數變數是否達到0
{
TimingDelay--; //計數變數遞減
}
}
注:建議熟練後使用,所涉及知識和設備太多,新手出錯的可能性比較大。新手可用簡化的延時函數代替:
void Delay(vu32 nCount)//簡單延時函數
{
for(; nCount != 0; nCount--);(迴圈變數遞減計數)
}
當延時較長,又不需要精確計時的時候可以使用嵌套迴圈:
void Delay(vu32 nCount) //簡單的長時間延時函數
{int i; //聲明內部遞減變數
for(; nCount != 0; nCount--) //遞減變數計數
{for (i=0; i<0xffff i="" nbsp="" span="">0xffff>內部迴圈遞減變數計數
}
4、閱讀gpio:I/O設置函數
我的理解——所有輸入輸出管腳模式設置,可以是上下拉、浮空、開漏、類比、推挽模式,頻率特性為2M,10M,50M。也可以向該管腳直接寫入資料和讀取資料。
基礎應用1,gpio初始化函數。所有程式必須。
用法:void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO狀態恢復預設參數
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_標號 | GPIO_Pin_標號 ;
//管腳位置定義,標號可以是NONE、ALL、0至15。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//輸出速度2MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //類比輸入模式
GPIO_Init(GPIOC, &GPIO_InitStructure); //C組GPIO初始化
//注:以上四行代碼為一組,每組GPIO屬性必須相同,預設的GPIO參數為:ALL,2MHz,FLATING。如果其中任意一行與前一組相應設置相同,那麼那一行可以省略,由此推論如果前面已經將此行參數設定為默認參數(包括使用GPIO_InitTypeDef GPIO_InitStructure代碼),本組應用也是默認參數的話,那麼也可以省略。以下重複這個過程直到所有應用的管腳全部被定義完畢。
……
}
基礎應用2,向管腳寫入0或1
用法:GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)0x01);//寫入1
STM32筆記之七:讓它跑起來,基本硬體功能的建立
0、 實驗之前的準備
a) 接通串口轉接器
b) 下載IO與串口的原廠程式,編譯通過保證調試所需硬體正常。
1、 flash,lib,nvic,rcc和GPIO,基礎程式庫編寫
a) 這幾個庫函數中有一些函數是關於晶片的初始化的,每個程式中必用。為保障程式品質,初學階段要求嚴格遵守官方習慣。注意,官方程式庫常式中有個platform_config.h檔,是專門用來指定同類外設中第幾號外設被使用,就是說在main.c裡面所有外設序號用x代替,比如USARTx,程式會到這個頭檔中去查找到底是用那些外設,初學的時候參考常式別被這個所迷惑住。
b) 全部必用代碼取自庫函數所帶常式,並增加逐句注釋。
c) 習慣順序——Lib(debug),RCC(包括Flash優化),NVIC,GPIO
d) 必用模組初始化函數的定義:
void RCC_Configuration(void); //定義時鐘初始化函數
void GPIO_Configuration(void); //定義管腳初始化函數
void NVIC_Configuration(void); //定義中斷管理初始化函數
void Delay(vu32 nCount); //定義延遲函數
e) Main中的初始化函式呼叫:
RCC_Configuration(); //時鐘初始化函式呼叫
NVIC_Configuration(); //中斷初始化函式呼叫
GPIO_Configuration(); //管腳初始化函式呼叫
f) Lib注意事項:
屬於Lib的Debug函數的調用,應該放在main函數最開始,不要改變其位置。
g) RCC注意事項:
Flash優化處理可以不做,但是兩句也不難也不用改參數……
根據需要開啟設備時鐘可以節省電能
時鐘頻率需要根據實際情況設置參數
h) NVIC注意事項
注意理解佔先優先順序和響應優先順序的分組的概念
i) GPIO注意事項
注意以後的過程中收集不同管腳應用對應的頻率和模式的設置。
作為高低電平的I/O,所需設置:RCC初始化裡面打開RCC_APB2
PeriphClockCmd(RCC_APB2Periph_GPIOA);GPIO裡面管腳設定:IO輸出(50MHz,Out_PP);IO輸入(50MHz,IPU);
j) GPIO應用
GPIO_WriteBit(GPIOB, GPIO_Pin_2, Bit_RESET);//重置
GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)0x01);//寫入1
GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)0x00);//寫入0
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) ;//讀入IO
k) 簡單Delay函數
void Delay(vu32 nCount)//簡單延時函數
{for(; nCount != 0; nCount--);}
實驗步驟:
RCC初始化函數裡添加:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
不用其他中斷,NVIC初始化函數不用改
GPIO初始化代碼:
//IO輸入,GPIOB的2、10、11腳輸出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;//管腳號
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //輸入輸出模式
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
簡單的延遲函數:
void Delay(vu32 nCount) //簡單延時函數
{ for (; nCount != 0; nCount--);} //迴圈計數延時
完成之後再在main.c的while裡面寫一段:
GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)0x01);//寫入1
Delay(0xffff);
GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)0x00);//寫入0
Delay(0xffff);
就可以看到連接在PB2腳上的LED閃爍了,單片機就跑起來了。
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言