<th id="h7ftf"></th><th id="h7ftf"><ol id="h7ftf"><ol id="h7ftf"></ol></ol></th>

        <track id="h7ftf"></track>

        <video id="h7ftf"><ruby id="h7ftf"></ruby></video>

            <track id="h7ftf"><del id="h7ftf"><output id="h7ftf"></output></del></track>

            <track id="h7ftf"></track>

            <track id="h7ftf"></track>

            專注電子技術學習與研究
            當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

            [原創]STM32單片機的學習經驗

            作者:佚名   來源:本站原創   點擊數:  更新時間:2012年09月16日   【字體:

              隨便寫寫,關于stm32 最近在學習stm32,寫點東西,雖然簡單,但都是原創啊

              開發板是前輩畫的,好像是用來測試一個3G功能的,不過對于我來說太遠;我要來了3個,自己焊了一個最小系統,好在公司資源還是不錯的,器件芯片有,還可以問問前輩--對公司還是比較滿意的,雖然工資少了點,但學東西第一位O(∩_∩)O~。
                    最開始當然是建工程了,這個真不太會,前前后后竟用了一周(時間真長,別見笑。,上網查資料, 問前輩,自己琢磨。。?偹愀愣,然后從GPIO開始學,開始還真沒什么頭緒(雖然在大學學點51,但完全沒有真正應用,頂多是跑馬燈實驗),開始糾結是從寄存器開始學還是從庫函數開始學,后來看到一句“用庫函數入門,用寄存器提高”于是下定決心用庫,但當時沒有庫的概念,結果走了很多彎路,看了很多不必要的東西,當時竟沒理解到只是調用庫就OK了,別的不用管。最后潛心的在www.sahacks.com教程網看完一個例程后照貓畫虎寫了一個,經過了多次調試以后,燈終于亮了!那個興奮啊。再次還要感謝 http://www.sahacks.com/mcu/1106.html 的作者他寫的GPIO使用方法讓我少走了很多彎路,接著學的EXTI,當時對中斷的理解只是概念上的,也不知道中斷程序要放在中斷函數里(it.c),總之現在想想當時怎么那么不開竅啊。慢慢的中斷也弄出來了,一會我會把程序貼出來,很簡單的嘿。慢慢的有點感覺找到門了:先大致看一下要學習概要,找個例程,一個函數一個函數的看,重點理解配置的什么,參數,然后在頭腦中形成一個大概的輪廓,雖然有時候不是特別清晰;接著學習TIMER(通用定時器),只是學習了最簡單的溢出中斷,其他捕獲什么的都還沒有看呢--想先對stm有個總體的學習,下一步準備每個模塊細細“研讀”。應用定時器溢出中斷做了個閃燈小程序;接著順便把學習過的GPIO,EXTI,TIMER混在一起做了一個優先級(NVIC)的程序,以來了解下優先級,二來對前面的學習是一個復習,雖然很簡單,但沒能一下子就調出來--其實每次都會在細節上出不少差錯:時鐘忘使能啦,GPIO沒有配置全啦,名稱寫錯啦(很低級,但這個有時候真的不好找),概念理解不對啦。。。。。。有時候憋的真是相當難受,但問題解決的那一刻真怎是一個“爽”字了得啊,當然前提是自己解決的;接下來學USART(串口),原來我也不知道有串口這么個東西,但弄單片機的要是不知道“串口”就好比開車的不知道輪胎一樣了,開始完全沒有概念,什么波特率啊,奇偶校驗位啊,停止位啊,對著一堆名詞看著都頭大。慢慢的了解到串口是一種通訊傳輸方式,就和USB一樣,只是串口比USB早出生好多年。這時候已經有點門了,看概念,抄例程,看函數,理解,根據自己的理解改參數,實現!學會了串口,以后就可以通過串口來觀察數據了(我的實驗板可是沒有屏的);下一個是DMA,DMA可是個好東西,至于怎么好,百度一下,大家就知道了;下來ADC(模數轉換),就是把模擬量轉化成數字量,據說stm之所以強大,ADC算一個重要條件,我只是簡單了應用了一個測電壓的功能(可以說是ADC的最簡單功能了),用串口顯示探針(自己焊上去的)所測到的電壓值,主要卡在了兩個地方:1忘記配置串口的GPIO(所以一定要注意細節,一個細節能憋我1天)  2對通道的理解不夠,原以為通道自己找串口(現在發現自己挺天真的),實際是每個通道對應自己的GPIO口,或模塊(如溫度傳感器),“一知半解”又讓我卡了1天。解決這兩個問題后,串口赫然出現數字啦,而且是探地是0,探電源是33xx(3.3V的),還真準呢;現在在學習I2C(剛剛開始看),還在看概念。。。
                   希望自己堅持下去,早日能寫出一個屬于自己的程序,完成一個說的過去的功能,下面把我的程序粘出來,和大家分享下,大蝦看到了別見笑啊

            注:1.有兩個燈,PA4    B12,都是低電平點亮
                2.有兩個按鍵,PB8  和  PB9,按下是低電平
                3.程序開始后兩個燈常亮,按下按鍵后熄滅,抬起后繼續亮


            main.c中

            #include "stm32f10x.h"
            #include "stm32f10x_gpio.h"
            #include "stm32f10x_rcc.h"
            #include "stm32f10x_exti.h"

             

            void RCC_Configuration(void)  //時鐘配置函數
            {
               ErrorStatus HSEStartUpStatus;
                //使能外部晶振
               RCC_HSEConfig(RCC_HSE_ON);
               //等待外部晶振穩定
               HSEStartUpStatus = RCC_WaitForHSEStartUp();
               //如果外部晶振啟動成功,則進行下一步操作
               if(HSEStartUpStatus==SUCCESS)
               {
                 //設置HCLK(AHB時鐘)=SYSCLK  將系統時鐘進行分頻后,作為AHB總線時鐘
                 RCC_HCLKConfig(RCC_SYSCLK_Div1);
                 //PCLK1(APB1) = HCLK/2  將HCLK時鐘2分頻后給低速外部總線
                 RCC_PCLK1Config(RCC_HCLK_Div2);
                 //PCLK2(APB2) = HCLK  HCLK時鐘配置給高速外部總線
                 RCC_PCLK2Config(RCC_HCLK_Div1);
                 //外部高速時鐘HSE 4倍頻
                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
                 //啟動PLL
                 RCC_PLLCmd(ENABLE);
                 //等待PLL穩定
                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
                 //系統時鐘SYSCLK來自PLL輸出
                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
                 //切換時鐘后等待系統時鐘穩定
                 while(RCC_GetSYSCLKSource()!=0x08);
               }
               // 下面這些都是外設總線上所掛的外部設備時鐘的配置
              
               RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
            }


            void GPIO_Configuration(void)  //GPIO配置函數
            {
              //GPIO_DeInit(GPIOA);
              GPIO_InitTypeDef GPIO_InitStructure;
              GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
              GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
              GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
              GPIO_Init(GPIOA,&GPIO_InitStructure);
             
              GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
              GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
              GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
              GPIO_Init(GPIOB,&GPIO_InitStructure);
             
              GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
              GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
              GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
              GPIO_Init(GPIOB,&GPIO_InitStructure);
            }

            void EXTI_Config(void)
            {
              EXTI_InitTypeDef EXTI_InitStructure;
              // 管腳選擇
              GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
              GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
              // 清除 EXTI線路掛起位
              EXTI_ClearITPendingBit(EXTI_Line8|EXTI_Line9);
              //
              EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
              EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
              EXTI_InitStructure.EXTI_Line = EXTI_Line8|EXTI_Line9;
              EXTI_InitStructure.EXTI_LineCmd = ENABLE;
              EXTI_Init(&EXTI_InitStructure);
            }

            void NVIC_Config(void)
            {
              NVIC_InitTypeDef NVIC_InitStructure;
              NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
              NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 注意名稱是“_IRQn”,不是“_IRQChannel”
              NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//
              NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
              NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
              NVIC_Init(&NVIC_InitStructure);
            }

             

             

             

            int main(void)
            {
             RCC_Configuration();
             GPIO_Configuration();
             EXTI_Config();
             NVIC_Config();
             
             while(1)
             {
               GPIO_ResetBits(GPIOB,GPIO_Pin_12);
               GPIO_ResetBits(GPIOA,GPIO_Pin_4);
             }
            }

             

             

            中斷文件  it.c中

             

            void EXTI9_5_IRQHandler(void)
            {

              if ( EXTI_GetITStatus(EXTI_Line8) != RESET )
              {
                EXTI_ClearITPendingBit(EXTI_Line8);
               
               
                GPIO_SetBits(GPIOA,GPIO_Pin_4);
                   
                while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0);
                 
              }
             
               if ( EXTI_GetITStatus(EXTI_Line9) != RESET )
              {
                EXTI_ClearITPendingBit(EXTI_Line9);
               
                GPIO_SetBits(GPIOB,GPIO_Pin_12);

                while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0);
              }
            }

            關閉窗口

            相關文章

            91尤物无码不卡在线_少妇高潮喷水在线观看_国产无圣光一区福利二区_国产欧美日韩一级

            <th id="h7ftf"></th><th id="h7ftf"><ol id="h7ftf"><ol id="h7ftf"></ol></ol></th>

                  <track id="h7ftf"></track>

                  <video id="h7ftf"><ruby id="h7ftf"></ruby></video>

                      <track id="h7ftf"><del id="h7ftf"><output id="h7ftf"></output></del></track>

                      <track id="h7ftf"></track>

                      <track id="h7ftf"></track>