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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5239|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32學(xué)習(xí)筆記1:GPIO口的使用

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:85109 發(fā)表于 2015-7-9 00:15 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
順序點(diǎn)亮LED
摸索了很久之后終于把ARM開發(fā)板上的LED燈點(diǎn)亮了,雖然是很簡(jiǎn)單的一個(gè)IO口操作,但是由于以前從來都沒有什么經(jīng)驗(yàn),所以浪費(fèi)了很多時(shí)間,也查找了很多資料,F(xiàn)在可以操作IO口了,證明邁出了學(xué)習(xí)ARM的第一步。
實(shí)驗(yàn)平臺(tái)清單如下:
開發(fā)板:             奮斗STRIVE V3
核心芯片:         STM32F103VET6
開發(fā)環(huán)境:         RealView MDK-ARM Version:3.50
PC操作系統(tǒng):    Windows 7 家庭普通版
仿真器:             SEGGER J-Link
其中,STM32F103VET6芯片是基于ARM Cortex-M3內(nèi)核的,具體技術(shù)參數(shù)請(qǐng)參考ST公司給出的芯片資料(http://www.st.com/internet/com/T ... HEET/CD00191185.pdf)。關(guān)于該芯片的其他資料,可以在http://www.st.com/cn/mcu/product/164491.jsp上找到。如果對(duì)RealView MDK不熟悉的話,可以參考ARM RealView系列叢書《ARM開發(fā)工具RealView MDK使用入門》,李寧編著,北京航空航天大學(xué)出版社出版。如果對(duì)于STM32不熟悉的話,可以參考ARM RealView MDK系列叢書《基于MDK的STM32處理器開發(fā)應(yīng)用》,李寧編著,北京航空航天大學(xué)出版社出版。
當(dāng)軟硬件平臺(tái)都準(zhǔn)備好之后,就可以開始新的工程了。對(duì)于一個(gè)初學(xué)者來說,新建一個(gè)可以運(yùn)行的工程其實(shí)是有難度的,因?yàn)楦静恢缽暮蜗率。因此,我將每一步?xì)節(jié)都描述出來,以便于即使是初學(xué)者也能很好的理解ARM的初級(jí)操作。
打開MDK開發(fā)平臺(tái),在菜單欄中單擊“Project - New μVisionProject”創(chuàng)建一個(gè)新的工程。然后在彈出的“Select Device for Target1”對(duì)話框中選擇合適的芯片。由于我采用的是STM32F103VET6,所以選擇ST – STM32F103VE。
選擇好芯片之后,會(huì)彈出一個(gè)消息框,“Copy STM32 Startup Code to Project Folder and Add File toProject?”問你是否需要加載啟動(dòng)代碼。選擇“是”后進(jìn)入工程。
所謂啟動(dòng)代碼,就是處理器在啟動(dòng)的時(shí)候執(zhí)行的一段代碼,主要任務(wù)是初始化處理器模式,設(shè)置堆棧,初始化變量等等。由于以上的操作均與處理器體系結(jié)構(gòu)和系統(tǒng)配置密切相關(guān),所以一般由匯編來編寫。而對(duì)于初學(xué)者而言,自己設(shè)計(jì)啟動(dòng)代碼有一定的難度,MDK開發(fā)平臺(tái)內(nèi)置了一些常用芯片的啟動(dòng)代碼,因此在新建工程的時(shí)候,最好是采用默認(rèn)的啟動(dòng)代碼。當(dāng)然,芯片制造廠商也會(huì)自己編寫一些啟動(dòng)代碼,放在官網(wǎng)上供開發(fā)者下載。
進(jìn)入工程之后,我們就可以開始寫代碼了。首先得新建一個(gè)文件,然后將其保存成為*.c的格式,這樣開發(fā)環(huán)境就可以識(shí)別出編寫的代碼里面一些常用的關(guān)鍵字和其他信息了。我就直接保存成為main.c。然后在屏幕左邊的Project Workspace中的Source Group 1單擊右鍵,選擇Add Files to Group “ Source Group1”,將我們剛剛保存起來的main.c添加到Source Group 1中,或者直接雙擊Source Group 1,也可以添加文件。
接下來就可以開始寫代碼了,對(duì)于初學(xué)者而言,最基礎(chǔ)的操作應(yīng)該是對(duì)芯片IO口的操作了。因此我在學(xué)習(xí)ARM的時(shí)候,第一個(gè)工程就選擇了讓開發(fā)板上的3個(gè)LED燈順序點(diǎn)亮。STM32F103VET6中一共有A-G共7組通用輸入輸出接口(General-PurposeInputs/Outputs),每個(gè)GPIO引腳都可以由軟件配置成輸出(推挽或開漏)、輸入(帶或不帶上拉或下拉)或復(fù)用的外設(shè)功能端口。多數(shù)GPIO引腳都與數(shù)字或模擬的復(fù)用外設(shè)共用。具體的細(xì)節(jié)請(qǐng)參考Datasheet。在《基于MDK的STM32處理器開發(fā)應(yīng)用》一書中,“7.1 通用IO端口”詳細(xì)描述了各個(gè)端口的功能、寄存器格式以及其他相關(guān)信息,因此就不在這里贅述了。
回到MDK開發(fā)平臺(tái),現(xiàn)在要在main.c中加入相關(guān)代碼了。代碼清單如下:
#include "stm32f10x_lib.h"

