0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

通過STM32 GPIO口加上延時函數實現跑馬燈的教程

冬至子 ? 來源:小黑學習日記 ? 作者:小黑 ? 2023-07-26 15:27 ? 次閱讀

一、硬件電路

這里我們還是以stm32f103c8t6為例,并且我們以最小系統板的電路為例。以下是2種類型的最小系統板,區(qū)別在于一個是4pin的燒寫,一個是20pin的燒寫,但是電路基本一樣。

為了方便,我們使用板子上的LED為實驗對象。我們先來看板子上LED的電路,由于手頭上剛好有20pin燒寫的板,我就以這個為例吧。

圖片
(圖四)

學過電路的都會知道,LED燈亮的條件是什么,即只要我們在LED的兩端施加一個電壓差,使得LED兩端有了電壓差他就能亮。(記得區(qū)分正負哈)

由電路圖上,我們可以知道LED的正極已經接上了3.3V,負極接上了stm32的PC13的IO口上。由以上原理可得,只要我們將PC13輸出一個低電平,LED兩端就會有了電壓差,即LED就亮了。

而要制作跑馬燈,便是要讓燈閃爍起來,一亮一滅。由亮燈的原理可得我們只要在PC13輸出一個高電平那么LED便不會亮了。

然后在每一次的亮和滅之間我們加上一個固定時間的延時,就能實現出點燈的效果啦

二、軟件編程

原理以及現象講述完畢,接下來我們進入編程階段。首先我們先來了解stm32 IO口的編程的流程:

01

Num

使能時鐘: 時鐘就對于stm32就像心臟對于人類,所以編程的第一步自然是賦予stm32一顆跳動“心臟”;

02

Num

IO口初始化: stm32的IO有多個輸入和輸出的模式,有不同的速度,以及多個IO口所以這一步我們要對這些進行初始化;

03

Num

操作IO口: IO是輸出高電平還是低電平便是我們在這里要做的操作;

第1步:使能時鐘:

在這個工程中我們使用的PC13是掛載在APB2上的,我們要使能的時鐘便是對應的APB2;我們先來看看RCC函數庫中有什么函數

圖片

(圖二十一)

這里我們要調用的庫函數是:

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

這個函數有兩個入口的參數:RCC_APB2Periph、NewState;我們來看看這兩個參數是什么

圖片

(圖八)

圖片

(圖九)

從圖八可以看到的是,第一個參數的值是在圖上定義的那些,我們從中找到GPIOC,將RCC_APB2Periph_GPIOC復制下來作為要設置的參數;從圖九可以看到的是,第二個的參數只有兩個情況,一個是失能DISABLE,一個是使能ENABLE,這里我們要的是使能ENABLE;

綜上我們的時鐘使能函數的調用是這樣寫的:

void RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC

第2步:IO口初始化:

首先STM32的IO口可以由軟件配置成如下8種模式:

1、輸入浮空 2、輸入上拉 3、輸入下拉

4、模擬輸入 5、開漏輸出 6、推挽輸出

7、推挽式復用功能 8、開漏復用功能

有3種速度:2MHz;10MHz;50MHz;

還是一樣我們先來看GPIO的函數庫:

圖片

(圖十)

這里我們需要用到的函數是:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

這個函數包含有兩個參數分別是GPIOx、GPIO_InitStruct。第一個參數是用來指定GPIO,取值范圍為GPIOA—GPIOG

圖片

(圖十一)

這里我們要使用的是GPIOC;第二個參數是初始化參數結構體指針;

圖片

(圖十二)

這個結構體包含了3個成員變量,GPIO_Pin、GPIO_Speed、GPIO_Mode對應我們要設置的GPIO引腳、速度、模式,其中各個的取值范圍為:

圖片

(圖十三)

圖片

(圖十四)

圖片

(圖十五)

這里我們要用的是:

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13; //13引腳
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //速度為50MHz
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//模式為推挽輸出

綜上我們的GPIO初始化函數是這樣寫的:

GPIO_InitTypeDef GPIO_InitStruct ; //定義結構體變量
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13; //13引腳
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //速度為50MHz
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //模式為推挽輸出
GPIO_Init(GPIOC, &GPIO_InitStruct); //初始化GPIOC

第3步:操作IO:

這里我們要用到的函數已經在圖11中標注出來了;

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //將GPIO引腳置高電平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //將GPIO引腳置低電平

圖中寫的注釋我們可以簡單理解為是將GPIO口輸出高和低的函數;

這兩個的函數的參數都是一樣的,我們在上邊已經說過了,就不再復述了,我們這里要使用的是GPIOC以及GPIO_PIN_13;

綜上我們的GPIO操作函數是這樣寫的:

GPIO_SetBits(GPIOC,GPIO_Pin_13); //將GPIOC 13引腳輸出高電平
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //將GPIOC 13引腳輸出低電平

圖片

(圖十六)

我們的延時函數是這樣寫的(使用正點原子制作好的函數)

delay_ms(600);//延時600ms

三、實操

以上一篇新建的工程為模版(任意門:STM32新建工程(固件庫版))我們在那個工程的基礎上進行實操;

首先我們打開那個TEST文件,在HARDWARE文件夾中建立一個文件夾命名為LED。進入USER文件夾,打開 TEST.uvprojx(關注后綴名,工程名稱是自己命名的)的工程文件進入KEIL5;我們先編譯一遍(這里的圖忘了截,就放上一次的圖吧)

圖片

(圖一)

然后我們新建兩個文件,保存在剛剛新建的LED文件夾內,并分別命名為 LED.c以及LED.h,對應的是LED的函數和頭文件,并且分別添加到HARDWARE分組,以及頭文件中,操作跟新建工程時新建main函數文件和導入頭文件是一樣的,更加具體操作在新建工程篇已經講過了,就不復述了,完成后如圖

圖片

(圖十七)

然后我們打開LED.h編寫以下內容:

#ifndef __LED_H //頭文件定義
#define __LED_H
void LED_Init(void); //聲明LED初始化函數
#endif

圖片

(圖十八)

打開LED.c編寫LED初始化函數如下:

#include "LED.h"
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //時鐘使能GPIOC
//初始化GPIO PC.13
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13; //PIN13引腳
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //速度50mhz
GPIO_Init(GPIOC,&GPIO_InitStruct); //初始化GPIOC
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC13設置為高電平
}

這里我們LED初始化函數中多了一個將PC13設為高電平的操作,是為了讓程序燒寫進去后,LED的第一狀態(tài)是滅的,以便后續(xù)的操作;以及導入了庫函數的頭文件和LED的頭文件

圖片

(圖十九)

接著我們編寫主函數,如下:

#include "stm32f10x.h"
#include "LED.h"
#include "delay.h"
int main(void)
{
delay_init(); //延時初始化
LED_Init(); //LED初始化
while(1)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13); // PC13設置為高電平(亮)
delay_ms(600); //延時600ms
GPIO_ResetBits(GPIOC,GPIO_Pin_13); // PC13設置為低電平(滅)
delay_ms(600); //延時600ms
}
}

圖片

(圖二十)

在主函數我們要引入3個頭文件,固件庫的頭文件以及自己編寫的LED.h和延時函數的頭文件,之后我們才能調用需要的函數。我們在初始化之后用一個死循環(huán)將GPIO的電平設置不斷的循環(huán),通過延時函數將亮和滅之間有一個固定時間差,實現呼吸燈的效果。通過編譯之后,燒寫進stm32,就可以看如圖的呼吸燈的效果了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • led燈
    +關注

    關注

    22

    文章

    1588

    瀏覽量

    107405
  • RCC
    RCC
    +關注

    關注

    0

    文章

    93

    瀏覽量

    26807
  • 推挽電路
    +關注

    關注

    18

    文章

    111

    瀏覽量

    37654
  • GPIO
    +關注

    關注

    16

    文章

    1175

    瀏覽量

    51515
  • STM32F103C8T6
    +關注

    關注

    106

    文章

    160

    瀏覽量

    82505
