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

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

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

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

基于STM32點(diǎn)亮LED燈

CHANBAEK ? 來(lái)源:編程外星人 ? 作者:怪蛙 ? 2023-07-27 16:06 ? 次閱讀

我們?cè)诳刂颇K中所使用的處理器是Cortex-M4系列中的STM32F407VE,這個(gè)處理器芯片有100個(gè)引腳,其中包含一些電源供電引腳、外部晶振引腳、SWD程序燒錄引腳和我們最常用的GPIO功能引腳:

圖片

實(shí)際上,我們使用的GPIO并不多,我們只使用了3路AD采集、Uart1和Uart2、I2C1、Tim3和Tim4的PWM輸出引腳以及幾個(gè)普通GPIO腳(具體使用情況請(qǐng)參照《控制模塊》)。STM32有豐富的硬件資源供我們使用,例如:AD采集、串口、I2C、SPI、SDIO、CANUSB_OTG_FS、USB_OTG_HS、I2S、PWM輸出、PWM采集、GPIO輸入輸出等。在這一節(jié)里我們將完成STM32的第一個(gè)小程序:點(diǎn)亮LED燈。

一、開(kāi)發(fā)環(huán)境搭建:

我們的整個(gè)項(xiàng)目都會(huì)在Linux系統(tǒng)下完成,因此后續(xù)所有章節(jié)中如無(wú)特殊說(shuō)明,我們都默認(rèn)在Linux下搭建所有的開(kāi)發(fā)環(huán)境。

首先,我們需要下載并安裝在Arm平臺(tái)下的gcc編譯工具arm-none-eabi-gcc。作者所使用的Linux發(fā)行版為Arch-Linux,可以直接使用下面命令進(jìn)行安裝:

#Arch-Linux
pacman -S arm-none-eabi-gcc


#Fedora
yum install arm-none-eabi-gcc


#ubuntu
apt-get install arm-none-eabi-gcc

一般來(lái)說(shuō),其它Linux的發(fā)行版都有著自己的安裝軟件包的方式,我們不再一一列舉。此外,我們還可以直接在GNU的網(wǎng)站上直接下載壓縮包。

我們下載Linux x86_64 Tarball壓縮包,解壓到指定目錄,并將其目錄加入到PATH環(huán)境變量中,最后執(zhí)行以下命令的查看是否安裝成功:

$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496]
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

其次,我們還需要使用STM32F4xx的標(biāo)準(zhǔn)開(kāi)發(fā)庫(kù),我們可以到STM32官方的網(wǎng)站上下載。

圖片

我們需要下載F4系列的標(biāo)準(zhǔn)開(kāi)發(fā)庫(kù),下載并解壓之后,得到以下目錄:

├── CMSIS
│   ├── Device
│   └── Include
└── STM32F4xx_StdPeriph_Driver
    ├── inc
    └── src

這樣我們的開(kāi)發(fā)環(huán)境就準(zhǔn)備好了,接下來(lái)就可以在這個(gè)開(kāi)發(fā)環(huán)境下進(jìn)行開(kāi)發(fā)了。

二、點(diǎn)亮LED燈:

使用arm gcc來(lái)編譯STM32所運(yùn)行的程序,我們需要編寫(xiě)一個(gè)Makefile如下:

# Output files
ELF_FILE  =  led.elf
BIN_FILE  =  led.bin
HEX_FILE  =  led.hex
INFO_FILE  =  led.info
CODE_FILE  =  led.code


#------------------------------------------------------------------------#
# Cross Compiler
CC      =  arm-none-eabi-gcc
OBJCOPY    =  arm-none-eabi-objcopy
OBJDUMP    =  arm-none-eabi-objdump
READELF    =  arm-none-eabi-readelf


#------------------------------------------------------------------------#
# Flags
CFLAGS    +=  -std=gnu11
CFLAGS    +=  -mthumb
CFLAGS    +=  -Wno-incompatible-pointer-types
CFLAGS    +=  -Wno-unused-but-set-variable
CFLAGS    +=  -Wno-unused-variable
CFLAGS    +=  -mcpu=cortex-m4
CFLAGS    +=  -mfpu=fpv4-sp-d16 -mfloat-abi=hard
CFLAGS    +=  -D"assert_param(expr)=((void)0)"
CFLAGS    +=  -D STM32F40XX -DUSE_STDPERIPH_DRIVER
CFLAGS    +=  -nostartfiles


