1. 程式人生 > >嵌入式stm32學習方法

嵌入式stm32學習方法

方法 學習交流 inter 規律 rup reset 學習 key 串口

  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學習方法