国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

樹莓派玩轉(zhuǎn)STM32開發(fā)(三)——先從點亮一個LED燈開始

發(fā)布者:BoldDreamer最新更新時間:2024-12-20 來源: jianshu關鍵字:樹莓派  STM32開發(fā)  LED燈 手機看文章 掃描二維碼
隨時隨地手機看文章

在開始正式寫代碼之前,首先要解決一件事,那就是我們該如何去寫這代碼。

在樹莓派搭建的Linux環(huán)境中,使用基于Xorg的桌面環(huán)境在本地開啟圖形化界面開發(fā)太耗費系統(tǒng)資源,這個方案首先不考慮。不過還剩下兩種其他可行的方案,一是直接通過終端遠程登陸進行開發(fā),開發(fā)工作全部在文本模式下進行;另一種則使用Samba服務將Linux的文件系統(tǒng)掛載到Windows中,然后在Windows上面使用圖形化界面的IDE開發(fā)。

如果你比較Geek,你可能會嘗試遠程登陸的方式,通過Vim或者Emacs兩大神器之一進行開發(fā)。不過他們兩者對新手不夠友好,具體可以自己體驗一下,不過網(wǎng)上有個段子:

問:如何生成一個隨機字符串?
答:讓新手退出vim.

而且在沒有深入了解二者之前,容易被他們之間的“世紀大戰(zhàn)”搞迷糊,然后進入一種著相1的狀態(tài):一定要對他們二者分一個高下,然后選擇一個最好的使用。其實它們只是工具而已,自己用著爽就行了,不要自己把自己加入到程序員的鄙視鏈中,以開放的心態(tài)看待事物。筆者個人習慣使用Vim(別問,問就Vim),有豐富的插件,也可以自己對它擴展。或者試試VimPlus,一鍵幫你打造功能強大的Vim IDE(真香警告)。

VimPlus界面

不過本系列是面向新同學的技術科普文章,在這里選用相對簡單一點的方式,使用Samba服務將樹莓派的文件系統(tǒng)通過網(wǎng)絡掛載到Windows上,在Windows中使用VS Code進行開發(fā)。相比于Vim,VSCode使用起來簡直不要太絲滑了。

首先在樹莓派中安裝Samba服務:

$ sudo apt install samba smbclient

安裝samba

安裝完成之后,需要配置它:

$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
$ sudo nano /etc/samba/smb.conf

在末尾添加,并保存:

[pi]
   comment = user pi shared
   path = /home/pi
   available = yes
   browseable = yes   public = yes
   writable = yes

然后創(chuàng)建samba用戶名和密碼:

$ sudo touch /etc/samba/smbpasswd 
$ sudo smbpasswd -a pi

然后會提示為這個用戶創(chuàng)建一個新密碼,可以隨便指定,這里為了方便也設置為“pi”。完成之后要重啟samba服務:

$ sudo systemctl restart smbd.service

此時Samba服務已經(jīng)可用了,接下來在Windows中對其進行掛載:

此電腦->計算機->映射網(wǎng)絡驅(qū)動器

輸入samba服務地址

輸入用戶名和密碼

網(wǎng)絡驅(qū)動器映射成功

請注意填寫自己樹莓派獲取到的IP。如果出現(xiàn)異常,請看參考資料[1]嘗試解決或者谷歌,還不行的話可以在文章下面評論或者私聊我~

接下來咋裝VSCode我就不介紹了,把它裝好之后我們就開始做點燈實驗,首先在樹莓派上把我準備的源碼倉庫拉下來,倉庫中我會對每一個能跑的實例代碼都會在相應的commit上面打上一個tag:

$ git clone https://github.com/Virus-V/Raspberry_STM32.git
$ cd Raspberry_STM32
$ git checkout led  # 切換到 led tag 對應的commit

接下來執(zhí)行編譯并燒錄到STM32中,燒錄的時候要保證STM32開發(fā)板已經(jīng)連接到樹莓派上,同時lsusb也能看到它:

~/Raspberry_STM32$ make -j 

Build modules...

[...]

arm-none-eabi-objcopy -O binary led.elf led.bin