#------------------------------------------------------------------------#
# Link script
CFLAGS    +=  -Wl,-Tled.ld


#------------------------------------------------------------------------#
# Libraries
STM32_LIBS  =  libs/STM32F4xx_StdPeriph_Driver
CFLAGS    +=  -I$(STM32_LIBS)/inc
CFLAGS    +=  -Ilibs/CMSIS/Include
CFLAGS    +=  -Ilibs/CMSIS/Device/ST/STM32F4xx/Include


#------------------------------------------------------------------------#
# Src Path
SRCS    =  ./src
CFLAGS    +=  -I$(SRCS)
CFLAGS    +=  -I./inc


#------------------------------------------------------------------------#
# Main Board
SRC      +=  $(SRCS)/main.c


#------------------------------------------------------------------------#
# System
SRC      +=  ./src/system_stm32f4xx.c


STARTUP    =  ./src/startup_stm32f40xx.s


#------------------------------------------------------------------------#
# StdPeriph
SRC      +=  $(STM32_LIBS)/src/misc.c 
        $(STM32_LIBS)/src/stm32f4xx_rcc.c 
        $(STM32_LIBS)/src/stm32f4xx_gpio.c


STARTUP_OBJ  =  startup_stm32f40xx.o


all:$(BIN_FILE) $(HEX_FILE) $(INFO_FILE) $(CODE_FILE)


$(BIN_FILE):$(ELF_FILE)
  $(OBJCOPY) -O binary $^ $@


$(HEX_FILE):$(ELF_FILE)
  $(OBJCOPY) -O ihex $^ $@


$(INFO_FILE):$(ELF_FILE)
  $(READELF) -a $^ > $@


$(CODE_FILE):$(ELF_FILE)
  $(OBJDUMP) -S $^ > $@


$(STARTUP_OBJ):$(STARTUP)
  $(CC) $(CFLAGS) $^ -c $(STARTUP)


$(ELF_FILE):$(SRC) $(STARTUP_OBJ)
  $(CC) $(CFLAGS)  $^ -o $@

之后,我們還需要編寫(xiě)一個(gè)led.ld的鏈接腳本,內(nèi)容如下:

/* Entry Point */
ENTRY(Reset_Handler)


/* Highest address of the user mode stack */
_estack = 0x20020000;    /* end of 128K RAM on AHB bus*/


/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0;      /* required amount of heap  */
_Min_Stack_Size = 0x400; /* required amount of stack */


/* Specify the memory areas */
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}