int main()
{
      int i;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOB,ENABLE);                                                        //開啟外設(shè)時(shí)鐘
      GPIOD->CRL = 0x33333333;                          //設(shè)置端口配置寄存器
      GPIOB->CRL = 0x33333333;
      while(1)
      {            
             GPIOD->ODR = 0xffffffbf;                      //設(shè)置端口輸出寄存器
             for(i=0;i<1000000;i++);                                  //延時(shí)
             GPIOD->ODR = 0xffffffff7;
             for(i=0;i<1000000;i++);
             GPIOD->ODR = 0x00000000;
             GPIOB->ODR = 0xffffffff;
             for(i=0;i<1000000;i++);
             GPIOB->ODR = 0x00000000;
      }
}
上述代碼中,#include"stm32f10x_lib.h"包含了開發(fā)stm32f10x系列芯片所需的基本頭文件,在進(jìn)行程序編寫的時(shí)候,務(wù)必要包含此頭文件。
RCC_APB2PeriphClockCmd()函數(shù)是設(shè)置外設(shè)時(shí)鐘。ARMC51單片機(jī)不同的是,不用外設(shè)的時(shí)候,如IO口、ADC、定時(shí)器等等,都是禁止時(shí)鐘的,以達(dá)到節(jié)能的目的,只有要用到的外設(shè),才開啟它的時(shí)鐘。因此在需要用到GPIOB和GPIOD的時(shí)候,我們需要先開啟它的時(shí)鐘,具體用到的是函數(shù)庫(kù)里面的函數(shù):
void RCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph, FunctionalState NewState)
其中,第一個(gè)參數(shù)需要指示要開啟什么端口的時(shí)鐘,RCC_APB2Periph_GPIOx就是開啟GPIOx的時(shí)鐘,第二個(gè)參數(shù)需要指示是開啟還是關(guān)閉,ENABLE/DISABLE。
開啟外設(shè)時(shí)鐘之后,然后就開始對(duì)GPIO的配置寄存器進(jìn)行設(shè)置了,具體設(shè)置方式參考《基于MDK的STM32處理器開發(fā)應(yīng)用》一書中,“7.1 通用IO端口”。While循環(huán)里面就是給GPIO的端口輸出寄存器賦值,由于我手上這款?yuàn)^斗開發(fā)板的三個(gè)LED燈分別接的是D3、D6和B5,所以只要將D端口和B端口相應(yīng)的位上置1就可以了。
編譯之后我們發(fā)現(xiàn)編譯器報(bào)錯(cuò),Undefined symbol RCC_APB2PeriphClockCmd,是因?yàn)槲覀兪褂昧说腞CC_APB2PeriphClockCmd()函數(shù)在頭文件中聲明了,卻沒有在C文件中定義,這個(gè)函數(shù)在..KeilARMRV31LIBSTSTM32F10xstm32f10x_rcc.c中,將這個(gè)文件復(fù)制到工程的根目錄下,然后在屏幕左邊的Workspace中添加進(jìn)來,就可以了。
至于如何下載到ARM開發(fā)板中,不同的開發(fā)板有不同的方法,而開發(fā)板生產(chǎn)廠商一般都會(huì)將有關(guān)的文檔連同開發(fā)板一起附送,在此就不詳細(xì)贅述了。
其實(shí),在MDK的庫(kù)中,還定義了很多宏,可以避免讓我們自己去查找相關(guān)資料來設(shè)置寄存器的各個(gè)位。比如,在本次實(shí)驗(yàn)中,對(duì)于LED等的亮滅也可以通過以下代碼來實(shí)現(xiàn)。

#include "stm32f10x_lib.h"

int main()
{
      
      int i;
      GPIO_InitTypeDef GPIO_InitStructure;            //定義GPIO宏操作結(jié)構(gòu)體

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD |RCC_APB2Periph_GPIOB,ENABLE);              //外設(shè)時(shí)鐘配置,開啟GPIOBGPIOD的時(shí)鐘   

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                              
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;              //B5口配置為通用推挽輸出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //口線翻轉(zhuǎn)速度為50MHz
      GPIO_Init(GPIOB, &GPIO_InitStructure);                                //配置GPIOB
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;           //D3D6口配置為推挽輸出
      GPIO_Init(GPIOD, &GPIO_InitStructure);                                   //配置GPIOD

      while(1)
      {


             GPIO_SetBits(GPIOB, GPIO_Pin_5);                            //B5口輸出高電平
             GPIO_ResetBits(GPIOD, GPIO_Pin_6);                       //D6口輸出低電平
             GPIO_ResetBits(GPIOD, GPIO_Pin_3);                          //D3口輸出低電平

             for(i=0;i<1000000;i++);

             GPIO_ResetBits(GPIOB, GPIO_Pin_5);
             GPIO_ResetBits(GPIOD, GPIO_Pin_6);
             GPIO_SetBits(GPIOD, GPIO_Pin_3);

             for(i=0;i<1000000;i++);

             GPIO_ResetBits(GPIOB, GPIO_Pin_5);
             GPIO_ResetBits(GPIOD, GPIO_Pin_3);
             GPIO_SetBits(GPIOD, GPIO_Pin_6);

             for(i=0;i<1000000;i++);
      }
}

由于我們使用了GPIO_InitTypeDef類型,所以我們需要找到它的定義,這個(gè)定義包含在“…KeilARMRV31LIBSTSTM32F10xstm32f10x_gpio.c”中,將文件復(fù)制到工程根目錄下,然后再添加進(jìn)入工程中,編譯才不會(huì)報(bào)錯(cuò)。
在絕大多數(shù)C編譯器中,要求所有的變量聲明都在執(zhí)行語句塊之前,也就是說如果需要定義的變量需要先在進(jìn)入main函數(shù)一開始就全部定義好,如果執(zhí)行了某一條語句之后再定義變量的話,就會(huì)報(bào)錯(cuò)。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区免费在线观看 | 97精品国产97久久久久久免费 | 欧美日韩一区二区三区在线观看 | 国产精品视频一区二区三区四蜜臂 | 最新av中文字幕 | 91视频精选 | 日韩免费福利视频 | 91久久久久| 亚洲a视频| 麻豆国产一区二区三区四区 | 国产91丝袜在线播放 | 国产精品高 | 免费av手机在线观看 | 日韩国产在线 | 九九精品网 | 国产精久久久 | 超碰免费在线观看 | 亚洲网视频 | 欧美在线综合 | 日韩欧美国产不卡 | 在线小视频 | 久久精品日 | 日韩av看片 | 日韩精品 电影一区 亚洲 | 在线视频 亚洲 | 精品九九久久 | 亚洲69p | 北条麻妃国产九九九精品小说 | 91视频大全 | 91久久国产综合久久 | 久久成人18免费网站 | 欧美精品在线观看 | 蜜桃视频在线观看免费视频网站www | 91国内外精品自在线播放 | 中文字幕在线观看国产 | 福利视频二区 | 99精品久久99久久久久 | 91大神xh98xh系列全部 | 久久高清精品 | 日本免费一区二区三区 | 国产精品伦理一区 |