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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32單片機(jī)點亮LED燈

CHANBAEK ? 來源:南山府嵌入式 ? 作者:南山府嵌入式 ? 2023-03-01 17:20 ? 次閱讀

最近公司事情太多了,將近一個月沒有更新了。 我的想法是把我用到的所有單片機(jī)都更新一下(當(dāng)然不局限于這些,后期也會更新一些其他和嵌入式相關(guān)的知識點,我就想著先把STM32這整個更新完,再去更新其他的,包括STM32下 RTOS、UI(emwin,LVGL)還有一些項目上的經(jīng)驗什么的。 等STM32相關(guān)的更新完之后會寫其他的東西。 也會根據(jù)實際的情況進(jìn)行其他內(nèi)容的更新:我用過STM32 CH32、HC32F4、S32K148等,還有各種傳感器啥的。

從本章節(jié)開始我們進(jìn)行一個STM32實戰(zhàn)操作,為此我還特意畫了個簡單的板子。 是物聯(lián)網(wǎng)相關(guān)的,后面會設(shè)計一個BMS的板子來寫一下。

1-編寫第一個程序點亮LED

下面是原理圖,連接的是PC0-PC7引腳:

1static void Led_Cofig(void)
 2{
 3    /*定義一個GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
 4    GPIO_InitTypeDef GPIO_InitStructure;
 5    /*開啟LED相關(guān)的GPIO外設(shè)時鐘*/
 6    RCC_APB2PeriphClockCmd(LED_GPIO_CLCK, ENABLE);
 7    /*選擇要控制的GPIO引腳*/
 8    GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
 9    /*設(shè)置引腳模式為通用推挽輸出*/
10    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
11    /*設(shè)置引腳速率為50MHz */
12    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //(指的是內(nèi)部驅(qū)動電路的響應(yīng)速度,速度越大越快,一般情況是有多個不同的速度,也可根據(jù)自己的需要安排)
13    GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
14    /* 關(guān)閉led燈    */
15    GPIO_SetBits(LED_GPIO_PORT,  LED1_GPIO_PIN);
16}
1/*LED連接GPIO的定義,程序開發(fā)者如果要修改引腳只需要修改這里就好*/
 2#define LED_GPIO_PORT GPIOC                // GPIO端口定義,為了方便修改
 3#define LED_GPIO_CLCK RCC_APB2Periph_GPIOC /* GPIO端口時鐘 */
 4/*GPIO引腳*/
 5#define LED1_GPIO_PIN GPIO_Pin_0
 6#define LED2_GPIO_PIN GPIO_Pin_1
 7#define LED3_GPIO_PIN GPIO_Pin_2
 8#define LED4_GPIO_PIN GPIO_Pin_3
 9#define LED5_GPIO_PIN GPIO_Pin_4
10#define LED6_GPIO_PIN GPIO_Pin_5
11#define LED7_GPIO_PIN GPIO_Pin_6
12#define LED8_GPIO_PIN GPIO_Pin_7

2-代碼說明

1:GPIO_InitTypeDef GPIO_InitStructure 語句是聲明一個結(jié)構(gòu)體GPIO_InitStructure結(jié)構(gòu)體原型由GPIO_InitTypeDef確定(這點是C語言的基礎(chǔ)知識)設(shè)置完之后就可以對GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure); 進(jìn)行操作。

2:GPIO_SetBits()是庫函數(shù),可以對多個I/O口同時置1。

這里還有一個GPIO_ResetBits()庫函數(shù),可以對多個I/O口置0。

注釋和工程添加就不說了,網(wǎng)上相關(guān)的也挺多的。

GPIO_InitStructure.XXXX后面的speed什么的也不說了,不知道的可以去STM32知識篇看看。 這里主要講述函數(shù)配置什么的,畢竟是實戰(zhàn)嘛,指定是不能都介紹的。

3-main函數(shù)

1int main()
2{
3  LED_Init();
4  while (1)
5  {
6
7    GPIO_ResetBits(LED_GPIO_PORT, LED1_GPIO_PIN);
8  }
9}

因為接的是正極,點亮LED燈兩端需要電壓差,所以在這里使用GPIO_ResetBits才能點亮,如果你的一端接的是地,則是使用GPIO_SetBits。 這點要知道。 就是不管是哪種器件,只有保持電壓差才能進(jìn)行一個數(shù)據(jù)的接收,燈的點亮,我認(rèn)為是這樣的,可以說是所有的元器件芯片都是這樣的,但不是絕對的,只能說大部分。

上面點亮之后,我們這樣感覺修改太麻煩。 可以在頭文件之后對其設(shè)置一個宏定義函數(shù),如下:

