嵌入式stm32學習方法
stm32方法總結
相信很多人學習單片機都是從51開始的,而相對於51來說,stm32的代碼量明顯增加,並且了解到一定程度就知道stm32的代碼不可能都自己寫(因為代碼量不允許),因此學習方向一般分為庫函數開發和寄存器開發方式。初學者最好通過庫函數方式進行學習,因為stm32的寄存器太多了,會看暈的。而直接調用打包好的庫函數,學習難度就會簡單很多。比如:GPIO口來說(創建工程和添加項目和51相似,不在多說)主要寫一個時鐘使能函數和結構體定義函數函數,然後在主函數中調用GPIO的初始化就好了,示例程序:
//LED IO初始化void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIO時鐘
//GPIOF9,F10的初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1對應IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//以上為GPIO初始化具體內容
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10初始為燈滅狀態
//GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);GPIOF9,F10初始為燈亮狀態
}
這樣一看主體就是三部分,時鐘使能,GPIO初始化內容設置,IO口位置對應電平高低。同理中斷,串口,ADC等都是這樣的,只要能夠熟練調用這些函數並理解意思,就可以很好初步掌握stm32。再以中斷為例:
void EXTI0_IRQHandler(void)
{
delay_ms(10);
if(WK_UP==1) //按下WK_UP鍵觸發
{
BEEP=!BEEP; //蜂鳴器翻轉
}
EXTI_ClearITPendingBit(EXTI_Line0); //清楚LINE0上的中斷標誌位
}void EXTI2_IRQHandler(void)
{
delay_ms(10);
if(KEY2==0) //按下KEY2鍵觸發
{
LED0=!LED0; //LED0翻轉
}
EXTI_ClearITPendingBit(EXTI_Line2); //清楚LINE2上的中斷標誌位
}
void EXTIX_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
KEY_Init(); //按鍵初始化函數
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);//PE2 連接到中斷線2,下同
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中斷時能
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿觸發
EXTI_Init(&EXTI_InitStructure);//中斷觸發方式
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//搶占優先級3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x03;//響應(子)優先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_Init(&NVIC_InitStructure);//中斷優先級
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_Init(&NVIC_InitStructure);
}
看樣子代碼挺長,其實很有規律,一共有三個函數,前兩個就是中斷函數了,而第三個就是中斷函數的初始化函數前兩個學過51的人都知道,都能夠滿足一定條件,就會跳進中斷,而進入中斷的方式以及中斷進行的優先級就由初始化函數裏配置了。
通過上面兩個例子大家對stm32學習方向有個大概了解吧。
嵌入式stm32全新視頻盡在創客學院官網:www.makeru.com.cn/?t=12
嵌入式stm32學習交流群:561213221
嵌入式stm32學習方法