/* Define output sections */
SECTIONS
{
  .myBufBlock 0x10000000 :
    {
        KEEP(*(.myBufSection)) /* keep my variable even if not referenced */
    } > CCMRAM


  /* The startup code goes first into FLASH */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >FLASH


  /* The program code and other data goes into FLASH */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
  *(.eh_frame)


    KEEP (*(.init))
    KEEP (*(.fini))


    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
    _exit = .;
  } >FLASH




   .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
    .ARM : {
    __exidx_start = .;
      *(.ARM.exidx*)
      __exidx_end = .;
    } >FLASH


  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >FLASH
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(.fini_array*))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH


  /* used by the startup to initialize data */
  _sidata = .;


  /* Initialized data sections goes into RAM, load LMA copy after code */
  .data : AT ( _sidata )
  {
    . = ALIGN(4);
    _sdata = .;        /* create a global symbol at data start */
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */


    . = ALIGN(4);
    _edata = .;        /* define a global symbol at data end */
  } >RAM


  /* Uninitialized data section */
  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss secion */
    _sbss = .;         /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)


    . = ALIGN(4);
    _ebss = .;         /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM


  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack :
  {
    . = ALIGN(4);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(4);
  } >RAM


  /* Remove information from the standard libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }


  .ARM.attributes 0 : { *(.ARM.attributes) }
}

最后,我們編寫(xiě)程序源代碼文件main.c,實(shí)現(xiàn)LED亮燈功能:

#include < stm32f4xx.h >
#include < stm32f4xx_conf.h > 


int main(int argc, char* argv[])
{
  GPIO_InitTypeDef GPIO_InitStructure = { 0 };
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOE, &GPIO_InitStructure);


  GPIO_WriteBit(GPIOE, GPIO_Pin_0, 0);
  GPIO_WriteBit(GPIOE, GPIO_Pin_1, 0);


  while (1)
  {
  }
}

需要說(shuō)明的是,我們先來(lái)看一下LED電路的原理圖:

圖片

可以看到兩個(gè)LED分別使用的是PE0和PE1引腳,當(dāng)引腳為低電平時(shí)LED燈亮起,當(dāng)引腳為高電平時(shí)LED熄滅,因此,當(dāng)我們希望LED亮起只需要通過(guò)GPIO_WriteBit()函數(shù)將PE0和PE1拉低即可。

圖片

點(diǎn)亮了兩個(gè)LED之后,我們還可以將源代碼修改一下,讓LED變?yōu)殚W爍狀態(tài):

#include < stm32f4xx.h >
#include < stm32f4xx_conf.h > 


int main(int argc, char* argv[])
{
  GPIO_InitTypeDef GPIO_InitStructure = { 0 };
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOE, &GPIO_InitStructure);


  while (1)
  {
    GPIO_WriteBit(GPIOE, GPIO_Pin_0, 1);
    GPIO_WriteBit(GPIOE, GPIO_Pin_1, 0);
    for (int i = 0; i < 1000000; i++)
    {
    }
    GPIO_WriteBit(GPIOE, GPIO_Pin_0, 0);
    GPIO_WriteBit(GPIOE, GPIO_Pin_1, 1);
    for (int i = 0; i < 1000000; i++)
    {
    }
  }
}

我們?cè)趙hile循環(huán)中加入兩個(gè)for循環(huán)讓處理器執(zhí)行100000次實(shí)現(xiàn)程序“等待一小會(huì)兒”的功能,但實(shí)際上這段時(shí)間處理器還是在運(yùn)行的。

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

    關(guān)注

    242

    文章

    23308

    瀏覽量

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

    關(guān)注

    22

    文章

    1592

    瀏覽量

    108112
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11320

    瀏覽量

    209846
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10910

    瀏覽量

    356582
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1211

    瀏覽量

    52179
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何去實(shí)現(xiàn)用STM32點(diǎn)亮第一個(gè)LED

    STM32點(diǎn)亮第一個(gè)LED-用寄存器實(shí)現(xiàn)前言
    發(fā)表于 08-03 06:16

    STM32點(diǎn)亮簡(jiǎn)析

    STM32點(diǎn)亮(庫(kù)函數(shù)版)首先解釋以下#ifndef _LED_H#ifndef _LED_H............#endif避免重
    發(fā)表于 08-24 06:49

    如何用STM32點(diǎn)亮LED

    如何用STM32點(diǎn)亮LED
    發(fā)表于 10-11 08:44

    如何利用嵌入式STM32點(diǎn)亮LED及用中斷讓其閃爍?

    如何利用嵌入式STM32點(diǎn)亮LED及用中斷讓其閃爍?
    發(fā)表于 11-16 07:43

    如何利用STM32點(diǎn)亮LED?

    如何利用STM32點(diǎn)亮LED?
    發(fā)表于 11-29 06:57

    使用STM32點(diǎn)亮LED的方法

    led,大家大致看一下點(diǎn)燈流程和點(diǎn)燈環(huán)境以及點(diǎn)燈流程,就能大概的了解一下三者的區(qū)別,可以有選擇的去學(xué)習(xí)!一、使用STM32點(diǎn)亮LED
    發(fā)表于 11-29 06:14

    如何使用STM32點(diǎn)亮led

    前言眾所周知,在32位單片機(jī)中,STM32占有重要市場(chǎng)份額,其社區(qū)活動(dòng)頻繁,網(wǎng)上相關(guān)資料也比較多,無(wú)論是學(xué)習(xí)入門(mén),還是工作使用,都無(wú)疑是極好的選擇,本節(jié)開(kāi)始,我們將學(xué)習(xí)如何使用STM32,首先,我們
    發(fā)表于 12-09 07:40

    如何用STM32F103ZET6點(diǎn)亮LED?

    如何用STM32F103ZET6點(diǎn)亮LED
    發(fā)表于 12-16 06:12

    如何利用stm32點(diǎn)亮led

    stm32點(diǎn)亮ledstm32點(diǎn)燈原理建立工程文件三級(jí)目錄
    發(fā)表于 01-07 07:08

    stm32點(diǎn)亮LED并且制造流水效果相關(guān)資料下載

    今天不學(xué)python了,學(xué)單片機(jī)。畢竟我的專(zhuān)業(yè)是搞這些的。。。。。(其實(shí)挺煩的,對(duì)單片機(jī)沒(méi)啥感覺(jué),希望有大神指點(diǎn)下)分析:首先我們看到原理圖上面LED連接的引腳是什么,我的LED
    發(fā)表于 01-20 08:18

    如何實(shí)現(xiàn)用stm32f407點(diǎn)亮led?

    如何實(shí)現(xiàn)用stm32f407點(diǎn)亮led?
    發(fā)表于 02-08 06:32

    零基礎(chǔ)開(kāi)發(fā)一種STM32點(diǎn)亮led

    零基礎(chǔ)STM32開(kāi)發(fā)第一篇點(diǎn)亮led前言展示電路原理圖設(shè)計(jì)電源部分MCU部分按鍵LED部分蜂鳴器繼電器外設(shè)排針PCB設(shè)計(jì)實(shí)體圖所需軟件
    發(fā)表于 02-11 08:06

    如何利用STM32點(diǎn)亮LED

    點(diǎn)燈LED一、GPIO庫(kù)函數(shù)介紹1、初始化函數(shù)(1個(gè))2、讀取輸入電平函數(shù)(2個(gè))3、讀取輸出電平函數(shù)(2個(gè))4、設(shè)置輸出電平函數(shù)(4個(gè))二、硬件連接三、點(diǎn)亮LED
    發(fā)表于 02-28 09:36

    史上最全的LED點(diǎn)燈程序—使用STM32、FPGA、Linux點(diǎn)亮你的LED

    led,大家大致看一下點(diǎn)燈流程和點(diǎn)燈環(huán)境以及點(diǎn)燈流程,就能大概的了解一下三者的區(qū)別,可以有選擇的去學(xué)習(xí)!一、使用STM32點(diǎn)亮LED
    發(fā)表于 11-19 13:36 ?20次下載
    史上最全的<b class='flag-5'>LED</b>點(diǎn)燈程序—使用<b class='flag-5'>STM32</b>、FPGA、Linux<b class='flag-5'>點(diǎn)亮</b>你的<b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    STM32F103實(shí)驗(yàn)一:點(diǎn)亮LED

    STM32F103點(diǎn)亮LED
    發(fā)表于 12-27 18:36 ?49次下載
    <b class='flag-5'>STM32</b>F103實(shí)驗(yàn)一:<b class='flag-5'>點(diǎn)亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>
    主站蜘蛛池模板: 亚洲精品无AMM毛片| 久久婷婷国产五月综合色啪最新| 国产亚洲精品久久久久久国| 老阿姨才是最有V味的直播| 天上人间影院久久国产| 748亚洲大胆国模人体| 国产片MV在线观看| 欧美日韩888在线观看| 伊伊人成亚洲综合人网| 国产精品ⅴ视频免费观看| 农村脱精光一级| 亚洲一区免费在线观看| 国产成人小视频| 欧美123区| 在线观看免费国产成人软件| 国产精品免费一区二区三区四区| 男生互捏jiji的故事| 亚洲最大成人| 国产精品无码人妻在线| 人性本色联盟| 91热久久免费精品99| 娇喘高潮教室h| 无限资源日本2019版免费| 超碰视频97av| 女厕所边摸边吃奶边做爽视频| 亚洲一级电影| 国产人妻XXXX精品HD电影| 肉动漫3D卡通无修在线播放| 99久久久久国产精品免费| 久久免费资源福利资源站| 亚洲高清在线精品一区| 国产大片51精品免费观看| 日本污ww视频网站| free性欧美xxx狂欢| 蜜芽丅v新网站在线观看| 原神美女被超污app| 狠狠色狠狠色综合日日92| 乡村教师电影完整版在线观看| 动漫美女被羞羞动漫怪物| 彭丹吃奶门| AV亚洲精品少妇毛片无码|