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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4123|回復: 0
打印 上一主題 下一主題
收起左側

奮斗stm32開發板學習日記3—GPIO點燈深究

[復制鏈接]
跳轉到指定樓層
樓主
GPIO操作之點亮LED:
準備工具:
  • 帶有led的開發板,
  • Jlink仿真器,
  • 開發板原理圖,
  • stm32參考手冊,
  • stm32固件庫手冊
上一篇例程中的結尾,我只是把點亮了led燈, 但是具體的如何是它點亮,并沒有說到,那么這一期教程就來探究探究其中的原理。
其實讓led亮滅的原理無非就是使控制該led燈pin口輸出高低電壓,51是這樣, stm32亦是這樣,但是因為后者內核架構比前者復雜許多, 所以就不能像51那樣單單用一句話就能搞定,但是萬變不離其宗,stm32點亮led的步驟一般如下:
  • 選定需要控制的引腳
  • 配置需要的特定功能
  • 設置GPIO口輸出電壓的高低。
首先咱們先來分析他的電路原理圖,

打開后找到控制led部分 ,清注意紅框圈出來的部分,這就是對應的pin腳。
了解完后他的硬件鏈接后,接下來我們就可以對這個pin口進行編程了,打開利器keil5 ,新建led工程,如何搭建開發環境,請參考我上一篇教程。
關鍵代碼如下:
查看原代碼
  • /* Includes ------------------------------------------------------------------*/
  • #include "stm32f10x.h"
  • GPIO_InitTypeDef GPIO_InitStructure; //定義一個GPIO類型的結構體。
  • void RCC_Configuration(void);
  • void LED_Config(void);
  • void Delay(__IO uint32_t nCount);
  • void LED_Config(void){
  • RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//開啟GPIOB的外部時鐘
  • GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//選擇要控制的GPIOB的pin腳
  • GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //設置引腳模式為推挽輸出
  • GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz /設置引腳的速率為50MHz
  • GPIO_Init(GPIOB, &GPIO_InitStructure); //調用庫函數初始化GPIOB
  • }
  • void RCC_Configuration(void)
  • {
  • SystemInit();
  • }
  • int main(void)
  • {
  • RCC_Configuration(); //初始化系統時鐘,設置為72MHz
  • LED_Config(); //配置led電燈參數
  • while (1)
  • {
  • GPIO_SetBits(GPIOB, GPIO_Pin_5); 設置PB5 為高電平 點亮
  • }
  • }

程序分析: 眾所周知, c程序是從main函數開始執行的, main函數里面首先的執行的是RCC_Configuration這個函數,
該函數的里面是systemInit這個函數,這個函數的作用是設置系統時鐘頻率為最大72mHz,();
接著繼續看, 程序執行LED_Confi()函數,程序首先執行這句RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 使能GPIO外部時鐘的, 為什么要使能呢 , 因為 stm32外設時鐘默認是處于關閉的, 所以我們要在初始化階段設置為開啟。
繼續看這三句;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5
PIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruture這是什么結構? 此時我們可以查詢 st官方庫說明文檔。 如圖所示:

該結構體里面含有Pin, Speed ,Mode這三個參數。 LED對應的pin腳上面的電路原理圖已經給出, 由于一端接地, 所以我們選用推挽輸出的方式。  這里補充一點,  選用什么輸出輸入方式, 輸出速率,ST官方都已經在代碼中給出定義,都可以查詢到。
GPIO_init()函數主要功能就是將剛才輸入的結構體參數寫入到GPIO相關的寄存器中, 這里主要用到了GPIOx_CRL, GPIOx_CRL,, 簡單的解釋下GPIOx_CRL,GPIOx_CRL是什么, 查詢stm32參考手冊,如圖:

CRL寄存器就是配置pin口的輸出或者輸入速度, 什么模式。從圖上可以發現 一個引腳口由2bit的mode(模式)和2bit的cnf(頻率)控制。 又因為每個GPIO結構組分有16個pin腳, 這就解釋了為什么會有CRL與CRH這兩個寄存器了。 到這里的話, 點亮led就已經全部待續了。
接著我們看SetBits函數的實現部分, 由圖可知:

GPIOx用了BSRR這個寄存器,如圖:

這個寄存器設置相關端口為1 或者 0。 相當于設置端口輸出高低電平。 這樣的話, 就點亮了。



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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久伊人精品一区二区三区 | 国产精品一区二区三区久久久 | 欧美一区二区小视频 | 精品一区二区三区在线观看国产 | 午夜无码国产理论在线 | 精品日韩一区二区 | 91免费在线视频 | 国产精品成人av | 国产精品99久久久精品免费观看 | 超碰97免费 | 日韩精品一区二区三区中文字幕 | 欧美中文在线 | 久婷婷 | 精品久久久久久亚洲国产800 | 欧美一区二区成人 | 日韩一区二区三区在线观看视频 | 日韩精品一区二区三区中文在线 | 中文字幕在线观看www | 日本精品视频一区二区 | 精品99久久 | 久久av资源网 | 国产一区二区 | 成人二区| 麻豆changesxxx国产| 黄在线| 一区二区三区四区日韩 | 一区二区三区欧美大片 | 国产成人精品a视频一区www | 色视频在线免费观看 | 香蕉婷婷 | 91精品国产91久久久久游泳池 | 亚洲电影第1页 | 中文字幕 在线观看 | 欧美a√ | 日韩精品久久一区 | 中文字幕中文字幕 | 欧美日韩视频在线播放 | 久久久青草婷婷精品综合日韩 | 国产成人免费 | 国产精品久久久久久52avav | 911精品国产 |