(玩電(dian)子) 電(dian)子技術(shu)學習與研究
當前位置︰單(dan)片機教程(cheng)網 >> MCU設計實例(li) >> 瀏(liu)覽文章

重庆体彩网官网

作者:佚名   來源:本站原創(chuang)   點擊數:x  更新(xin)時間︰2012年09月(yue)16日   【字體︰大(da) 中(zhong) 小(xiao)

  隨便寫寫,關于stm32 最(zui)近(jin)在學習stm32,寫點東西,雖(sui)然(ran)簡單(dan),但都(du)是原創(chuang)啊

  開(kai)發板(ban)是前輩(bei)畫的,好像是用來測試一個(ge)3G功能的,不過對(dui)于我來說(shuo)太遠;我要來了3個(ge),自己焊了一個(ge)最(zui)小(xiao)系di)常 迷詮 咀試椿故遣淮淼模 骷jian)芯片有xiao) 箍ke)以問問前輩(bei)--對(dui)公司還是qian)冉下yi)的,雖(sui)然(ran)工資少了shuo)悖  ? 韉諞晃(∩_∩)O~。
        最(zui)開(kai)始當然(ran)是建工程(cheng)了,這個(ge)真不太會,前前後後竟用了一周(時間真長(chang),別見笑(xiao)啊),上網查資料, 問前輩(bei),自己琢磨。。。總(zong)算搞定,然(ran)後從GPIO開(kai)始學,開(kai)始還真沒什(shi)麼頭(tou)緒(xu)(雖(sui)然(ran)在大(da)學學點51,但完全沒有真正應用,頂(ding)多(duo)是跑馬燈實驗),開(kai)始糾(jiu)結是從寄存(cun)器開(kai)始學還是從庫函(han)數開(kai)始學,後來看到(dao)一句“用庫函(han)數入門(men),用寄存(cun)器提高(gao)”于是下定決心用庫,但當時沒有庫的概念,結果走了很多(duo)彎(wan)路,看了很多(duo)不必要的東西,當時竟沒理(li)解到(dao)只是調用庫就OK了,別的不用管。最(zui)後潛(qian)心的在www.51hei.com教程(cheng)網看完一個(ge)例(li)程(cheng)後照(zhao)貓畫虎寫了一個(ge),經(jing)過了多(duo)次調試以後,燈終(zhong)于亮了!那個(ge)興奮啊。再次還要感xing)http://www.51hei.com/mcu/1106.html 的作者他(ta)寫的GPIO使(shi)用方法(fa)讓我少走了很多(duo)彎(wan)路,接著學的EXTI,當時bei)dui)中(zhong)斷的理(li)解只是概念上的,也不知道中(zhong)斷程(cheng)序要放(fang)在中(zhong)斷函(han)數里(li)(it.c),總(zong)之(zhi)現在想想當時怎麼那麼不開(kai)竅啊。慢(man)慢(man)的中(zhong)斷也弄(long)出來了,一會我會把程(cheng)序貼出來,很簡單(dan)的嘿。慢(man)慢(man)的有點感覺找到(dao)門(men)了︰先大(da)致看一下要學習概要,找個(ge)例(li)程(cheng),一個(ge)函(han)數一個(ge)函(han)數的看,重點理(li)解配置的什(shi)麼,參數,然(ran)後在頭(tou)腦中(zhong)xing)緯cheng)一個(ge)大(da)概的輪廓,雖(sui)然(ran)有時候不是特別清晰;接著學習TIMER(通用定時器),只是學習了最(zui)簡單(dan)的溢出中(zhong)斷,其他(ta)捕(bu)獲什(shi)麼的都(du)還沒有看呢--想先對(dui)stm有個(ge)總(zong)體的學習,下一步準(zhun)備每個(ge)模塊(kuai)細細“研讀”。應用定時器溢出中(zhong)斷做了個(ge)閃燈小(xiao)程(cheng)序;接著順便把學習過的GPIO,EXTI,TIMER混在一起(qi)做了一個(ge)優先級(NVIC)的程(cheng)序,以來了解下優先級,二來對(dui)前面(mian)的學習是一個(ge)復習,雖(sui)然(ran)很簡單(dan),但沒能一下子就調出來--其實每次都(du)會在細節上出不少差(cha)錯︰時鐘忘使(shi)能啦,GPIO沒有配置全啦,名稱寫chuang)砝玻 艿di)級,但這個(ge)有時候真的不好找yao)  拍罾li)解不huan)dui)啦。。。。。。有時候憋的真是相當難受,但問題(ti)解決的那一刻真怎是一個(ge)“爽”字了shuo)冒。 比ran)前提是自己解決的;接下來學USART(串口),原來我也不知道有串口這麼個(ge)東西,但弄(long)單(dan)片機的要是不知道“串口”就好比開(kai)車的不知道輪胎(tai)一樣了,開(kai)始完全沒有概念,什(shi)麼波特率啊,奇偶校(xiao)驗位啊,停(ting)止位啊,對(dui)著一huan)衙士醋哦du)頭(tou)大(da)。慢(man)慢(man)的了解到(dao)串口是一種通訊傳(chuan)輸方式(shi),就和USB一樣,只是串口比USB早出生好多(duo)年。這時候已經(jing)有點門(men)了,看概念,抄例(li)程(cheng),看函(han)數,理(li)解,根據自己的理(li)解改參數,實現!學會了串口,以後就可(ke)以通過串口來觀(guan)察數據了(我的實驗板(ban)可(ke)是沒有屏的);下一個(ge)是DMA,DMA可(ke)是個(ge)好東西,至于怎麼好,百度一下,大(da)家就知道了;下來ADC(模數轉換),就是把模擬量轉化成(cheng)數字量,據說(shuo)stm之(zhi)所以強大(da),ADC算一個(ge)重要條件(jian),我只是簡單(dan)了應用了一個(ge)測電(dian)壓的功能(可(ke)以說(shuo)是ADC的最(zui)簡單(dan)功能了),用串口顯示探針(自己焊上去(qu)的)所測到(dao)的電(dian)壓值,主要卡在了兩個(ge)地(di)方︰1忘記配置串口的GPIO(所以一huan)ㄒ  yi)細節,一個(ge)細節能憋我1天)  2對(dui)通道的理(li)解不夠,原以為(wei)通道自己找串口(現在發現自己挺天真的),實際是每個(ge)通道對(dui)應自己的GPIO口,或模塊(kuai)(如溫度傳(chuan)感器),“一知半(ban)解”又讓我卡了1天。解決這兩個(ge)問題(ti)後,串口赫然(ran)出現數字啦,而且是探地(di)是0,探電(dian)源是33xx(3.3V的),還真準(zhun)呢啊;現在在學習I2C(剛剛開(kai)始看),還在看概念。。。
       希望(wang)自己堅持下去(qu),早日能寫出一個(ge)屬于自己的程(cheng)序,完成(cheng)一個(ge)說(shuo)的過去(qu)的功能,下面(mian)把我的程(cheng)序粘出來,和大(da)家分享下,大(da)蝦看到(dao)了別見笑(xiao)啊

