娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月11日(星期三)

2020年06月11日 | STM32學(xué)習(xí)筆記(1):GPIO口的使用

發(fā)布者:HappyHearted 來源: eefocus關(guān)鍵字:STM32  GPIO口  Cortex-M3 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

摸索了很久之后終于把ARM開發(fā)板上的LED燈點(diǎn)亮了,雖然是很簡單的一個(gè)IO口操作,但是由于以前從來都沒有什么經(jīng)驗(yàn),所以浪費(fèi)了很多時(shí)間,也查找了很多資料。現(xiàn)在可以操作IO口了,證明邁出了學(xué)習(xí)ARM的第一步。


實(shí)驗(yàn)平臺清單如下:

開發(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ù)請參考ST公司給出的芯片資料(http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00191185.pdf)。關(guān)于該芯片的其他資料,可以在http://www.st.com/cn/mcu/product/164491.jsp上找到。如果對RealView MDK不熟悉的話,可以參考ARM RealView系列叢書《ARM開發(fā)工具RealView MDK使用入門》,李寧編著,北京航空航天大學(xué)出版社出版。如果對于STM32不熟悉的話,可以參考ARM RealView MDK系列叢書《基于MDK的STM32處理器開發(fā)應(yīng)用》,李寧編著,北京航空航天大學(xué)出版社出版。

當(dāng)軟硬件平臺都準(zhǔn)備好之后,就可以開始新的工程了。對于一個(gè)初學(xué)者來說,新建一個(gè)可以運(yùn)行的工程其實(shí)是有難度的,因?yàn)楦静恢缽暮蜗率帧R虼耍覍⒚恳徊郊?xì)節(jié)都描述出來,以便于即使是初學(xué)者也能很好的理解ARM的初級操作。


打開MDK開發(fā)平臺,在菜單欄中單擊“Project - New μVision Project”創(chuàng)建一個(gè)新的工程。然后在彈出的“Select Device for Target 1”對話框中選擇合適的芯片。由于我采用的是STM32F103VET6,所以選擇ST – STM32F103VE。


選擇好芯片之后,會彈出一個(gè)消息框,“Copy STM32 Startup Code to Project Folder and Add File to Project?”問你是否需要加載啟動(dòng)代碼。選擇“是”后進(jìn)入工程。

所謂啟動(dòng)代碼,就是處理器在啟動(dòng)的時(shí)候執(zhí)行的一段代碼,主要任務(wù)是初始化處理器模式,設(shè)置堆棧,初始化變量等等。由于以上的操作均與處理器體系結(jié)構(gòu)和系統(tǒng)配置密切相關(guān),所以一般由匯編來編寫。而對于初學(xué)者而言,自己設(shè)計(jì)啟動(dòng)代碼有一定的難度,MDK開發(fā)平臺內(nèi)置了一些常用芯片的啟動(dòng)代碼,因此在新建工程的時(shí)候,最好是采用默認(rèn)的啟動(dòng)代碼。當(dāng)然,芯片制造廠商也會自己編寫一些啟動(dòng)代碼,放在官網(wǎng)上供開發(fā)者下載。


進(jìn)入工程之后,我們就可以開始寫代碼了。首先得新建一個(gè)文件,然后將其保存成為*.c的格式,這樣開發(fā)環(huán)境就可以識別出編寫的代碼里面一些常用的關(guān)鍵字和其他信息了。我就直接保存成為main.c。然后在屏幕左邊的Project Workspace中的Source Group 1單擊右鍵,選擇Add Files to Group “ Source Group 1”,將我們剛剛保存起來的main.c添加到Source Group 1中,或者直接雙擊Source Group 1,也可以添加文件。


接下來就可以開始寫代碼了,對于初學(xué)者而言,最基礎(chǔ)的操作應(yīng)該是對芯片IO口的操作了。因此我在學(xué)習(xí)ARM的時(shí)候,第一個(gè)工程就選擇了讓開發(fā)板上的3個(gè)LED燈順序點(diǎn)亮。STM32F103VET6中一共有A-G共7組通用輸入輸出接口(General-Purpose Inputs/Outputs),每個(gè)GPIO引腳都可以由軟件配置成輸出(推挽或開漏)、輸入(帶或不帶上拉或下拉)或復(fù)用的外設(shè)功能端口。多數(shù)GPIO引腳都與數(shù)字或模擬的復(fù)用外設(shè)共用。具體的細(xì)節(jié)請參考Datasheet。在《基于MDK的STM32處理器開發(fā)應(yīng)用》一書中,“7.1 通用IO端口”詳細(xì)描述了各個(gè)端口的功能、寄存器格式以及其他相關(guān)信息,因此就不在這里贅述了。


