久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網(wǎng) >> STM32 >> 瀏覽文章

第二講 STM32庫開發(fā)和流水燈

作者:鵬心飛漾   來源:轉(zhuǎn)自鵬心飛漾   點擊數(shù):  更新時間:2014年07月28日   【字體:
一、庫開發(fā)
 
這里指的庫開發(fā)使之調(diào)用庫函數(shù)接口完成對相應寄存器的設置,相比較與51單片機編程中直接對寄存器操作而言,代碼量跟查找手冊看寄存器位再去配置,能節(jié)約很多時間。但是相對的對寄存器的位操作看得就沒拿明白了,不知道庫函數(shù)接口是如何配置各個寄存器位的了,這個時候可以將函數(shù)名復制下來去STM32固件庫使用手冊中查看相應了用法了。如下圖所示復制了庫函數(shù)之后,打開STM32固件庫使用手冊,復制到這里
 


 
然后回車,就會跳到相應的庫函數(shù)說明那里,一下就清楚了它是如何配置寄存器位的,如下圖
 


這個函數(shù)解釋的很清楚了,使能和失能APB1的外設時鐘,如果不理解參數(shù)是什么,可以復制參數(shù)能在末尾的表中找到相應的參數(shù)解釋。
 
說一下我對庫開發(fā)的理解,最好的辦法就是在別人的例程上修改,節(jié)約時間,框架已經(jīng)搭建好了,只用配置成和自己開發(fā)板對應的就行了。這是上上之策,新手最好選擇這個辦法,現(xiàn)在網(wǎng)上的例程還是挺多的,不然作為一個連函數(shù)名都不知道的新手難道要去固件庫一個一個翻看函數(shù),浪費時間不說,還不一定有效果,太打消積極性了。至于對寄存器直接進行配置,我個人不反對也不支持,感覺各有各的優(yōu)點,如果你老手了,可以建議選擇用直接配置寄存器去寫程序,這樣代碼自己看得清晰明了。下圖顯示了庫開發(fā)個直接配置寄存器開發(fā)的區(qū)別
 


關于ST庫的文件介紹可參考原子的:原子教你玩轉(zhuǎn)STM32初級篇,寫的很詳細,我在昨天的第一講里面已經(jīng)給出下載地址了,這里在貼一遍:http://pan.baidu.com/s/1kTgI7Y3
 
二、點亮流水燈
首先我們需要用到第一講中的建立好的模板,這里我一步一步很詳細的教你如何去點亮流水燈
1. 看開發(fā)板原理圖找到LED燈連接的GPIO( 通用輸入輸出)口,我這里使用的是神州三號開發(fā)板,
 
可以看到,對應 GPIO分別為GPIOF6 GPIOF7 GPIOF8 GPIOF9,而且是上拉輸入,只要控制GPIO端為低電平,就會點亮LED了,為高電平,LED滅。
找到了對應的GPIO了,然后該用到我們的模板了,這個時候新手可能會問該從哪里下手啊,怎么配置GPIO啊,用什么函數(shù)啊等等。方法就是我上面說的上上之策:使用別人寫好例程框架,修改成自己的。又會問:拿第一講新建的工程模板不就用不到了?此言差矣,個人認為新建工程模板不僅能讓初學者弄清楚各個文件的作用,而且對庫開發(fā)整體的框架理解會更加深入,最好是對照例程將別人的程序在自己的工程模板中重新編寫一份,這樣你對各個函數(shù)會更加熟悉,基本框架也會有自己的理解。
 
下面開始介紹如何編寫程序,首先打開別人的例程,看到工程文件目錄
 


可以看到在工程目錄下USER目錄下相比于我們自己建立的工程模板多了led.c led.h兩個文件,沒錯,這就是我們需要編寫的兩個文件,首先打開led.h
看到代碼如下:
led.h
 
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
#define ON  0
#define OFF 1
#define LED1(a) if (a) \
          GPIO_SetBits(GPIOF,GPIO_Pin_6); \
          else \
          GPIO_ResetBits(GPIOF,GPIO_Pin_6)
        
#define LED2(a) if (a) \
          GPIO_SetBits(GPIOF,GPIO_Pin_7); \
          else \
          GPIO_ResetBits(GPIOF,GPIO_Pin_7)
          
#define LED3(a) if (a) \
          GPIO_SetBits(GPIOF,GPIO_Pin_8); \
          else \
          GPIO_ResetBits(GPIOF,GPIO_Pin_8)
        
#define LED4(a) if (a) \
          GPIO_SetBits(GPIOF,GPIO_Pin_9); \
          else \
          GPIO_ResetBits(GPIOF,GPIO_Pin_9)
          
void LED_GPIO_Config(void);        
#endif

 
這里用到了兩個庫函數(shù)和一個用戶自定義函數(shù)
分別是:GPIO_SetBits(GPIOF,GPIO_Pin_x);
              GPIO_ResetBits(GPIOF,GPIO_Pin_x);
              void LED_GPIO_Config(void);  
很明顯前面兩個是對相應的GPIO管腳進行配置高地電平的,Set = 1 , Reset = 0
同時看上的宏定義和條件編譯,LED(ON)顯然就是對應的GPIO_ResetBits(GPIOF,GPIO_Pin_x);為什么呢?因為前面已經(jīng)介紹過電路原理圖了,低電平是點亮LED,所以Reset對應的是LED(ON);
 
