色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

基于STM32單片機點亮LED燈

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

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

從本章節開始我們進行一個STM32實戰操作,為此我還特意畫了個簡單的板子。 是物聯網相關的,后面會設計一個BMS的板子來寫一下。

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

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

1static void Led_Cofig(void)
 2{
 3    /*定義一個GPIO_InitTypeDef類型的結構體*/
 4    GPIO_InitTypeDef GPIO_InitStructure;
 5    /*開啟LED相關的GPIO外設時鐘*/
 6    RCC_APB2PeriphClockCmd(LED_GPIO_CLCK, ENABLE);
 7    /*選擇要控制的GPIO引腳*/
 8    GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
 9    /*設置引腳模式為通用推挽輸出*/
10    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
11    /*設置引腳速率為50MHz */
12    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //(指的是內部驅動電路的響應速度,速度越大越快,一般情況是有多個不同的速度,也可根據自己的需要安排)
13    GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
14    /* 關閉led燈    */
15    GPIO_SetBits(LED_GPIO_PORT,  LED1_GPIO_PIN);
16}
1/*LED連接GPIO的定義,程序開發者如果要修改引腳只需要修改這里就好*/
 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 語句是聲明一個結構體GPIO_InitStructure結構體原型由GPIO_InitTypeDef確定(這點是C語言的基礎知識)設置完之后就可以對GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure); 進行操作。

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

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

注釋和工程添加就不說了,網上相關的也挺多的。

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

3-main函數

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。 這點要知道。 就是不管是哪種器件,只有保持電壓差才能進行一個數據的接收,燈的點亮,我認為是這樣的,可以說是所有的元器件芯片都是這樣的,但不是絕對的,只能說大部分。

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

1/*標準庫點亮LED燈*/
2/*當a=0時,LED燈滅,當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);

當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}

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

5-位操作

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

我們對上面這個表進行一些介紹和使用說明

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

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

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

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

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

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

然后再與需要設置的值進行“|” 運算:

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

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

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

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

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

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

1RCC->APB2ENR =0x00000020;

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

  1. 取反位操作的應用

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

1TIMx->SR=0xF7FF;

上述代碼設置第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,其他位保持不變。 這樣,讀者就能很容易地看明白代碼,所以代碼的可讀性也就非常強的。

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

    關注

    6036

    文章

    44556

    瀏覽量

    635029
  • 嵌入式
    +關注

    關注

    5082

    文章

    19117

    瀏覽量

    305002
  • led燈
    +關注

    關注

    22

    文章

    1592

    瀏覽量

    107978
  • STM32
    +關注

    關注

    2270

    文章

    10897

    瀏覽量

    355883
  • RTOS
    +關注

    關注

    22

    文章

    811

    瀏覽量

    119615
收藏 人收藏

    評論

    相關推薦

    單片機入門之點亮LED

    上一章中我們已經認識了單片機,并且完成了開發環境的搭建,這章中我們正式開始進入單片機編程的學習,本章的學習目標是 點亮一盞LED
    發表于 06-26 15:38 ?2633次閱讀
    <b class='flag-5'>單片機</b>入門之<b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    如何點亮51單片機LED

    如何點亮51單片機LED
    發表于 11-04 07:36

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

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

    LED點亮程序

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

    使用51單片機Keil工程建立點亮LED的詳細教程說明

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

    如何使用單片機點亮LED

    我們學單片機,第一個程序就是點亮一盞LED,那么我單片機開啟面向對象方式的第一步也是點亮一盞
    發表于 07-16 17:39 ?4次下載
    如何使用<b class='flag-5'>單片機</b><b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    單片機控制LED點亮的實驗資料說明

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

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

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

    51單片機——LED點亮

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

    【藍橋杯】單片機學習(2)——點亮LED

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

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

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

    51單片機---點亮LED

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

    51單片機——點亮一個LED

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

    基于單片機點亮LED

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

    基于51單片機點亮LED

    入門51單片機第一步,就是學會點亮一個LED,這是所有初次接觸單片機開發的小伙伴的必經之路,管你現在是不是大牛,當年肯定歷經此事。
    發表于 07-11 11:38 ?1767次閱讀
    基于51<b class='flag-5'>單片機</b><b class='flag-5'>點亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>
    主站蜘蛛池模板: 精品四虎国产在免费观看| 免费看国产精品麻豆| 97人妻无码AV碰碰视频| 日本湿姝在线观看| 男人J桶进男人屁股过程| 伦理片在线线手机版韩国免费观看 | 放射源分类办法| 伊人久久艹| 伊人久久综在合线亚洲| 四虎免费影院| 天美麻豆成人AV精品| 神马老子影院午夜伦| 毛片在线不卡| 红尘影院在线观看| 各种肉黄浪荡故事集| 高h原耽肉汁动漫视频| 国产精品97久久AV色婷婷| 国产精品99久久久久久宅男AV| 公和我做好爽添厨房中文字幕| 国产成人免费高清视频| a级销魂美女| 宝贝乖女好紧好深好爽老师| 第一次处破女完整版电影| 国产成人精品亚洲线观看| 国产亚洲精品久久久久久白晶晶| 国产永不无码精品AV永久| 精品国产乱码久久久久久人妻| 久久免费黄色| 九九久久精品| 国产亚洲精品V在线观看一| 国语大学生自产拍在线观看| 精品视频中文字幕| 蜜桃最新网址| 麻美ゆま夫の目の前で犯| 欧美zzzoooxxx| 欧美97色伦综合网| 日日夜夜撸 在线影院| 亚洲 日韩经典 中文字幕| 香蕉鱼视频观看在线视频下载| 神马电影我不卡4k手机在线观看| 亚洲AV精品无码成人|