1/*標(biāo)準(zhǔn)庫點亮LED燈*/
2/*當(dāng)a=0時,LED燈滅,當(dāng)LED=1時,LED燈亮*/
3#define LED1(a)                                       \\
4    if (a)                                            \\
5    {                                                 \\
6        GPIO_ResetBits(LED_GPIO_PORT, LED1_GPIO_PIN); \\
7    }                                                 \\
8    else                                              \\
9        GPIO_SetBits(LED_GPIO_PORT, LED1_GPIO_PIN);

當(dāng)a=1時,燈亮,0時燈滅。

1int main()
2{
3  LED_Init();
4  while (1)
5  {
6    //GPIO_ResetBits(LED_GPIO_PORT,LED1_GPIO_PIN);
7    LED1(1);
8  }
9}

下面說一說位操作,這是嵌入式開發(fā)中最常用的。

5-位操作

什么是位操作,我認(rèn)為位操作就是吃羊肉串,從前面吃,從后面吃,從中間吃這樣的。 但是官方說法比我這好聽。 其實位操作操作的是二進(jìn)制或者十六進(jìn)制這樣的,你看像不像你在吃羊肉串,比如二進(jìn)制0b0000 0001,你看從后面讀取就相當(dāng)于你從后面開始吃羊肉串。 下面說正經(jīng)的。

我們對上面這個表進(jìn)行一些介紹和使用說明

  1. 在不改變其他位的狀況下,對某幾個位賦值

針對這種情況,應(yīng)該怎么做才能實現(xiàn)對某幾個位賦值呢? 我們可以把“&”和“|” 兩個位操作結(jié)合起來使用,步驟如下。

(1)先對需要設(shè)置的位用“&”操作符進(jìn)行清零操作。

(2)再用“|” 操作符賦值。

例如,在初始化時,若配置PD8引腳為推挽輸出、速度為50 MHz,需將GPIOD->CRH的0~3位設(shè)置為3(即二進(jìn)制0011B),這時可先對寄存器的0~3位進(jìn)行“&”清零操作。

1GPIOD->CRH&=0Xfffffff0;      //清掉原來的設(shè)置,同時不影響其他位設(shè)置

然后再與需要設(shè)置的值進(jìn)行“|” 運算:

1GPIOD->CRH|=0X00000003;     //設(shè)置0~3 位的值為3,不改變其他位的值
  1. 使用移位操作,提高代碼的可讀性

移位操作在STM32程序開發(fā)中也非常重要。 比如在初始化時,若需要使能GPIOD口的時鐘,就可使用移位操作來實現(xiàn),使能PORTD時鐘的語句是:

1RCC->APB2ENR|=1<<5;

使能GPIOD和GPIOE口時鐘的語句是:

1RCC->APB2ENR|=3<<5;

這個左移位操作,就是將RCC->APB2ENR寄存器的第5位設(shè)置為1,使能PORTD時鐘。 為什么要通過左移而不是直接設(shè)置一個固定的值來對寄存器進(jìn)行操作呢? 其實,這樣做是為了提高代碼的可讀性以及可重用性。 讀者可以很直觀明了地看到,這行代碼是將第5位設(shè)置為1。 如果寫成:

1RCC->APB2ENR =0x00000020;

但是這樣代碼寫出來不太友好,首先是不可重復(fù)使用,其次真煩呀。 反正這種挺多的,大家可以自己多練練。

  1. 取反位操作的應(yīng)用

SR寄存器的每一位都代表一個狀態(tài)。 在某個時刻,我們希望設(shè)置某一位為0,同時其他位都保留為1,簡單的做法是直接給寄存器設(shè)置一個值。

1TIMx->SR=0xF7FF;

上述代碼設(shè)置第11位為0,但代碼可讀性不太友好。 但是我們可以這樣寫:

1#define TIM_FLAG_Update   ((uint16_t)0x0001)
2TIMx->SR &=~(TIM_FLAG_Update <<11);

從上面的代碼中,我們可以從第一條語句看出,宏定義了TIM_FLAG_Update第0位是1,其他位是0; 第二條語句讓TIM_FLAG_Update左移11位取反,第11位就為0,其他位都為1; 最后通過按位與操作,使第11位為0,其他位保持不變。 這樣,讀者就能很容易地看明白代碼,所以代碼的可讀性也就非常強的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6040

    文章

    44594

    瀏覽量

    636941
  • 嵌入式
    +關(guān)注

    關(guān)注

    5088

    文章

    19158

    瀏覽量

    306483
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1592

    瀏覽量

    108188
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10915

    瀏覽量

    356775
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    817

    瀏覽量

    119769
