基于RT-Thread的STM32F4開發第二講第一篇——ADC

文章目錄

  • 前言
  • 一、RT-Thread工程創建
  • 二、ADC工程創建
  • 三、ADC功能實現
    • 1.ADC.c
    • 2.ADC.h
    • 3.mian.c
  • 四、效果展示和工程分享
  • 總結


前言

ADC是什么不多講了,前面裸機操作部分有很多講述。我要說的是RT-Thread對STM32的ADC外設的適配極其不好,特別是STM32G4系類,這一章先講STM32F4的ADC應用。本文使用的是RT-Thread最新的驅動5.1.0,兼容下面的所有驅動。使用的開發板是正點原子的STM32F4探索者


一、RT-Thread工程創建

先在RT-Thread studio中創建好工程,參考下面的文章使得驅動5.1.0全構建不報錯和警告,如圖所示。
RT-Thread studio的驅動5.1.0報錯修改
在這里插入圖片描述
不要著急修改時鐘配置,這里按我方法來,打開自動生成的CubeMX Settings(找不到的話點擊窗口,恢復窗口布局,在項目資源管理器下。在CubeMX中按裸機編程一樣,把時鐘和需要用到的外設都配置好。配置詳情我就不說了,看前面的文章就行,這里放幾張圖示例。
注意使用到的外設都要配置,開局使用串口1作為控制臺串口,所以這里也配置了。
在這里插入圖片描述
這里我使用了ADC1和ADC2,配置如下,對于每個外設的詳細工作參數,我建議也配置一下,可以作為后面RT-Thread的參考,關于ADC的詳情配置見下文。
STM32LL庫編程系列第八講——ADC模數轉換
在這里插入圖片描述
在這里插入圖片描述
這里的IDE要選擇EWARM,也就是保持默認,很重要,其他照常
在這里插入圖片描述
在這里插入圖片描述
到這一步就可以生成工程了
在這里插入圖片描述
第一次生成工程后要把cubeMX關閉掉,這樣RT-Thread studio才會同步,如下
在這里插入圖片描述
點擊確認,重點來了
點擊左邊文件,cubemx(沒有的話,刷新一下),右鍵Src,資源配置,排除構建
在這里插入圖片描述
打開cubemx的mian.c復制函數void SystemClock_Config(void),包括函數名全部復制,在打開drivers/drv_clk.c,把void system_clock_config(int target_freq_mhz)函數刪了,把復制的void SystemClock_Config(void)粘貼原地,接著全編譯,沒有問題。
在這里插入圖片描述
到這一步你可以把工程保存好,在RT-Thread studio中基于STM32F407系類的驅動5.1.0的初始工程創建完成,以后再用就直接復制工程就行,不用重復創建了。這一點也希望官方優化,不需要我們這么麻煩。

二、ADC工程創建

接下來,工程名更改為IO_ADC2。
打開cubemx/src/adc.h。復制函數void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)到drivers/board.c的末尾,也就是這樣。
在這里插入圖片描述
這兩個函數不需要在board.h中去聲明,有其他.h已經聲明好了,所以這里復制過來就可以用。
打開board.h需要的ADC的宏,不需要再去stm32f4xx_hal_config.h中注釋宏#define HAL_ADC_MODULE_ENABLED了,細心的同學可以發現了,drivers中更名為了stm32f4xx_hal_config_bak.h。而stm32f4xx_hal_config.h在cubemx/inc中了,已經在創建時開啟宏HAL_ADC_MODULE_ENABLED了。
在這里插入圖片描述
接著在RT-Thread Settings中打開ADC驅動
在這里插入圖片描述
注意開啟ulog日志,進入到里面開啟使能浮點數支持,這將會使我們rt_kprintf能夠輸出浮點數。
在這里插入圖片描述

在這里插入圖片描述
到此全編譯程序沒有錯誤,到這里ADC工程創建完成了
在這里插入圖片描述

三、ADC功能實現

