【嵌入式系統】STM32配置FreeRTOS以及利用多線程完成流水燈、按鍵、蜂鳴器、數碼管工作

目錄

  • 1、利用STM32CubeMX配置FreeRTOS
  • 2、完成流水燈、按鍵、蜂鳴器數碼管工作
    • 1、在gpio.c和.h文件里面書寫并聲明按鍵掃描和led、數碼管子程序
    • 2、在freertos.c文件里面設置全局變量并且在各自任務中載入程序
  • 3、關于FreeRTOS的注意事項

1、利用STM32CubeMX配置FreeRTOS

假設我們之前的配置引腳、配置定時器、配置時鐘的步驟均已完成,現在開始導入FreeRTOS。
在這里插入圖片描述
接下來為我們的程序配置四個任務,注意這里我們的三個任務的優先級是一樣的。如果你設置了某一個任務的優先級高,那么程序運行時會一直運行那個任務而無法進入其他任務。
數碼管的優先級設高,不然數碼管的掃描如果受鍵碼的解析的拖延會產生閃爍!(可以試著把優先級改為low,然后你就會發現按鍵按下的時候數碼管會閃爍。)這個道理和中斷優先級是一樣的。具體可以看這篇文章:
關于優先級的一點問題思考
這里的function名字最好也修改成和task名字相對應,我這邊是當時上課沒注意。。。

圖1 ledtask設置
圖2 keytask設置
圖3 蜂鳴器task設置
圖4 數碼管task設置

最后導出文件即可。

2、完成流水燈、按鍵、蜂鳴器數碼管工作

1、在gpio.c和.h文件里面書寫并聲明按鍵掃描和led、數碼管子程序

void SetLeds(uint8_t sta)
{HAL_GPIO_WritePin(L1_GPIO_Port,L1_Pin,(sta & 0x01) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L2_GPIO_Port,L2_Pin,(sta & 0x02) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L3_GPIO_Port,L3_Pin,(sta & 0x04) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L4_GPIO_Port,L4_Pin,(sta & 0x08) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L5_GPIO_Port,L5_Pin,(sta & 0x10) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L6_GPIO_Port,L6_Pin,(sta & 0x20) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L7_GPIO_Port,L7_Pin,(sta & 0x40) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L8_GPIO_Port,L8_Pin,(sta & 0x80) ? GPIO_PIN_RESET:GPIO_PIN_SET);
}uint8_t KeyScan()
{uint8_t key = 0;if(HAL_GPIO_ReadPin(SW5_GPIO_Port,SW5_Pin) == GPIO_PIN_SET){key = 5;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW5_GPIO_Port,SW5_Pin) == GPIO_PIN_SET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW6_GPIO_Port,SW6_Pin) == GPIO_PIN_SET){key = 6;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW6_GPIO_Port,SW6_Pin) == GPIO_PIN_SET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW1_GPIO_Port,SW1_Pin) == GPIO_PIN_RESET){key = 1;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW1_GPIO_Port,SW1_Pin) == GPIO_PIN_RESET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW2_GPIO_Port,SW2_Pin) == GPIO_PIN_RESET){key = 2;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW2_GPIO_Port,SW2_Pin) == GPIO_PIN_RESET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW3_GPIO_Port,SW3_Pin) == GPIO_PIN_RESET){key = 3;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW3_GPIO_Port,SW3_Pin) == GPIO_PIN_RESET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW4_GPIO_Port,SW4_Pin) == GPIO_PIN_RESET){key = 4;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW4_GPIO_Port,SW4_Pin) == GPIO_PIN_RESET)return key;elsereturn 0;}return 0;
}
void Write595(uint8_t sel,uint8_t num,uint8_t bdot)	//共陰數碼管 '0'~'7' , '8'~'F'
{static const uint8_t TAB[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//71HC138輸出高電平,關掉數碼管顯示HAL_GPIO_WritePin(A3_GPIO_Port,A3_Pin,GPIO_PIN_RESET);uint8_t dat = TAB[num & 0x0F] |(bdot?0x80:0x00);	//74HC595鎖存8段數據for(uint8_t i=0;i<8;++i){HAL_GPIO_WritePin(SCK_GPIO_Port,SCK_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(SER_GPIO_Port,SER_Pin,(dat & 0x80)? GPIO_PIN_SET:GPIO_PIN_RESET);dat<<=1;HAL_GPIO_WritePin(SCK_GPIO_Port,SCK_Pin,GPIO_PIN_SET);}HAL_GPIO_WritePin(DISLK_GPIO_Port,DISLK_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(DISLK_GPIO_Port,DISLK_Pin,GPIO_PIN_SET);//74HC138譯碼,sel(0~3)對應4位片選信號輸出HAL_GPIO_WritePin(A0_GPIO_Port,A0_Pin,(sel & 0x01) ? GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(A1_GPIO_Port,A1_Pin,(sel & 0x02) ? GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(A2_GPIO_Port,A2_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(A3_GPIO_Port,A3_Pin,GPIO_PIN_SET);
}

2、在freertos.c文件里面設置全局變量并且在各自任務中載入程序

1、定義全局變量
在這里插入圖片描述
2、四個任務依次對應著我們當初配置
在這里插入圖片描述

1、流水燈任務

void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){SetLeds(sta);osDelay(interval);if(run){if(sta < 0x80) sta<<=1;else sta = 0x01;}osDelay(100);}/* USER CODE END StartDefaultTask */
}

2、按鍵任務

void StartTask02(void *argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */for(;;){key=KeyScan();if(key!=0) seg[0]=key;if(key == 1)	//start{run = 1;}if(key == 2){run = 0;}if(key == 3)	//speed up{interval/=2;if(interval <= 100) interval=100;}if(key == 4)	//speed down{interval*=2;if(interval >= 2000) interval=2000;}osDelay(100);}/* USER CODE END StartTask02 */
}

3、蜂鳴器任務

void StartTask03(void *argument)
{/* USER CODE BEGIN StartTask03 *//* Infinite loop */for(;;){beep_duty = key*100;TIM3->CCR1 = beep_duty;osDelay(100);}/* USER CODE END StartTask03 */
}

4、數碼管任務

void StartTaskSEG(void *argument)
{/* USER CODE BEGIN StartTaskSEG *//* Infinite loop */for(;;){for(uint8_t i =0;i<4;i++){Write595(i,seg[i],0);osDelay(5);}osDelay(1);}/* USER CODE END StartTaskSEG */
}

3、關于FreeRTOS的注意事項

注意點:

1、每個任務函數中都要有延時delay
2、osdelay使當前任務掛起,當延時結束,又喚醒當前任務,相當于釋放了cpu。
而HALdelay在延時中還是會占用cpu資源的。
3、時間戳可以在不使用delay的情況下得到當前時間
4、os函數都需要在任務函數中調用

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

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

相關文章

學好Java開發的關鍵七步

在學習編程的過程中&#xff0c;我覺得不止要獲得課本的知識&#xff0c;更多的是通過學習技術知識提高解決問題的能力&#xff0c;這樣我們才能走在最前方&#xff0c;本文主要講述如何學好Java開發的關鍵七步&#xff0c;更多Java專業知識&#xff0c;廣州瘋狂Java培訓為你講…

css模糊_如何使用CSS模糊圖像?

css模糊Introduction: 介紹&#xff1a; Sometimes even the professional developers tend to forget the various basic properties which can be applied to solve very simple problems, therefore the fundamentals of developing a website or web page should be very …

七、決策樹算法和集成算法

一、決策樹算法 Ⅰ&#xff0c;樹模型 決策樹&#xff1a;從根節點開始一步步走到葉子節點&#xff08;決策&#xff09; 所有的數據最終都會落到葉子節點&#xff0c;既可以做分類也可以做回歸 對于分類&#xff1a;是由眾數決定的&#xff0c;例如爺爺奶奶媽媽都是負數&…

leetcode 538. 把二叉搜索樹轉換為累加樹 思考分析

題目 給出二叉 搜索 樹的根節點&#xff0c;該樹的節點值各不相同&#xff0c;請你將其轉換為累加樹&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每個節點 node 的新值等于原樹中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索樹滿足下列約束條件&…

SQL中GROUP BY語句與HAVING語句的使用

最近在學習SQL Server相關知識&#xff0c;一直不知道怎么使用GROUP BY語句&#xff0c;經過研究和練習&#xff0c;終于明白如何使用了&#xff0c;在此記錄一下同時添加了一個自己舉的小例子&#xff0c;通過寫這篇文章來加深下自己學習的效果&#xff0c;還能和大家分享下&a…

scala語言示例_var關鍵字與Scala中的示例

scala語言示例Scala var關鍵字 (Scala var keyword) The var Keyword in scala is used to declare variables. As Scala does not require explicit declaration of data type of the variable, var keyword is used. The variable declared using the var keyword as mutable…

八、決策樹算法實驗可視化展示

一、樹模型的可視化展示 官網下載安裝包 右擊管理員身份運行&#xff0c;直接下一步即可。 配置環境變量&#xff1a; 將安裝好的可視化軟件的bin文件夾路徑添加到系統環境變量Path下即可 打開cmd&#xff0c;輸入dot -version&#xff0c;出現相關信息即安裝成功 二、決策…

關于在頁面中針對不同版本的IE瀏覽器實現不同的JS或者CSS樣式

一般會用到<!--[if IE]>這里是正常的html代碼<![endif]--> 條件注釋只能在windows Internet Explorer(以下簡稱IE)下使用&#xff0c;因此我們可以通過條件注釋來為IE添加特別的指令。因為這只是IE瀏覽器支持的注釋。 1&#xff0c;條件注釋的基本結構和HTML的注釋…

機器學習筆記:PCA的簡單理解以及應用建議

用notability做的筆記&#xff0c;比較隨意&#xff0c;對于第五點的PCA錯誤使用需要特別強調。 目錄1、PCA與線性回歸2、PCA主成分數量選擇3、壓縮重現4、PCA應用建議5、PCA的錯誤使用1、PCA與線性回歸 2、PCA主成分數量選擇 3、壓縮重現 4、PCA應用建議 5、PCA的錯誤使用

關于asp.net中的錯誤提示“將截斷字符串或二進制數據。 語句已終止。”

好久沒有更新博客了&#xff0c;今天在寫asp.net網站的時候&#xff0c;出現了這個問題。錯誤提示“將截斷字符串或二進制數據。 語句已終止。”通過調試&#xff0c;發現在插入數據的時候&#xff0c;由于插入的數據的字符或者二進制數據的長度大于原來定義的類型的長度。及保…

c# 無法將類型隱式轉換_C#中的隱式類型數組

c# 無法將類型隱式轉換C&#xff03;隱式類型數組 (C# Implicitly Typed Arrays) Like implicitly typed variables, we can also declare an array without specifying its type such type of arrays are known as Implicitly typed arrays. 像隱式類型的變量一樣&#xff0c;…

一、信用卡卡號識別

一、思路分析 大體思路&#xff1a;首先拿到一張銀行卡&#xff0c;我們得有銀行卡號數字的0-9樣式的模板&#xff0c;然后再通過不同數字的輪廓的外接矩形來進行匹配&#xff0c;最終識別出銀行卡號所對應的數字。 銀行卡數字模板&#xff1a; 銀行卡信息&#xff1a; 拿到…

bootstrap網格系統_如何使用Bootstrap網格系統?

bootstrap網格系統In the last article, we learned how to create a simple page of Bootstrap? Now, we will learn what is "Grid System" in Bootstrap and how we can use or implement it in our bootstrap page? As you know bootstrap is a mobile-friendl…

有關WriteableBitmap和BitmapImage之間的相互轉換

對于WP7中圖形處理有關WriteableBitmap和BitmapImage之間的相互轉換&#xff0c;給大家幾個簡單實用的方法。一、WriteableBitmap轉為BitmapImage對象var bi new BitmapImage(); bi.SetSource(wb.ToImage().ToStream()); //其中wb是WriteableBitmap對象。 二、BitmapImage轉為…

回溯法初步

本文為參考公眾號所做的筆記。 代碼隨想錄原文 回溯法本質是窮舉&#xff0c;窮舉所有可能&#xff0c;然后選出我們想要的答案&#xff0c;所以它并不是一個高效的算法。但是由于有些問題本身能用暴力搜出來就不錯了&#xff0c;所以回溯法也有很多的應用。 回溯法解決的問題…

QEMU中smp,socket,cores,threads幾個參數的理解

在用QEMU創建KVM guest的時候&#xff0c;為了指定guest cpu資源&#xff0c;用到了-smp, -sockets, -cores, -threads幾個參數&#xff0c; #/usr/bin/qemu-system-x86_64 -name pqsfc085 -enable-kvm -m 2048 -smp 2,sockets2,cores1,threads1 \ -boot ordernc,onced \ -hda …

二、文檔掃描OCR

一、思路分析 首先&#xff0c;拿到一張文檔&#xff0c;我們需要對文檔進行預處理操作&#xff0c;再進行輪廓檢測&#xff0c;因為就算拿到文檔輪廓&#xff0c;但是這些輪廓也有可能是歪歪扭扭的&#xff0c;這時候需要通過一系列的透視變換操作&#xff0c;將文檔擺正。通…

ruby hash方法_Ruby中帶有示例的Hash.select方法

ruby hash方法哈希選擇方法 (Hash.select Method) In this article, we will study about Hash.select Method. The working of this method can be predicted with the help of its name but it is not as simple as it seems. Well, we will understand this method with the…

leetcode 77. 組合 思考分析

目錄1、題目2、回溯法思路3、參考其他思路&#xff0c;更深入了解這個問題4、剪枝優化可能需要回顧到的知識文章&#xff1a;1、常用算法總結(窮舉法、貪心算法、遞歸與分治算法、回溯算法、數值概率算法)2、回溯法初步刪除vector容器中的對象元素的三種方法:pop_back, erase與…

ASP 調用dll(VB)及封裝dll實例

ASP調用dll及封裝dll實例&#xff0c;封裝為dll可以提供運行效率&#xff0c;加密代碼。 打開VB6&#xff0c;新建ActiveX DLL 2、在工程引用中加入Microsoft Active Server Pages Object Library選擇 3、填加代碼如下Code Start 聲明部分 Private MyScriptingContext As Scrip…