arm-none-eabi-objdump -h -S -D led.elf > led.lss

arm-none-eabi-nm -n led.elf > led.sym

Size after

led.elf  :

section              size        addr

.isr_vector           268   134217728

.text                1172   134217996

.data                   0   536870912

.bss                    0   536870912

._user_heap_stack     512   536870912

.ARM.attributes        51           0

.debug_info          5639           0

.debug_abbrev        1581           0

.debug_aranges        560           0

.debug_ranges         496           0

.debug_line          2799           0

.debug_str           2652           0

.comment               43           0

.debug_frame         2324           0

Total               18097



Make Complete~

Sun Mar 15 02:34:41 UTC 2020

~/Raspberry_STM32$ sudo make download

Downloading led ...

Open On-Chip Debugger 0.10.0+dev-g4cfb2d54 (2020-03-12-12:36)

Licensed under GNU GPL v2

For bug reports, read

        http://openocd.org/doc/doxygen/bugs.html

Info : auto-selecting first available session transport 'hla_swd'. To override use 'transport select '.

Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD

Info : clock speed 1000 kHz

Info : STLINK V2J24M11 (API v2) VID:PID 0483:374B

Info : Target voltage: 3.230159

Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints

Info : Listening on port 3333 for gdb connections

target halted due to debug-request, current mode: Thread

xPSR: 0x01000000 pc: 0x08000404 msp: 0x20005000

** Programming Started **

Info : device id = 0x20036410

Info : flash size = 128kbytes

** Programming Finished **

** Verify Started **

** Verified OK **

** Resetting Target **

shutdown command invoked


此時編譯生成的代碼已經(jīng)下載到開發(fā)板中,不出意外的話,LED已經(jīng)開始閃爍了。

在開發(fā)板上運行

現(xiàn)在LED已經(jīng)被成功點亮了,how it works?我們來扒一扒它內(nèi)部的原理究竟是什么。

首先,我們編寫的代碼在Raspberry_STM32/User/main.c中,它里面有三個函數(shù):main, delay和Init_LED。main是我們程序邏輯的入口,里面首先調(diào)用Init_LED函數(shù),初始化了GPIO外設。接下來就是一個大循環(huán),里面重復執(zhí)行著點亮——延時——熄滅——延時,如此往復。

int main() {
    Init_LED();
    
    while(1) {
        GPIO_SetBits(GPIOC, GPIO_Pin_1);
        delay();
        GPIO_ResetBits(GPIOC, GPIO_Pin_1);
        delay();
    }

    return 0;}

現(xiàn)在看起來歲月靜好,燈也按著我們的想法如期閃爍起來了。
但是,眼前的歲月靜好,是因為有人在背后替我們負重前行。我們來思考幾個問題:

  1. 代碼下載到了哪里?芯片斷電之后代碼還在嗎?

  2. 芯片是從main開始執(zhí)行第一行代碼的嗎?如果不是,哪里才是它的第一行代碼?

  3. 芯片怎么知道它要執(zhí)行的第一行代碼在哪里?代碼是怎么執(zhí)行起來的?

  4. 為什么我能通過代碼控制LED燈?

回答這些問題之前,我們先看看STM32F103這個小東西肚子里都有什么。

STM32F103內(nèi)部結(jié)構(gòu)框圖

可以看到,STM32雖然黑不溜秋的一小坨趴在電路板上,它肚子里的東西還是很多的。

其實我們的代碼下載到了片上Flash里,也就是上圖標綠色的部分,這個東西是STM32片上的一塊只讀存儲空間(ROM),斷電之后不會丟失的。
STM32的第一行代碼不是main函數(shù),如果你仔細觀察過編譯過程,會發(fā)現(xiàn)有一個名為startup_stm32f10x_md.s的文件被編譯并鏈接到最終的可執(zhí)行程序里,它才是芯片啟動后第一行代碼所在的那個文件。

    .section    .text.Reset_Handler
    .weak   Reset_Handler
    .type   Reset_Handler, %function
Reset_Handler:  

/* Copy the data segment initializers from flash to SRAM */  
  movs  r1, #0
  b LoopCopyDataInit