回到MDK開發(fā)平臺,現(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í)鐘。ARM與C51單片機(jī)不同的是,不用外設(shè)的時(shí)候,如IO口、ADC、定時(shí)器等等,都是禁止時(shí)鐘的,以達(dá)到節(jié)能的目的,只有要用到的外設(shè),才開啟它的時(shí)鐘。因此在需要用到GPIOB和GPIOD的時(shí)候,我們需要先開啟它的時(shí)鐘,具體用到的是函數(shù)庫里面的函數(shù):


void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

其中,第一個(gè)參數(shù)需要指示要開啟什么端口的時(shí)鐘,RCC_APB2Periph_GPIOx就是開啟GPIOx的時(shí)鐘,第二個(gè)參數(shù)需要指示是開啟還是關(guān)閉,ENABLE/DISABLE。


開啟外設(shè)時(shí)鐘之后,然后就開始對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)廠商一般都會將有關(guān)的文檔連同開發(fā)板一起附送,在此就不詳細(xì)贅述了。


其實(shí),在MDK的庫中,還定義了很多宏,可以避免讓我們自己去查找相關(guān)資料來設(shè)置寄存器的各個(gè)位。比如,在本次實(shí)驗(yàn)中,對于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í)鐘配置,開啟GPIOB和GPIOD的時(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; //將D3和D6口配置為推挽輸出

       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)入工程中,編譯才不會報(bào)錯(cuò)。

在絕大多數(shù)C編譯器中,要求所有的變量聲明都在執(zhí)行語句塊之前,也就是說如果需要定義的變量需要先在進(jìn)入main函數(shù)一開始就全部定義好,如果執(zhí)行了某一條語句之后再定義變量的話,就會報(bào)錯(cuò).

關(guān)鍵字:STM32  GPIO口  Cortex-M3 引用地址:STM32學(xué)習(xí)筆記(1):GPIO口的使用

上一篇:發(fā)現(xiàn)STM32的SPI2有問題(invalid)
下一篇:STM32學(xué)習(xí)筆記之GPIO的基本使用

推薦閱讀

近日,Nawa Technologies官方表示,在融入碳納米超級電容器后鋰電池充電速度有明顯提升,重量也有明顯下降,在應(yīng)用于電動(dòng)汽車上能夠增加續(xù)航里程和性能輸出。這家位于法國馬賽的創(chuàng)業(yè)公司,正在研發(fā)新型電池,在問世后相信會給傳統(tǒng)電動(dòng)汽車行業(yè)帶來顛覆性改變。Nawa Technologies的核心產(chǎn)品是一種新型碳納米超級電容器,相比較傳統(tǒng)鋰電池在諸多方面有著顯...
這篇文章可能不會太受歡迎,不過我還是想說說,很多時(shí)候形成了一種氛圍時(shí),敢于講幾句真心話,還是較難的,不過天天講違心的話,那有什么價(jià)值?最近一段時(shí)間聯(lián)想是被黑得慘了,不管是說一句,或是一件什么事件,聯(lián)想都會被眾人用放大鏡來進(jìn)行檢視,不斷生出各種謠言,每一位聯(lián)想高管的講話,都會斷章取義的編成段子,加以放大。像任正非說我們?nèi)叶枷矚g蘋...
OPPO介紹了ColorOS的一項(xiàng)新功能:AI應(yīng)用預(yù)啟動(dòng)。官方介紹,ColorOS AI應(yīng)用預(yù)啟動(dòng)讓應(yīng)用啟動(dòng)速度更快、更懂你。它基于AI模型,學(xué)習(xí)用戶在晨起、午間、夜間、睡前時(shí)間段內(nèi)的高頻應(yīng)用,在各時(shí)間段內(nèi)預(yù)啟動(dòng)相關(guān)應(yīng)用,縮短應(yīng)用打開時(shí)長,減少應(yīng)用啟動(dòng)卡頓,大幅提升應(yīng)用啟動(dòng)效率。以打車軟件為例,ColorOS會系統(tǒng)學(xué)習(xí)用戶使用這款軟件的習(xí)慣,并提前預(yù)判用戶在8...
前天凌晨,蘋果帶來了近些年最幻滅的一次系統(tǒng)更新。沒有息屏顯示、沒有新的UI設(shè)計(jì),沒有什么驚艷的黑科技,只有大量安卓用戶耳熟能詳?shù)?ldquo;新功能”。難怪網(wǎng)友評價(jià):比起全新的系統(tǒng)版本,iOS 15更像是iOS 14的優(yōu)化版本,叫做iOS 14.8可能更適合。 不過,雖然iOS 15帶來的功能更新令人失望,但仍有部分網(wǎng)友毫不猶豫地選擇了嘗鮮Beta版。根據(jù)實(shí)際體驗(yàn),iOS...

史海拾趣

問答坊 | AI 解惑