收藏 人收藏

    評論

    相關(guān)推薦

    單片機(jī)入門之點亮LED

    上一章中我們已經(jīng)認(rèn)識了單片機(jī),并且完成了開發(fā)環(huán)境的搭建,這章中我們正式開始進(jìn)入單片機(jī)編程的學(xué)習(xí),本章的學(xué)習(xí)目標(biāo)是 點亮一盞LED
    發(fā)表于 06-26 15:38 ?2679次閱讀
    <b class='flag-5'>單片機(jī)</b>入門之<b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    如何點亮51單片機(jī)LED?

    如何點亮51單片機(jī)LED
    發(fā)表于 11-04 07:36

    請問51單片機(jī)/STM32單片機(jī)/嵌入式Linux是如何點亮LED的?

    請問51單片機(jī)/STM32單片機(jī)/嵌入式Linux是如何點亮LED的?
    發(fā)表于 11-22 07:44

    LED點亮程序

    LED點亮程序,適合初學(xué)者使用,單片機(jī)c語言程序。
    發(fā)表于 03-15 10:42 ?6次下載

    使用51單片機(jī)Keil工程建立點亮LED的詳細(xì)教程說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用51單片機(jī)Keil工程建立點亮LED的詳細(xì)教程說明。
    發(fā)表于 07-17 17:39 ?2次下載
    使用51<b class='flag-5'>單片機(jī)</b>Keil工程建立<b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>的詳細(xì)教程說明

    如何使用單片機(jī)點亮LED

    我們學(xué)單片機(jī),第一個程序就是點亮一盞LED,那么我單片機(jī)開啟面向?qū)ο蠓绞降牡谝徊揭彩?b class='flag-5'>點亮一盞
    發(fā)表于 07-16 17:39 ?4次下載
    如何使用<b class='flag-5'>單片機(jī)</b><b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    單片機(jī)控制LED點亮的實驗資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)控制LED點亮的實驗資料說明
    發(fā)表于 07-01 16:49 ?17次下載
    <b class='flag-5'>單片機(jī)</b>控制<b class='flag-5'>LED</b><b class='flag-5'>燈</b><b class='flag-5'>點亮</b>的實驗資料說明

    使用單片機(jī)點亮LED的程序和工程文件免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用單片機(jī)點亮LED的程序和工程文件免費下載。
    發(fā)表于 09-25 17:33 ?15次下載
    使用<b class='flag-5'>單片機(jī)</b><b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>的程序和工程文件免費下載

    51單片機(jī)——LED點亮

    點亮LED原理單片機(jī)點亮LED 利用LED陽極為正陰極為負(fù)才會導(dǎo)通
    發(fā)表于 11-11 19:21 ?19次下載
    51<b class='flag-5'>單片機(jī)</b>——<b class='flag-5'>LED</b><b class='flag-5'>燈</b>的<b class='flag-5'>點亮</b>

    【藍(lán)橋杯】單片機(jī)學(xué)習(xí)(2)——點亮LED

    為例,下同)#include "reg52.h" //此文件中定義了一些特殊功能寄存器sbit led=P2^0; //將單片機(jī)的P2.0端口定義為ledvoid main(){ while(1) { led=0; //P
    發(fā)表于 11-14 12:21 ?0次下載
    【藍(lán)橋杯】<b class='flag-5'>單片機(jī)</b>學(xué)習(xí)(2)——<b class='flag-5'>點亮</b><b class='flag-5'>LED</b>小<b class='flag-5'>燈</b>

    單片機(jī)零基礎(chǔ)入門(1):點亮1個LED

    單片機(jī)入門,相信大家都知道,都是用代碼點亮第一個LED開始的吧。單片機(jī)簡單在于,只需要0和1就控制單片
    發(fā)表于 11-18 15:21 ?15次下載
    <b class='flag-5'>單片機(jī)</b>零基礎(chǔ)入門(1):<b class='flag-5'>點亮</b>1個<b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    51單片機(jī)---點亮LED

    )單片機(jī)編程/***點亮一顆***/sbit LED1 = P1^0; //位定義sbit 標(biāo)識符 = 地址值 地址中的'P'要大寫...
    發(fā)表于 11-20 19:06 ?3次下載
    51<b class='flag-5'>單片機(jī)</b>---<b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    51單片機(jī)——點亮一個LED

    51單片機(jī)——點亮一個LED文章目錄51單片機(jī)——點亮一個
    發(fā)表于 11-23 18:06 ?16次下載
    51<b class='flag-5'>單片機(jī)</b>——<b class='flag-5'>點亮</b>一個<b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    基于單片機(jī)點亮LED

    單片機(jī)點亮LED就像用C語言輸出“hello world”一樣,是入門的第一課。
    的頭像 發(fā)表于 05-24 14:25 ?1859次閱讀
    基于<b class='flag-5'>單片機(jī)</b><b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    基于51單片機(jī)點亮LED

    入門51單片機(jī)第一步,就是學(xué)會點亮一個LED,這是所有初次接觸單片機(jī)開發(fā)的小伙伴的必經(jīng)之路,管你現(xiàn)在是不是大牛,當(dāng)年肯定歷經(jīng)此事。
    發(fā)表于 07-11 11:38 ?1809次閱讀
    基于51<b class='flag-5'>單片機(jī)</b><b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>