收藏 人收藏

    評論

    相關推薦

    stm32捕獲占空比_嵌協|STM32實現呼吸燈庫函數版 精選資料分享

    創(chuàng)新放飛夢想,實踐鑄就未來 小黑上回說到通過STM32 GPIO加上延時
    發(fā)表于 08-10 06:09

    介紹STM32F429的GPIO應用之跑馬燈

    第18章 STM32F429的GPIO應用之跑馬燈本章教程為大家介紹STM32F429的GPIO應用之
    發(fā)表于 08-10 07:20

    LED跑馬燈實現方法

    GPIO簡介及其庫函數1. GPIO簡介2. 與GPIO有關的幾個常用庫函數一、LED跑馬燈
    發(fā)表于 12-09 06:26

    如何利用庫函數去點亮跑馬燈

    用庫函數點亮跑馬燈-STM32F103單片機學習單片機,很基礎的一個模塊就是點亮跑馬燈。點亮跑馬燈有三種方法,分別是庫
    發(fā)表于 01-12 07:52

    左右跑馬燈【匯編版】

    左右跑馬燈【匯編版】左右跑馬燈【匯編版】左右跑馬燈【匯編版】
    發(fā)表于 12-29 10:51 ?0次下載

    左右跑馬燈【C語言】

    左右跑馬燈【C語言】左右跑馬燈【C語言】左右跑馬燈【C語言】左右跑馬燈【C語言】
    發(fā)表于 12-29 10:50 ?7次下載

    跑馬燈程序【匯編版1】

    跑馬燈程序【匯編版1】跑馬燈程序【匯編版1】跑馬燈程序【匯編版1】跑馬燈程序【匯編版1】
    發(fā)表于 12-29 10:50 ?0次下載

    跑馬燈程序【C語言版】

    跑馬燈程序【C語言版】跑馬燈程序【C語言版】跑馬燈程序【C語言版】跑馬燈程序【C語言版】
    發(fā)表于 12-29 10:59 ?0次下載

    js實現無縫跑馬燈效果(圖片輪播滾動跑馬燈效果)

    介紹了js實現無縫跑馬燈效果以及使用JS實現圖片輪播滾動跑馬燈效果,小編分享了程序示例供大家參考,有需要的小伙伴可以看看。
    發(fā)表于 12-18 14:12 ?4.6w次閱讀

    STM32跑馬燈實驗

    STM32跑馬燈實驗
    發(fā)表于 11-21 18:36 ?14次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>跑馬燈</b>實驗

    STM32學習——GPIO應用之跑馬燈+蜂鳴器實驗

    GPIO應用——跑馬燈+蜂鳴器實驗跑馬燈和蜂鳴器的實驗都是使用的 GPIO 的通用推挽輸出模式,這是 GPIO 最簡單的一個基本功能。1
    發(fā)表于 12-04 11:21 ?8次下載
    <b class='flag-5'>STM32</b>學習——<b class='flag-5'>GPIO</b>應用之<b class='flag-5'>跑馬燈</b>+蜂鳴器實驗

    STM32CubeMX實例教程一——跑馬燈實驗

    STM32CubeMX實例教程一——跑馬燈實驗本章節(jié)將利用STM32CubeMX和Keil5協同開發(fā),實現跑馬燈。
    發(fā)表于 12-05 10:51 ?11次下載
    一 <b class='flag-5'>STM32</b>CubeMX實例教程一——<b class='flag-5'>跑馬燈</b>實驗

    stm32跑馬燈實驗

    stm32跑馬燈實驗
    發(fā)表于 12-07 11:21 ?25次下載
    <b class='flag-5'>stm32</b><b class='flag-5'>跑馬燈</b>實驗

    STM32跑馬燈配置流程

    函數介紹外圍設備時鐘使能函數 “RCC_APB2PeriphClockCmd”引腳狀態(tài)設置函數GPIO_Init引腳電平設置函數
    發(fā)表于 01-13 16:23 ?1次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>跑馬燈</b>配置流程

    跑馬燈實驗-庫函數

    電子發(fā)燒友網站提供《跑馬燈實驗-庫函數.ppt》資料免費下載
    發(fā)表于 10-09 18:22 ?0次下載