這里我要講點網上沒有的(起碼此刻孤陋寡聞的我沒找到)
點擊drivers/include/confing/adc_confing.h這里有我們使用的ADC的初始化參數,rtthread studio并沒有ADC參數控制函數,想要修改,只能在這改,希望官方更新一下,可以像uart外設這樣,建一個ADC參數結構體,里面包含了所有參數設計,再利用rt_device_control函數寫進去,這樣才符合常理,不能老是去驅動文件里改啊,很難找的。
這里說笑了,對于國產軟件生態,還需要我們大家共同努力完善。所以我愿意把我的發現免費分享出來。
打開cubemx/src/adc.c對照里面的參數設置,對adc_confing.h進行更改(這也是我前面說最好把參數配置完全,后面好參照。我這里修改了ADC的位數。
在這里插入圖片描述
打開drivers/drv_adc.c找到函數stm32_get_adc_value這里面有如下設置語句

ADC_ChanConf.Channel =  stm32_adc_get_channel(channel);
ADC_ChanConf.Rank = 1;
ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_112CYCLES;
ADC_ChanConf.Offset = 0;

這些語句不是在一起的,這里設置了通道的參數,可以修改。后面有HAL_ADC_ConfigChannel(stm32_adc_handler, &ADC_ChanConf);到這ADC的初始化才結束。編譯程序沒有錯誤。
APP文件夾里是我自定義的文件夾,其他函數不用管,本工程只用到ADC.c和ADC.h。注意創建文件夾要把頭文件目錄添加進構建啊。如何添加見本系列第一講
在這里插入圖片描述

1.ADC.c

這里面包含adc初始化和線程初始化,代碼邏輯我就不講了,我的代碼風格應該挺正規的,具體編寫流程去看官方文檔或其他人文章

#include "ADC.h"#define     ADC1_NAME   "adc1"
#define     ADC2_NAME   "adc2"
#define     REFER_VOLTAGE   3.3
#define     CONVERT_BITS    (1<<10)static void adc_thread_entry(void *parameter);
rt_adc_device_t adc1_handle,adc2_handle;
int adc_init(void)
{rt_err_t adc1_flag,adc2_flag;adc1_handle = (rt_adc_device_t)rt_device_find(ADC1_NAME);adc2_handle = (rt_adc_device_t)rt_device_find(ADC2_NAME);if((adc1_handle == RT_NULL) || (adc2_handle == RT_NULL)){rt_kprintf("failed to adc handle fine\n");return -1;}adc1_flag = rt_adc_enable(adc1_handle, 1);adc2_flag = rt_adc_enable(adc2_handle, 0);if((adc1_flag != RT_EOK) || (adc2_flag != RT_EOK)){rt_kprintf("failed to adc enable\n");return -1;}rt_kprintf("adc1 and adc2 init success\n");return 0;
}
int adc_thread_init(void)
{rt_thread_t adc_thread;adc_thread = rt_thread_create("adc_thread", adc_thread_entry, RT_NULL, 1024, 9, 100);if(adc_thread == RT_NULL){rt_kprintf("failed to adc thread create");return -1;}if(rt_thread_startup(adc_thread) != RT_EOK){rt_kprintf("failed to adc startup\n");return -1;}return 0;
}
static void adc_thread_entry(void *parameter)
{float adc1_V_old = 0,adc2_V_old = 0;float adc1_V_new,adc2_V_new;while(1){adc1_V_new = (float)rt_adc_read(adc1_handle, 1)*REFER_VOLTAGE/CONVERT_BITS;adc2_V_new = (float)rt_adc_read(adc2_handle, 0)*REFER_VOLTAGE/CONVERT_BITS;if( ((int)(adc1_V_old *100) != (int)(adc1_V_new *100)) || ((int)(adc2_V_old *100) != (int)(adc2_V_new *100)) ){rt_kprintf("get voltage for adc1 and adc2 is: %.2f and %.2f\n",adc1_V_new, adc2_V_new);adc1_V_old = adc1_V_new;adc2_V_old = adc2_V_new;}rt_thread_mdelay(100);}
}

2.ADC.h

#ifndef APP_ADC_H_
#define APP_ADC_H_#include <board.h>
#include <rtdevice.h>int adc_init(void);
int adc_thread_init(void);#endif /* APP_ADC_H_ */

3.mian.c

#include <rtthread.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "ADC.h"int main(void)
{adc_init();adc_thread_init();while (1){rt_thread_mdelay(1000);}return RT_EOK;
}

編譯0錯誤0警告,到此工程結束。

四、效果展示和工程分享

在這里插入圖片描述
因為探索者開發板沒有滑動變阻器測試ADC模塊的設置,這里我直接把PA1的接了3.3V,PA0懸空。所以ADC2的讀數不重要,按理說ADC1讀數應該保持3.3V不變啊,即使便,應該也要非常小,看輸出結果都有2點多伏了,這里我開始也懷疑,然后我用裸機的官方HAL庫例程看了一下,發現官方HAL庫例程也一樣會有這種跳變誤差。后面知道是ADC的濾波函數沒有用,STM32f4的HAL庫我就沒找到有這個函數(下一章的STM32g4的就有),那就不管了,功能是沒問題的,ADC檢測也沒問題。
工程上傳百度網盤,包括IO_ADC2和初始工程文件,免費下載。同時也上傳到CSDN,被強制成為VIP才能下載(其實我是想每個工程收1積分)。如果你剛好有VIP,就請CSDN下載支持一下,嘻嘻。沒有的話,千萬別開,死貴,去百度網盤下載。

通過網盤分享的文件:IO_ADC2.zip
鏈接: https://pan.baidu.com/s/1uql0Hphcij3f9HFUfNTTxw?pwd=fdm9 提取碼: fdm9
通過網盤分享的文件:RT_driver_5.1.0_STM32F407ZGx.zip
鏈接: https://pan.baidu.com/s/1uZD_JULeHrG_pVsWSjOggQ?pwd=mp41 提取碼: mp41


總結

創建工程有點繁瑣,如果有某些地方我沒說到導致報錯了,請下載工程,這些工程我是驗證過的,沒有問題。把問題發在評論區,我看到了會修改回來。

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

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

相關文章

FoMo 數據集是一個專注于機器人在季節性積雪變化環境中的導航數據集,記錄了不同季節(無雪、淺雪、深雪)下的傳感器數據和軌跡信息。

2025-05-02&#xff0c;由加拿大拉瓦爾大學北方機器人實驗室和多倫多大學機器人研究所聯合創建的 FoMo 數據集&#xff0c;目的是研究機器人在季節性積雪變化環境中的導航能力。該數據集的意義在于填補了機器人在極端季節變化&#xff08;如積雪深度變化&#xff09;下的導航研…

vue3+ts繼續學習

我們再寫點東西&#xff0c;這里面都是vue2的語法&#xff0c;應該都能看明白&#xff01;我們寫完直接去運行一下代碼&#xff01; 發現什么都沒有發生&#xff01;為什么呢&#xff1f;因為我們在App.vue中沒有引入&#xff01;哈哈哈哈&#xff01;這樣就好了&#xff01;注…

LIO-Livox

用單臺Livox Horizon (含內置IMU) 實現高魯棒性的激光-慣性里程計&#xff0c;可在各類極端場景下魯棒運行&#xff0c;并達到高精度的定位和建圖效果。(城區擁堵、高速公路、幽暗隧道) 注&#xff1a;該系統主要面向大型室外環境中的汽車平臺設計。用戶可以使用 Livox Horizo…

day18-API(常見API,對象克隆)

課程目標 能夠熟練使用Math類中的常見方法 能夠熟練使用System類中的常見方法 能夠理解Object類的常見方法作用 能夠熟練使用Objects類的常見方法 能夠熟練使用BigInteger類的常見方法 能夠熟練使用BigDecimal類的常見方法 1 Math類 1.1 概述 tips&#xff1a;了解內容…

用OMS從MySQL遷移到OceanBase,字符集utf8與utf8mb4的差異

一、問題背景 在一次從MySQL數據庫遷移到OceanBase的MySQL租戶過程中&#xff0c;出現了一個轉換提示&#xff1a; [WARN][CONVER] he table charset:utf8->utf8mb4&#xff0c; 你可能會擔心這種轉換可能導致字符集不兼容的問題。但通過查閱相關資料可知&#xff0c;utf8m…

MATLAB中tabulate函數——先驗概率的簡單估計

load fisheriris X meas(:,1:2); Y species; labels unique(Y); tabulate(Y)ValueCountPercentsetosa5033.33%versicolor5033.33%virginica5033.33%

《Python星球日記》第28天:數據獲取與可視化(綜合項目)

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 專欄:《Python星球日記》,限時特價訂閱中ing 目錄 一、項目概述二、數據獲取1. 準備工作2. 使用 `requests` 獲取網頁內容3. 使用 `BeautifulSoup`…

基于深度學習的圖像識別技術:從原理到應用

前言 在當今數字化時代&#xff0c;圖像識別技術已經滲透到我們生活的方方面面&#xff0c;從智能手機的人臉解鎖功能到自動駕駛汽車對交通標志的識別&#xff0c;再到醫療影像診斷中的病變檢測&#xff0c;圖像識別技術正以其強大的功能和廣泛的應用前景&#xff0c;改變著我們…

限免開關實施版本保護措施,保證項目灰度發布安全

迭代用戶限免權限校驗業務 新增限免開關實現普通用戶權益更新&#xff0c;實施版本保護措施&#xff0c;保證項目灰度發布安全&#xff1b; // 是否展示限免標識 func (t *BasePrivilegeService) IsPromotionFree(p consumParams) bool {// 限免開關isFreeUseOpen : p.cfg.Vip…

從 AWS Marketplace 開始使用 AssemblyAI 的語音轉文本模型構建語音智能

語音智能和語音轉文本 &#xff08;STT&#xff09; 技術已變得至關重要&#xff0c;因為組織每天收集數千小時的電話、會議和客戶互動。僅靠原始音頻并不能推動決策 - 組織需要智能來大規模地從語音數據中提取價值。語音智能結合了語音識別、自然語言處理 &#xff08;NLP&…

Android組件化 -> Debug模式下,本地構建module模塊的AAR和APK

本地構建module模塊的AAR gradle.properties isCommonApp false模塊的build.gradle apply plugin: com.android.library&#xff1a;module模塊編譯manifest.srcFile src/main/AndroidManifest.xml&#xff1a;讀取沒有啟動App和Activity的配置文件 if (isCommonApp.toBoo…

FlexibleButton:一個輕巧靈活的按鍵處理庫,讓你的按鍵處理更簡單

在嵌入式系統開發中&#xff0c;按鍵輸入處理是一個常見且重要的環節。然而&#xff0c;許多開發者在處理按鍵時&#xff0c;往往會遇到按鍵消抖、組合按鍵、長按/短按等功能實現的復雜性。如何在保證系統高效運行的同時&#xff0c;簡化按鍵事件的處理呢&#xff1f; 今天&…

探索程序員薪資背后的秘密與未來:智能化工具如何助力職場發展

最新接入DeepSeek-V3模型&#xff0c;點擊下載最新版本InsCode AI IDE 探索程序員薪資背后的秘密與未來&#xff1a;智能化工具如何助力職場發展 引言 在當今數字化時代&#xff0c;程序員作為科技發展的核心力量&#xff0c;其職業前景和薪資水平備受關注。隨著人工智能和自…

【STM32單片機】#14 PWR電源控制

主要參考學習資料&#xff1a; B站江協科技 STM32入門教程-2023版 細致講解 中文字幕 開發資料下載鏈接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 單片機套裝&#xff1a;STM32F103C8T6開發板單片機C6T6核心板 實驗板最小系統板套件科協 目錄 PWR…

第十五屆藍橋杯單片機國賽-串口解析

串口通信像是藍橋杯單片機組國賽中一個若隱若現的秘境&#xff0c;總在不經意間為勇者們敞開大門。然而&#xff0c;初次探索這片領域的冒險者&#xff0c;常常會被其神秘莫測的特性所震懾&#xff0c;黯然退場&#xff08;編不下去了&#xff0c;直接進入正題&#xff09;。 附…

深入探索 51 單片機:從入門到實踐的全面指南

深入探索 51 單片機&#xff1a;從入門到實踐的全面指南 一、引言 在嵌入式系統發展的漫長歷程中&#xff0c;51 單片機猶如一顆璀璨的明星&#xff0c;雖然誕生已有數十年&#xff0c;但至今仍在眾多領域發揮著重要作用。它以結構簡單、易于學習、成本低廉等優勢&#xff0c…

GD32F470+CH395Q

第一步&#xff1a;資料下載 以太網協議棧芯片 CH395 - 南京沁恒微電子股份有限公司 第二步&#xff1a;準備工程 &#xff08;1&#xff09; 首先準備一個編譯無報錯、可以正常打印和延時的工程文件&#xff0c;官方例程采用STM32F1芯片&#xff0c;但本文采用GD32F470芯片 …

Linux 怎么使用局域網內電腦的網絡訪問外部

一次性 export http_proxy"http://192.168.0.188:7890" export https_proxy"http://192.168.0.188:7890"一直生效 寫入 ~/.bashrc&#xff08;或 ~/.bash_profile&#xff09; nano ~/.bashrc加入這一行&#xff1a; export http_proxy"http://19…

Mysql進階篇1_存儲引擎、索引、SQL性能分析指令

文章目錄 1.存儲引擎InnoDBMyISAMMemory存儲引擎選擇和對比 2.索引索引結構索引分類索引語法索引使用&#xff08;建議看完第3節后觀看&#xff09;&#xff01;&#xff01;&#xff01;mysql如何使用索引查詢數據&#xff08;個人理解&#xff09; 3.SQL性能分析SQL執行頻率慢…

LeetCode 熱題 100 118. 楊輝三角

LeetCode 熱題 100 | 118. 楊輝三角 大家好&#xff0c;今天我們來解決一道經典的算法題——楊輝三角。這道題在 LeetCode 上被標記為簡單難度&#xff0c;要求生成楊輝三角的前 numRows 行。楊輝三角是一個經典的組合數學問題&#xff0c;每一行的數字都是其正上方和正左上方…