嵌入式軟件--stm32 DAY 2

大家學習嵌入式的時候,多多學習用KEIL寫代碼,雖然作為編譯器,大家常用vscode等常用工具關聯編碼,但目前keil仍然是主流工具之一,學習掌握十分必要。

1.再次創建項目

1.1編譯器自動生成文件

1.2初始文件

這樣下次創建新項目時,只需復制上一個項目,刪除自動生成的文件,后根據自我需求進行修改。

重新打開工程后,需要重新配置,重新配置后才會生成文件。

2.再做項目

2.1需求

在第一個項目中,我們點亮了黃燈。接下來點亮藍燈和綠燈。

2.2準備工作

2.2.1原理圖查接線

?

由原理圖可知,LED負極端給一個低電平就可以點亮。得出有效條件:低電平有效

2.2.2有效信息寫代碼

我們知道,所有外設都基本掛在系統總線上,APB1? APB2.從總線上找GPIO

他們都屬于GPIOA同一組時鐘。

配置PA1為輸出,看寄存器CRL.PA0是后面的四位,那PA1就是前面的四位。

通用推挽輸出的配置通常需要將 CNF 設置為 00(推挽輸出),而 MODE 根據所需的速度選擇,比如 2MHz、10MHz 或 50MHz。例如,對于 50MHz 的速度,MODE 位應設置為 11。因此,對應的 CRL 位需要設置為 0011,即十進制的 3,也就是0x?30

最后幾位應該是1101,對應16進制D。所以0xfffd。

藍燈就會亮起。黃燈之所以不亮是因為如果沒有延遲,是觀察不到的,它的程序反應速度很快。

綠燈對應引腳PA8。因為8-15的引腳不在低寄存器里,需要看高寄存器。也就是CRH的最低四位

基地址+偏移地址。*(uint32 *)(0x4001?0800+0x04)=0x03

輸出低電平,偏移量0x0c.給ODR8一個0.也就是0xfeff.

這樣綠燈就會亮起。

看到這里,也就明白了,讓三燈同時亮起。

也就是ODR端口數據寄存器配置為0xfefc。

端口配置寄存器CRL,就讓低8位為00110011,其他全是0,也就是0x33.

這就是電燈案例的標準庫寄存器寫法,但是不是有些難看?

寄存器寫法的步驟也無非就是開啟GPIO時鐘,配置端口寄存器輸入輸出,配置輸入輸出數據。

先找到引腳的起始地址,再找寄存器對應偏移量,加一起就可以找到寄存器操作地址,還需要強轉成32位指針。可不可以不需要這些地址?

我們可以選擇優化!

2.3代碼優化

不知道大家發現沒,我們并沒有用到Start里面的.h文件。并沒有引入各種額外文件。

如果簡化的話,就需要引入額外文件。將一些地址加以宏定義,就會好看許多。

2.3.1 改進1 使用宏定義改寫寄存器地址

引入文件

時鐘配置也可以

RCC->APB2ENR=4;

注意stm32f10x.h文件里面集成了很多寄存器和引腳的宏定義。只有引用他才能宏替換地址。

優點:這樣比地址好看很多,只要記住模塊名和寄存器名稱,就能配置。

但是目前缺陷也很明顯。例如RCC->APB2ENR=4,不僅打開了GPIOA時鐘,也將其他的模塊關閉了。我們應該在不影響其他模塊的前提下,打開GPIOA時鐘。

C語言里面講過位運算,只改想要的位,不改其他位。

2.3.2 使用位運算對某一位進行操作

跟0作位于,一定為0;跟1作位或,一定為1;

置0,與0位于,置一,與1位或.

2.3.3 改進2 使用位運算實現只改變某一位的值。

RCC->APB2ENR=4? 4即0x0100,只要讓第三位為1,其他保持不變。那就只要和一個第三位為1,其他為0的數作位或即可。也就是與(1<<2)做位或。

RCC->APB2ENR|=(1<<2)即可。

配置PA0為輸出,GPIOA->CRL=0x03; 0011,cnF0=00,mode=11,前兩位為0,后兩位是1,其他位不受影響。這樣才能保證PA0為輸出。

GPIOA->CRL|=(1<<0);

GPIOA->CRL|=(1<<1);

GPIOA->CRL&=~(1<<3);

GPIOA->CRL&=~(1<<4);

? PA0輸出低電平,ODR最后一位為0,其他位不改變。

GPIOA->ODR&=~(1<<0);

led1 黃燈就會亮。

這種寫代碼方法只需要記住模塊和寄存器,后續還要記住第幾位,需要查手冊。

2.3.4 改進3 使用宏定義改變每一位的表示

時鐘開啟可以改進:RCC->APB2ENR|=(1<<2)

改進后:RCC->APB2ENR|=RCC_APB2ENR_IOPAENR

大家要熟悉這種寫法,以后寄存器寫法的代碼都是這種風格。完全靠宏定義取代了地址的寫法,這個主推!!!

3.GPIO整體概述

GPIO引腳就是通用輸入輸出引腳。存在意義便是用程序控制他們的輸入或輸出。

3.1 與GPIO相關寄存器

3.2 8種工作模式

3.3推挽輸出總結

3.4 開漏輸出

3.5 推挽輸出和開漏輸出的選擇?

使用推挽:

1.驅動能力需求較高的場合

2.高速信號傳輸

3.無需共用信號線的場合

使用開漏:

1.多個設備共用信號線

2.不同電壓系統之間的接口

3.需要外部上拉電阻來確定邏輯高電平的場合?

3.6復用輸出模式

復用輸出信號來自片上外設(芯片中各種外設模塊)

通用開漏,連ODR。

復用開漏,那條線打到片上外設,選哪個模塊,配置哪個

復用功能(AF),端口必須配置成復用輸出。

看下圖,輸入模式下,輸出完全不導通。

浮空輸入,上拉下拉都斷開。還想上下拉的話,外部接上拉電阻或下拉電阻。

總結:

模擬輸入耗電極小,肖特基觸發器關閉。

輸入模式就不用分通用還是復用了,都是外部輸入來的。

4.GPIO寄存器

每組GPIO端口,都有7個相關寄存器。

配置寄存器和數據寄存器幾乎是配置GPIO必用的,必須背會。

上下拉輸入都是10 00,那么就用ODR這一位來區分。下拉ODR配0,上拉ODR配1.

0-7引腳用端口配置低寄存器來配,8-15引腳用端口高寄存器來配。

復位值16進制,每一位都是4,0100,對應浮空輸入,斷掉上下拉電阻的開關,最省電。

輸入數據寄存器IDR,16位,一個引腳對應1位。

BS0為1,間接ODR0為1;BR0為1,間接導致OER0為0.如果同時啟動BSy和BRy,只有BS起作用。

? ? ? ? LCK0直接對ODR0進行鎖定。鎖定之后在下次端口位復位前不改配置。

5.Keil+VSCode優化開發體驗

為了讓頁面更好看,聯想能力更強。就用keil負責與32的聯接燒錄,VSCode復制寫代碼。

VSCode我之前在C語言的教程中,安裝過,這里不再闡述,關于漢化和C/C++的擴展插件也下載好。

關鍵插件:Keil Assistant

?

5.1 下載安裝VScode

6.GPIO應用案例:流水燈

需求:在三個LED燈上實現流水燈效果。

注意點:加入延時效果(定時器)。

6.1軟件設計

之前我們有過點燈的案例,啟動文件和用戶文件已經配好,那么可以直接復制使用。將文件的名字和工程名字改過來就可以了。刪掉無關文件和目錄(編譯器自動生成)。

點開工程,完成一系列必要的配置。連上硬件和S-TINK.

之后確定即可。

在VScode里面打開.

導入文件,后寫代碼

配置GPIOA時鐘,再把三個GPIO引腳配成通用推挽輸出。記住位或置一,位于置零。

然后我們想想,初始狀態得讓他們全關燈,然后一個一個亮,前一個亮,后一個就得滅。

我們需要定義延時函數。

我們這個芯片可以用系統滴答定時器。每滴答一次-1.那么多長時間滴答一次?

CPU主頻72MHZ,所以一秒鐘72M次滴答,1/72M?秒滴答一次。

這樣就可以實現流水燈了。

#include "stm32f10x.h"
//定義延時函數
void delay_ms(u16 ms);
void delay_us(u16 us);
void delay_s(u16 s);int main(void)
{//1.時鐘配置,開啟GPIOA時鐘RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;//2.工作模式配置,PA0 PA1 PA8通用推挽輸出  CNF=00,MODE=11GPIOA->CRL&=~GPIO_CRL_CNF0;GPIOA->CRL|=GPIO_CRL_MODE0;GPIOA->CRL&=~GPIO_CRL_CNF1;GPIOA->CRL|=GPIO_CRL_MODE1;GPIOA->CRH&=~GPIO_CRH_CNF8;GPIOA->CRH|=GPIO_CRH_MODE8;//3.初始全高電平,都置1GPIOA->ODR|=GPIO_ODR_ODR0;GPIOA->ODR|=GPIO_ODR_ODR1;GPIOA->ODR|=GPIO_ODR_ODR8;//4.在循環中依次點亮,延遲一段時間關閉while(1){//點亮LED1GPIOA->ODR&=~GPIO_ODR_ODR0;//延時半秒delay_ms(500);//關閉LED1GPIOA->ODR|=GPIO_ODR_ODR0;//點亮LED2GPIOA->ODR&=~GPIO_ODR_ODR1;//延時半秒delay_ms(500);//關閉LED2GPIOA->ODR|=GPIO_ODR_ODR1;//點亮LED3GPIOA->ODR&=~GPIO_ODR_ODR8;//延時半秒delay_ms(500);//關閉LED3GPIOA->ODR|=GPIO_ODR_ODR8;}}void delay_us(u16 us)
{//設置系統定時器的初始計數值SysTick->LOAD=72 * us;//配置系統定時器SysTick->CTRL=0x05;//輪詢等待計數值變為0,countflag-1while(!(SysTick->CTRL&SysTick_CTRL_COUNTFLAG)){}
//關閉定時器
SysTick->CTRL&=~SysTick_CTRL_ENABLE;
}void delay_s(u16 s)
{while (s--){delay_ms(1000);}
}void delay_ms(u16 ms)
{while (ms--){delay_us(1000);}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902066.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902066.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲引擎學習第234天:實現基數排序

回顧并為今天的內容設定背景 我們今天繼續進行排序的相關&#xff0c;雖然基本已經完成了&#xff0c;但還是想收尾一下&#xff0c;讓整個流程更完整。其實這次排序只是個借口&#xff0c;主要是想順便聊一聊一些計算機科學的知識點&#xff0c;這些內容在我們項目中平時不會…

計算機網絡——常見的網絡攻擊手段

什么是XSS攻擊&#xff0c;如何避免? XSS 攻擊&#xff0c;全稱跨站腳本攻擊&#xff08;Cross-Site Scripting&#xff09;&#xff0c;這會與層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆&#xff0c;因此有人將跨站腳本攻擊縮寫為XSS。它指的是惡意攻擊者往Web頁面…

Agent的九種設計模式 介紹

Agent的九種設計模式 介紹 一、ReAct模式 原理:將推理(Reasoning)和行動(Acting)相結合,使Agent能夠在推理的指導下采取行動,并根據行動的結果進一步推理,形成一個循環。Agent通過生成一系列的思維鏈(Thought Chains)來明確推理步驟,并根據推理結果執行相應的動作,…

LeetCode 熱題 100:回溯

46. 全排列 給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 輸入&#xff…

cJSON_Print 和 cJSON_PrintUnformatted的區別

cJSON_Print 和 cJSON_PrintUnformatted 是 cJSON 庫中用于將 cJSON 對象轉換為 JSON 字符串的兩個函數&#xff0c;它們的區別主要在于輸出的格式&#xff1a; 1. cJSON_Print 功能&#xff1a;將 cJSON 對象轉換為格式化的 JSON 字符串。 特點&#xff1a; 輸出的 JSON 字符…

A股周度復盤與下周策略 的deepseek提示詞模板

以下是反向整理的股票大盤分析提示詞模板&#xff0c;采用結構化框架數據占位符設計&#xff0c;可直接套用每周市場數據&#xff1a; 請根據一下markdown格式的模板&#xff0c;幫我檢索整理并輸出本周股市復盤和下周投資策略 【A股周度復盤與下周策略提示詞模板】 一、市場…

Linux下使用C++獲取硬件信息

目錄 方法獲取CPU信息&#xff1a;讀取"/proc/cpuinfo"文件獲取磁盤信息&#xff1a;讀取"/proc/diskstats"文件獲取BIOS信息有兩種方法&#xff1a;1、讀取文件&#xff1b;2、使用dmidecode命令獲取主板信息有兩種方法&#xff1a;1、讀取文件&#xff1…

BootStrap:進階使用(其二)

今天我要講述的是在BootStrap中第二篇關于進一步使用的方法與代碼舉例; 分頁&#xff1a; 對于一些大型網站而言&#xff0c;分頁是一個很有必要的存在&#xff0c;如果當數據內容過大時&#xff0c;則需要分頁來分擔一些&#xff0c;這可以使得大量內容能整合并全面地展示&a…

【技術派后端篇】技術派中的白名單機制:基于Redis的Set實現

在技術派社區中&#xff0c;為了保證文章的質量和社區的良性發展&#xff0c;所有發布的文章都需要經過審核。然而&#xff0c;并非所有作者的文章都需要審核&#xff0c;我們通過白名單機制來優化這一流程。本文將詳細介紹技術派中白名單的實現方式&#xff0c;以及如何利用Re…

TRAE.AI 國際版本

國際版下載地址&#xff1a; https://www.trae.ai/https://www.trae.ai/ 國際版本優勢&#xff1a;提供更多高校的AI助手模型 Claude-3.5-Sonnet Claude-3.7-Sonnet Gemini-2.5-Pro GPT-4.1 GPT-40 DeepSeek-V3-0324DeepSeek-V3DeepSeek-Reasoner(R1)

關于支付寶網頁提示非官方網頁

關于支付寶網站提示 非官方網站 需要找官方添加白名單 下面可以直接用自己的郵箱去發送申請 支付寶提示“非支付寶官方網頁&#xff0c;請確認是否繼續訪問”通常是因為支付寶的安全機制檢測到您訪問的頁面不是支付寶官方頁面&#xff0c;這可能是由于域名或頁面內容不符合支…

【今日三題】打怪(模擬) / 字符串分類(字符串哈希) / 城市群數量(dfs)

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;每日兩三題 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 打怪(模擬)字符串分類(字符串哈希)城市群數量(dfs) 打怪(模擬) 打怪 #include <iostream> using namespace std;int …

npm install 版本過高引發錯誤,請添加 --legacy-peer-deps

起因&#xff1a;由于使用"react": "^19.0.0", 第三方包要低版本react&#xff0c;錯解決方法&#xff01; npm install --save emoji-mart emoji-mart/data emoji-mart/react npm install --save emoji-mart emoji-mart/data emoji-mart/react npm err…

Python基礎總結(七)之條件語句

文章目錄 條件語句if一、Python中的真假二、條件語句格式2.1 if語句格式2.2 if-else語句2.3 if-elif-else語句 三、if語句嵌套 條件語句if 條件語句其實就是if語句&#xff0c;在講解if語句之前需要知道Python中對于真假的判斷。 一、Python中的真假 在Python中非0的都為真&…

基于Ubuntu2504部署OpenStack E版

OpenStack 初始化環境安裝數據庫、memcahe、rabbitmq等服務安裝keystone服務安裝glance服務安裝placement服務安裝nova服務安裝neutron服務安裝horizon服務 官網 OpenStack Epoxy 鞏固了作為 VMware 替代方案的地位&#xff0c;增強了安全性&#xff0c;并改進了硬件支持 第 3…

可發1區的超級創新思路(python 、MATLAB實現):基于多尺度注意力TCN-KAN與小波變換的時間序列預測模型

一、數學模型與原理 1.1 小波變換多尺度分解 輸入功率序列 x(t) 經小波變換分解為近似系數 Aj? 與細節系數 Dj?: 1.2 多尺度TCN特征提取 對每個尺度子序列 {A3?,D3?,D2?,D1?} 采用獨立TCN: 式中 ?d? 為擴張率 d=2l 的擴張卷積,Wd? 為可學習參數。 1.3 多尺度注…

YOLOv11改進有效漲點專欄:從理論到實戰的深度優化指南

## YOLOv11的進化之路 在目標檢測領域,YOLO系列算法始終保持著革命性的創新步伐。YOLOv11作為該系列的最新演進版本,在保持實時檢測優勢的同時,通過架構層面的深度優化實現了精度與速度的平衡。本文將從**七大核心模塊**出發,系統性地解析針對YOLOv11的有效改進方案,涵蓋從…

Cursor新版0.49.x發布

小子看到 Cursor 0.49.x 版本正式發布&#xff0c;截止今天已經有兩個小patch版本&#xff01;本次更新聚焦于 自動化Rules生成、改進的 Agent Terminal 以及 MCP 圖像支持&#xff0c;并帶來了一系列旨在提升編碼效率和協作能力的改進與修復。 以下是本次更新的詳細內容&…

《手環表帶保養全攻略:材質、清潔與化學品避坑指南》

系列文章目錄 文章目錄 系列文章目錄前言一、表帶材質特性與專屬養護方案二、清潔劑使用紅黑榜三、家庭清潔實驗&#xff1a;化學反應警示錄四、保養實踐方法論總結 前言 手環作為現代生活的智能伴侶&#xff0c;表帶材質選擇豐富多樣。從柔軟親膚的皮質到耐用耐磨的金屬&…

實現批量圖片文字識別(python+flask+EasyOCR)

話不多說,向上效果圖 1)先說框架版本 為什么要先說框架版本呢,因為我在各種版本中嘗試了兩天,總算確定了如下版本適合我,至于其他的版本,各位自己去嘗試 python 3.9.7 EasyOCR 1.7.2 flask 3.0.3 2)執行操作效果圖 2.1)多選文件 2.2)圖片預覽 2.3)提取選中文件 2.4)提取所有文…