注︰1.有兩個(ge)燈,PA4    B12,都(du)是低(di)電(dian)平點亮
    2.有兩個(ge)按鍵,PB8  和  PB9,按下是低(di)電(dian)平
    3.程(cheng)序開(kai)始後兩個(ge)燈常亮,按下按鍵後熄滅,抬起(qi)後繼續亮


main.c中(zhong)

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

 

void RCC_Configuration(void)  //時鐘配置函(han)數
{
   ErrorStatus HSEStartUpStatus;
    //使(shi)能外部晶振
   RCC_HSEConfig(RCC_HSE_ON);
   //等待(dai)外部晶振穩(wen)定
   HSEStartUpStatus = RCC_WaitForHSEStartUp();
   //如果外部晶振啟(qi)動成(cheng)功,則進行(xing)下一步操(cao)作
   if(HSEStartUpStatus==SUCCESS)
   {
     //設置HCLK(AHB時鐘)=SYSCLK  將系di)呈敝詠xing)分頻後,作為(wei)AHB總(zong)線時鐘
     RCC_HCLKConfig(RCC_SYSCLK_Div1);
     //PCLK1(APB1) = HCLK/2  將HCLK時鐘2分頻後給低(di)速外部總(zong)線
     RCC_PCLK1Config(RCC_HCLK_Div2);
     //PCLK2(APB2) = HCLK  HCLK時鐘配置給高(gao)速外部總(zong)線
     RCC_PCLK2Config(RCC_HCLK_Div1);
     //外部高(gao)速時鐘HSE 4倍(bei)頻
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
     //啟(qi)動PLL
     RCC_PLLCmd(ENABLE);
     //等待(dai)PLL穩(wen)定
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
     //系di)呈敝YSCLK來自PLL輸出
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     //切換時鐘後等待(dai)系di)呈敝游wen)定
     while(RCC_GetSYSCLKSource()!=0x08);
   }
   // 下面(mian)這些都(du)是外設總(zong)線上所掛的外部ke)璞甘敝擁吶渲br />  
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOARCC_APB2Periph_GPIOBRCC_APB2Periph_AFIO, ENABLE);
}


void GPIO_Configuration(void)  //GPIO配置函(han)數
{
  //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_8GPIO_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線路掛起(qi)位
  EXTI_ClearITPendingBit(EXTI_Line8EXTI_Line9);
  //
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_Line = EXTI_Line8EXTI_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; // 注意(yi)名稱是“_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);
 }
}

 

 

中(zhong)斷文件(jian)  it.c中(zhong)

 

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);
  }
}

發表評(ping)論(lun)】【告訴(su)好友】【收藏此文】【關閉窗口

重庆体彩网官网

重庆体彩网官网

重庆体彩网官网 | 下一页