接下來我們?nèi)タ纯磍ed.c中用戶自定義的函數(shù)是如何編寫的吧
 
led.c
#include "led.h"
void LED_GPIO_Config(void)
{
 
 GPIO_InitTypeDef GPIO_InitStructure;
 
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
 
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
 
 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 
 
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
 
 GPIO_Init(GPIOF,&GPIO_InitStructure);
 
 
 GPIO_SetBits(GPIOF,GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
}
 
 
雖然上面有注釋了,我還是一句一句來講解下
1. 定義了一個GPIO_InitTypeDef類型的結(jié)構(gòu)體,要想看到結(jié)構(gòu)體中的內(nèi)容,可以從stm32f10x.h中找到其結(jié)構(gòu)體內(nèi)部包含了哪些變量
2. 開啟GPIOF的外設時鐘,為什么要開啟外設時鐘呢?這里有必要解釋一下,因為STM32為了實現(xiàn)低功耗,設計了很復雜的時鐘系統(tǒng),每個外設配置使用前都要開啟外設時鐘,如果對stm32時鐘樹不是很了解,去看看STM32中文參考手冊吧,里面很詳細的介紹了STM32時鐘。
3. 連著看下面的三句,選擇要控制的GPIOF引腳、設置引腳模式為通用推挽輸出、設置引腳速率為50MHz。這里是選擇對應的GPIO管腳,設置輸出方式和配置引腳速率,因為stm32的GPIO有8中工作方式,不詳細介紹了,可自行去看stm32中文參考手冊。 出現(xiàn)了兩個新的結(jié)構(gòu)體GPIO_InitStructure.GPIO_Mode 和GPIO_InitStructure.GPIO_Speed,找其出處參考前面尋找GPIO_InitTypeDef
4.  GPIO_Init(GPIOF,&GPIO_InitStructure);很明顯是把上面配置的信息寫入這個結(jié)構(gòu)體中,也叫對引腳配置的初始化
5. 置為高電平,關閉LED燈
 
照著上面的例子將看是否對應你自己開發(fā)板的GPIO和LED,如果不會一樣的,修改GPIO引腳就可以了,別忘了led.h中也要修改,等修改成中自己開發(fā)板對應的之后,我們?nèi)憁ain函數(shù),因為我們知道,程序的起點是從main函數(shù)開始執(zhí)行的
main.c
 
#include "stm32f10x.h"
#include "led.h"
void Delay(__IO u32 nCount);


int main(void)
{
 
 LED_GPIO_Config();
 
 while(1)
 {
  LED1(ON);
  Delay(0x0FFFEF);
  LED1(OFF);
  
  LED2(ON);
  Delay(0x0FFFEF);
  LED2(OFF);
  
  LED3(ON);
  Delay(0x0FFFEF);
  LED3(OFF);
  
  LED4(ON);
  Delay(0x0FFFEF);
  LED4(OFF);
 
}
void Delay(__IO u32 nCount)
{
 for(; nCount !=0; nCount--);
}
 
這個程序就不詳細介紹了,就是點亮一個燈,延時然后關掉,唯一要是的是延時程序中 __IO u32這個數(shù)據(jù)類型,32對應就是32位數(shù)據(jù)了,我們使用庫開發(fā)時,庫文件中已經(jīng)把原本的unsigned int\char宏定義為u32 u16 u8等等數(shù)據(jù)類型了,這樣我們使用起來是不是很方便,這就是庫開發(fā)的好處之一了。
如果到了這一步,恭喜你,可以點亮流水燈了,我們編譯的時候只選擇編譯的前兩個編譯按鈕就行了,第三個是將所有的文件都重新編譯一次,耗時巨大。然后插上J-Link仿真線接通開發(fā)板電源,點擊Load,程序就會自動下載到開發(fā)板了,我們就會看到開發(fā)板上的四個LED燈循環(huán)的亮起來了,是不很開心!這就對了,當一個新手第一次完成一個小程序而且能看到自己的成果出現(xiàn)在眼前時確實是很激動的,想當初我在大學的時候?qū)W習51,點亮LED燈那個激動!跨出第一步,先給自己信心和力量,相信自己你可以的!
關閉窗口

相關文章

主站蜘蛛池模板: 91精品国产日韩91久久久久久 | 三级av网站| 国产探花在线精品一区二区 | 日韩欧美精品在线 | 黄色一级视频免费看 | 久久日韩精品 | 日韩福利一区 | 亚洲综合激情网 | 久久亚洲免费视频 | 黄色片免费在线观看 | 久久久久一 | 天天干影院 | 三级a做爰全过程 | 在线看片a | 欧美精品在线视频 | 日韩中文字幕在线观看 | 久久一二三区 | 色婷婷在线视频 | 日本少妇做爰全过程毛片 | 日韩二区三区 | 在线视频日韩 | 欧美成人午夜 | 亚洲自拍偷拍视频 | 亚洲激情欧美激情 | 亚洲第一区在线观看 | 三级黄色片网站 | av怡红院| 岛国在线视频 | 久草久草久草 | www.国产精品 | 日韩精品中文字幕在线观看 | 日本毛片在线观看 | 免费成人在线看 | 日韩久久久久久 | 香蕉在线观看 | 亚洲国产天堂 | 一区二区三区视频在线播放 | 亚洲精品视频免费观看 | 国产免费一区二区三区免费视频 | av在线播放网站 | 久久黄色免费视频 |