CopyDataInit:
    ldr r3, =_sidata
    ldr r3, [r3, r1]
    str r3, [r0, r1]
    adds    r1, r1, #4
    
LoopCopyDataInit:
    ldr r0, =_sdata
    ldr r3, =_edata
    adds    r2, r0, r1
    cmp r2, r3
    bcc CopyDataInit
    ldr r2, =_sbss
    b   LoopFillZerobss
/* Zero fill the bss segment. */  
FillZerobss:
    movs    r3, #0
    str r3, [r2], #4
    
LoopFillZerobss:
    ldr r3, = _ebss
    cmp r2, r3
    bcc FillZerobss
/* Call the clock system intitialization function.*/
    bl  SystemInit
/* Call the application's entry point.*/
    bl  main
    bx  lr

STM32上電之后,首先從中斷向量表中設置棧的起始位置,然后跳到中斷向量表中的Reset_Handler執(zhí)行系統(tǒng)復位事件處理函數(shù),它主要是初始化全局變量,將全局變量從ROM中搬移到RAM(上圖標藍色的部分),并且對BSS空間進行清零。BSS空間可以看作是默認值為0的全局變量所在的位置。全局變量初始化完成之后,調(diào)用SystemInit對芯片進行初始化:打開外部高速時鐘,初始化鎖相環(huán)倍頻至72MHz,初始化AHB總線時鐘,APB1時鐘和APB2時鐘等初始化工作。最終才會調(diào)到我們編寫的main函數(shù)中。

那么芯片怎么知道中斷向量表在哪里呢?這個其實不難回答,中斷向量表的地址是固化到芯片里的,而我們需要做的是把我們代碼中的中斷向量表放在那個固定的位置就OK了,放置的細節(jié)由鏈接器腳本文件來控制,這個文件是CMSIS/flash.ld。芯片上電之后就會在那個位置取第一行代碼去執(zhí)行。

Cortex-M3是單發(fā)射順序執(zhí)行的標量處理器,內(nèi)部是三級流水線,一個指令需要經(jīng)過取指,譯碼,執(zhí)行三個階段才可以產(chǎn)生結(jié)果,然后退休(retire)。而指令執(zhí)行過程中需要有寄存器配合才能做一些數(shù)據(jù)的處理。寄存器分為通用寄存器和專用寄存器。通用寄存器可以做任何用途,這些寄存器都由編譯器分配如何使用,如果你手撕匯編的話最好遵循ATPCS或其他相應的調(diào)用規(guī)范;而專用寄存器是維護當前程序指令執(zhí)行流狀態(tài)的,包括棧頂指針SP,分支跳轉(zhuǎn)返回地址LR,當前指令地址PC等。

正是因為這些處理器基礎設施,才得以我們的代碼有條不紊歡快地運行。

而最后一個問題,為什么我能通過代碼控制LED燈呢?首先,LED連接到芯片IO口的引腳上,這個IO口屬于GPIO,而GPIO作為一個外設(peripheral)掛到了APB2總線上。掛載到總線上的外設都有一系列寄存器,這些寄存器在整個32位的地址空間中都有一個唯一的地址,而我們的指令正是通過這些寄存器的地址來訪問外設的這些配置寄存器,對其進行讀寫,從而達到了控制的目的。在GPIO中,一個IO口引腳對應其輸出寄存器的一個bit,只要用指令將這個二進制位設置為0或者1,就可以控制相應的IO輸出高電平或低電平。它內(nèi)部實現(xiàn)的細節(jié)在此不深究,這屬于數(shù)字電路的范疇,總之我們代碼對外設所有的操作,都可以轉(zhuǎn)化為對某個地址的讀或?qū)憽?p>這也就讓我想起了Unix設計哲學:一切皆文件,一切交互都可以抽象成讀或者寫。

關鍵字:樹莓派  STM32開發(fā)  LED燈 引用地址:樹莓派玩轉(zhuǎn)STM32開發(fā)(三)——先從點亮一個LED燈開始

上一篇:STM32的Bootloader
下一篇:STM32:從菜鳥到牛人就這么簡單~

推薦閱讀最新更新時間:2025-07-02 09:18