畢業(yè)設(shè)計(jì)題目《基于DS12C887的LCD時(shí)鐘顯示》

本帖最后由 paulhyde 于 2014-9-15 09:08 編輯 請大俠幫忙!郵箱yuda868@163.com 不勝感謝!  …

查看全部問答∨

窮移動(dòng)通信之理

這是以前在其他地方下的,這個(gè)相當(dāng)不錯(cuò)的,絕對值得一看看,講的很好的…

查看全部問答∨

這年頭安防工程商不好過呀

由于早期的安防工程項(xiàng)目進(jìn)入技術(shù)的門檻比較低,大部分工程人員只要經(jīng)過短期培訓(xùn),懂得接插線就可以勝任安防工程的安裝、調(diào)試工作,而技術(shù)服務(wù)則依托供應(yīng)廠家的技術(shù)培訓(xùn)或現(xiàn)場服務(wù)來解決。安防工程商的核心競爭力還是著力于“人脈關(guān)系”的經(jīng)營,而維 ...…

查看全部問答∨

知道這里達(dá)人多,過來請教~~~~~~

我是學(xué)軟件的,現(xiàn)在是大二。現(xiàn)在想往嵌入式偏軟件方面學(xué)習(xí)。查了許多資料好像應(yīng)該是往Linux+arm9方面學(xué)習(xí)。不知道對不對。 下學(xué)期本院有操作系統(tǒng)、微機(jī)原理與接口技術(shù)、軟件工程概論、數(shù)據(jù)庫原理與實(shí)踐。  別的院有個(gè)叫《接口技術(shù)與單片 ...…

查看全部問答∨

第一次提問,關(guān)于USB驅(qū)動(dòng)

諸位,第一次來,想問大家個(gè)問題,USB設(shè)備使用In(1)  Out(2),那么PC主機(jī)驅(qū)動(dòng)要與USB設(shè)備通訊時(shí),也必須使用In(1)  Out(2)嗎?…

查看全部問答∨

關(guān)于GUI的移植問題for vxworks and wince

想做個(gè)VxWorks下的gui程序,盡管windml可以,但是操作太困難,想找個(gè)通用的庫? 因?yàn)橐郧俺绦蚴莣ince寫的,想在這個(gè)vxworks成功之后在改寫wince版本的,所以希望gui庫可以移植到wince下 高手給推薦下吧。…

查看全部問答∨

PCI所需資源是怎樣申請的?

我現(xiàn)在只知道內(nèi)存,IO是通過BAR寄存器申請所需資源的 那么中斷和DMA又是怎樣讓系統(tǒng)知道, 所需的資源呢? 是通過inf文件嗎?…

查看全部問答∨

vxworks源碼和tornado的target目錄的問題

剛開始接觸vxworks,現(xiàn)在在學(xué)習(xí)END驅(qū)動(dòng),看到tornado的target目錄下的src里面有個(gè)文件是templateEnd.c,有點(diǎn)不明白這里面的代碼和vxworks源碼里面的MUXDevLoad的關(guān)系是怎么樣的,是否在templateEnd.c里面提供的模板供我們在特定的芯片開發(fā)時(shí)按照上 ...…

查看全部問答∨

quartusII Programmable Pre-Emphasis 設(shè)置

Programmable Pre-Emphasis 設(shè)置芯片: ep3c5 想要把lvds接口上的Programmable Pre-Emphasis關(guān)掉,可是在assignment editor->logic option->io feature下面找不到這個(gè)選項(xiàng)。  請教大家,Programmable Pre-Emphasis在哪里可以設(shè)置? ...…

查看全部問答∨

初學(xué)者請教STM32的幾個(gè)問題,望好漢們不吝賜教!!

1、ST例程N(yùn)VIC/Example2中,用TIM2、TIM3、TIM4分別實(shí)現(xiàn)1S、2S、3S的定時(shí) 周期,采用的ARR值分別為4AFH,95FH,E0FH,預(yù)分頻數(shù)都是EA5FH,更新時(shí)產(chǎn)生中斷。照我的算法,定時(shí)周期是4AFH/(36MHZ/EA5FH)=2S,TIM3,TIM4分別是3S和4S,哪里算錯(cuò)了 ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 青海省| 赣州市| 黄骅市| 惠州市| 昭平县| 土默特右旗| 余姚市| 平安县| 休宁县| 雷波县| 藁城市| 大田县| 兰州市| 宜良县| 岐山县| 哈密市| 买车| 双辽市| 长兴县| 栖霞市| 米脂县| 江源县| 论坛| 阿图什市| 阿克| 凤山市| 榆林市| 贡觉县| 峨山| 巍山| 隆昌县| 天全县| 襄城县| 砀山县| 攀枝花市| 来宾市| 锡林郭勒盟| 秦皇岛市| 西和县| 陆川县| 确山县|