《嵌入式-STM32開發(fā)指南》第二部分 基礎篇 - 第4章 定時器(HAL庫)
4.1定時器的工作原理 STM32有三類定時器,基本定時器就是單純的定時計數(shù)器,通用定時器多了四個通道,相對應的增加了功能,高級定時器具有基本,通用定時器的所有的功能,并且添加了其他功能。定時器的對比特性如下表所示。 表1各個定時器特征 4.1.1基本定時器 TIM6和TIM7定時器的主要功能包括: ● 16位自動重裝載累加計數(shù)器 ● 16位可編程(可實時修改)預分頻器,用于對輸入的時鐘按系數(shù)為1~65536之間的任意數(shù)值分頻 ● 觸發(fā)DAC的同步電路 ● 在更新事件(計數(shù)器溢出)時產(chǎn)生中斷/DMA請求 總的說來,基本定時器 TIM6 和 TIM7 只具備最基本的定時功能,就是累加的時鐘脈沖數(shù)超過預定值時,能觸發(fā)中斷或觸發(fā)
[單片機]
STM32高級開發(fā)(2)-安裝使用ubuntu
作為一切開發(fā)的起點,我們首先要安裝一個Linux發(fā)行版系統(tǒng)作為我們開發(fā)的最基礎的支持性平臺,這里推薦下載ubuntu系統(tǒng),ubuntu可以說是近些年來最流行和使用廣泛的Linux發(fā)行版系統(tǒng)了。 安裝虛擬機軟件 這里我默認大家使用的系統(tǒng)是windows。所以接下來的一切介紹都已這個為前提。 要安裝虛擬機我們有兩個選擇: 1. VMware Workstation 2. VirtualBox 前者是一個商業(yè)化軟件,需要付費才能夠正常使用,當然你也可以破解。關于方法網(wǎng)上全是我想就不用我過多介紹了。而后者是一個開源軟件,自然地功能性上可能有一些欠缺但也還算夠用。當然啦,如果有條件還是用前者吧~ 下載ubuntu系統(tǒng)安裝文件 htt
[單片機]
<font color='red'>STM32</font>高級<font color='red'>開發(fā)</font>(2)-安裝使用ubuntu
用Eclipse開發(fā)stm32(GNU ARM Eclipse Plug-in)(編碼+編譯+下載+調(diào)試)
傳統(tǒng)的IDE功能強大,特別是調(diào)試功能,但是如今,其它軟件的發(fā)展,大家感覺到傳統(tǒng)的IDE用戶交互、編輯界面、編碼效率不夠友好;或者為了降低成本,需要使用開源工具 于是,有人選擇使用IDE用來調(diào)試,用其它編輯器編碼(比如source insight 、sublime text3、notepad++、atom、Eclipse等),來提高效率;或者使用其它的工具鏈來配合編輯器達到自制一個IDE的效果 當然還有一些改進得比較好的免費IDE和收費的IDE,比如coocox 這里是在Eclipse上編寫 ARM 程序 在Eclipse上編寫程序方法: 使用GCC、G++、makefile的方式進行手動編碼,一切靠自己 使用Eclipse+插件
[單片機]
用Eclipse<font color='red'>開發(fā)</font><font color='red'>stm32</font>(GNU ARM Eclipse Plug-in)(編碼+編譯+下載+調(diào)試)
STM32開發(fā)筆記65: W5500跨路由不能訪問問題的解決方法
單片機型號:STM32L053R8T6 現(xiàn)象描述:使用W5500進行以太網(wǎng)設計,用網(wǎng)線直接連接設備通信正常,使用家用無線路由器(自己用TP-Link做的實驗),無論是外網(wǎng)訪問內(nèi)網(wǎng),還是內(nèi)網(wǎng)訪問外網(wǎng)均正常。但是,在現(xiàn)場環(huán)境中,不能跨路由通信,現(xiàn)場環(huán)境使用的三層交換機是華為的S5720S。現(xiàn)場有正常能夠使用的設備,將自己的設備的IP地址、子網(wǎng)掩碼、網(wǎng)關與該設備設置的一致,并用同一個網(wǎng)口都不能正常通信。 問題解決:最后將問題鎖定在MAC地址上,下圖是我的設備的MAC地址,其關鍵點在于MAC地址的第1字節(jié),具體解釋如下。 MAC地址基本含義 MAC(Medium/Media Access Control)地址,用來表示互聯(lián)網(wǎng)
[單片機]
<font color='red'>STM32</font><font color='red'>開發(fā)</font>筆記65: W5500跨路由不能訪問問題的解決方法
STM32開發(fā)筆記66: 移植看門狗驅(qū)動程序到STM32L053R8T6
單片機型號:STM32L053R8T6 在文章STM32開發(fā)筆記45:看門狗驅(qū)動程序的移植已經(jīng)介紹了看門狗驅(qū)動程序的移植方法,其實現(xiàn)的是將STM32CubeMX中的驅(qū)動程序,移植到自己已有的工程中。本文將介紹將STM32F070F6P6上的看門狗驅(qū)動程序移植到STM32L053R8T6的方法,步驟如下: 1、在1_bsp層引入STM32官方的驅(qū)動程序stm32l0xx_hal_iwdg.c,并修改stm32l0xx_hal_conf.h中的內(nèi)容,使能內(nèi)部看門狗,相關程序如下,然后進行編譯,形成bsp.lib #define HAL_MODULE_ENABLED /*#define HAL_ADC_MODULE_ENA
[單片機]
STM32開發(fā)板入門教程(十三) - SPI模式讀寫SD卡
功能介紹 :使用SPI模式 讀寫SD卡block數(shù)據(jù) 可通過串口發(fā)送到PC機查看 SD卡是Secure Digital Card卡的簡稱,直譯成漢語就是“安全數(shù)字卡”,是由日本松下公司、東芝公司和美國SANDISK公司共同開發(fā)研制的全新的存儲卡產(chǎn)品。SD存儲卡是一個完全開放的標準(系統(tǒng)),多用于MP3、數(shù)碼攝像機、數(shù)碼相機、電子圖書、AV器材等等,尤其是被廣泛應用在超薄數(shù)碼相機上。呵呵 現(xiàn)在偶們做東西也喜歡用sd卡了 為啥? 容量大啊 價格便宜啊 讀寫次數(shù)100000次以上(也有資料說是300000次 呵呵) 這個次數(shù)夠猛了啊 讀寫的速度也很快 現(xiàn)在高速的SD卡寫速度可以達到20M/S 呵呵 如果你買的SD卡達不到這個速度
[單片機]
<font color='red'>STM32</font><font color='red'>開發(fā)</font>板入門教程(十三) - SPI模式讀寫SD卡
在MDK上建立一個C++的STM32開發(fā)工程
最近,我驚訝地發(fā)現(xiàn)居然可以用C++進行嵌入式程序開發(fā),甚至是裸系統(tǒng)程序。之前,做單片機開發(fā)、STM32上程序開發(fā),想到的都是C語言、匯編語言,根本就沒有考慮過還可以用C++語言做開發(fā)。近日,在學習公司的項目之后,發(fā)現(xiàn)C++有其獨道之處。開發(fā)起來比C語言更方便架構(gòu)搭建與程序管理。 我之前對C++有曲解,總認為C++只適合做上層應用軟件開發(fā),不適用于單片機開發(fā)。一方面是因為C++喜歡來不不就new一個對象。對于內(nèi)存空間非常緊張的單片機,只能望海興嘆。二是C++生成的代碼量較C龐大,效率上可能沒有C高。對于主頻較低的單片機,也用一點勉強。但是,這并不能掩蓋C++的優(yōu)勢。C++是面向?qū)ο蟮某绦蛘Z言,能非常靈活地進行繼承與派生
[單片機]
STM32如何生成lib以供二次開發(fā)
相關方法: 0 STM32最新固件庫(3.5)封裝lib加工程模版 1 stm32 教你如何編譯出LIB文件 2 stm32如何生成lib 3 教你如何在stvd中生成lib文件,好處你懂的~ 4 誰知道在RVMDK下怎樣生成 lib 文件? 5 STM32之如何封裝自己的lib 庫
[單片機]
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved