STM32標準庫移植RT-Thread nano

STM32標準庫移植RT-Thread Nano

嗶哩嗶哩教程鏈接:STM32F1標準庫移植RT_Thread Nano

移植前的準備

  1. stm32標準庫的裸機代碼(最好帶有點燈和串口)
  2. RT-Thread Nano Pack
  3. 自己的開發板

移植前的說明

本人是在讀學生,正在學習階段,移植過程中,會有疏漏與不足,請有緣看到的讀者指出,且敬請諒解,我會積極更改錯誤之處

移植步驟

在這里插入圖片描述

一、打開RT-Thread文檔中心作為參考: RT-Thread文檔中心

二、keil上安裝RT-Thread Nano Pack

1.用Keil IDE內安裝RT-Thread Nano Pack(在線安裝)
(1)打開Keil,選擇Pack Installer ,關閉提示窗口

在這里插入圖片描述

(2)打開pack,選擇安裝(我這里已經安裝所以顯示Remove)

在這里插入圖片描述

2.用離線安裝包安裝RT-Thread Nano Pack(離線安裝)
(1)下載離線包:RT-Thread Nano Pack 離線安裝包
(2)離線安裝(雙擊下載好的安裝包,進行安裝)

在這里插入圖片描述
在這里插入圖片描述
表示安裝完成

三、添加內核源碼

在這里插入圖片描述
通過以上三個步驟,完成勾選以后,點擊OK,就可以完成內核的添加,在keil目錄結構中,就能夠看到如下所示的內容,表示內核添加成功
在這里插入圖片描述

四、刪除與邏輯沖突的中斷相關的函數

1.打開stm32f10x_it.c 找到相關的中斷的函數

在這里插入圖片描述

2.對與邏輯沖突的中斷的函數,進行注釋或刪除

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3.添加systick的中斷函數到board.c中
void SysTick_Handler()
{rt_interrupt_enter();rt_tick_increase();rt_interrupt_leave();
}

在這里插入圖片描述

五、刪除RT-Thread中的部分代碼,添加系統的時鐘配置

1.注釋或刪除以下一行代碼:
 #error "TODO 1: OS Tick Configuration."

在這里插入圖片描述

2.添加時鐘配置
SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

在這里插入圖片描述

3.board.c中添加需要的頭文件
#include "stm32f10x.h" 
#include "gpio.h"
#include "usart.h"
#include "delay.h"

在這里插入圖片描述
通過以上步驟,就完成了在STM32標準庫上進行RT-Thread Nano版本的移植,編譯一下,0警告0錯誤
在這里插入圖片描述

六、創建任務進行驗證

1.在工程的user文件夾下,新建RT-Thread相關的頭文件和源文件,并添加到工程中

在這里插入圖片描述

2.編寫user下的RT-Thread的源文件(我的是RT_Thread_demo.c)
(1)包含頭文件
#include "stm32f10x.h" 
#include "RT_Thread_demo.h"
#include <rtthread.h>
#include "delay.h"
#include "gpio.h"
#include "usart.h"

在這里插入圖片描述

(2)編寫需要用到的宏定義
#define TASK1_PRIO      1                        /* 任務優先級 */
#define TASK1_STK_SIZE  128                       /* 任務堆棧大小 */
static rt_thread_t      Task1_Handler = RT_NULL;  /* 任務句柄 */
void Task1(void *pvParameters);             /* 任務函數 */#define TASK2_PRIO      2                        /* 任務優先級 */
#define TASK2_STK_SIZE  128                       /* 任務堆棧大小 */
static rt_thread_t      Task2_Handler = RT_NULL;  /* 任務句柄 */
void Task2(void *pvParameters);             /* 任務函數 */#define TASK3_PRIO      3                        /* 任務優先級 */
#define TASK3_STK_SIZE  128                       /* 任務堆棧大小 */
static rt_thread_t      Task3_Handler = RT_NULL;  /* 任務句柄 */
void Task3(void *pvParameters);             /* 任務函數 */

在這里插入圖片描述

(3) 通過函數創建任務,并在main.c中調用
void RT_Thread_demo(void)
{Task1_Handler = rt_thread_create("Task1_Handler",Task1,RT_NULL,TASK1_STK_SIZE,TASK1_PRIO,20);rt_thread_startup(Task1_Handler);Task2_Handler = rt_thread_create("Task2_Handler",Task2,RT_NULL,TASK2_STK_SIZE,TASK2_PRIO,20);rt_thread_startup(Task2_Handler);Task3_Handler = rt_thread_create("Task3_Handler",Task3,RT_NULL,TASK3_STK_SIZE,TASK3_PRIO,20);rt_thread_startup(Task3_Handler);
}

在這里插入圖片描述

(4) 編寫任務函數
void Task1(void *parameter)
{while(1){LED1_Toggle;//printf("Task1\r\n");USART_SendString(USART1,(unsigned char*)"Task1\r\n");rt_thread_mdelay(300);}rt_thread_delay(10);
}void Task2(void *parameter)
{while(1){LED2_Toggle;//printf("Task2\r\n");USART_SendString(USART1,(unsigned char*)"Task2\r\n");rt_thread_mdelay(600);		}rt_thread_delay(10);
}void Task3(void *parameter)
{while(1){LED3_Toggle;//printf("Task3\r\n");USART_SendString(USART1,(unsigned char*)"Task3\r\n");rt_thread_mdelay(900);		}rt_thread_delay(10);
}

在這里插入圖片描述

(5) 模塊初始化

把用到的初始化函數都放在board.c的rt_hw_board_init 中
在這里插入圖片描述
在這里插入圖片描述

通過以上步驟,已經完成對RT_Thread的移植。接下來調試驗證

七、移植rt_kprintf函數

1. 在rtconfig.h中修改部分代碼
(1)定義 RT_USING_CONSOLE

在這里插入圖片描述

(2)刪除或注釋 uart_init 中的部分代碼并加入usart的初始化函數(board.c中)

在這里插入圖片描述
在這里插入圖片描述

(3)刪除rt_hw_console_output部分代碼并修改

在這里插入圖片描述
函數修改為:

void rt_hw_console_output(const char *str)
{rt_enter_critical();while(*str != '\0')		{if(*str == '\n'){USART_SendData(RT_kprintf_USARTx,'\r');while(USART_GetFlagStatus(RT_kprintf_USARTx, USART_FLAG_TXE) == RESET);	//等待上一個字節發送完成}USART_SendData(RT_kprintf_USARTx, *str++);								//發送一個字節while(USART_GetFlagStatus(RT_kprintf_USARTx, USART_FLAG_TXE) == RESET);	//等待上一個字節發送完成}rt_exit_critical();
}

在這里插入圖片描述

八、finsh組件的移植

1. 添加組件源碼

在這里插入圖片描述
keil的目錄結構中,會出現如下文件
在這里插入圖片描述

2. rtconfig.h 中打開 finsh 選項

在這里插入圖片描述

3. 修改 finsh_port.c 文件
#include <rthw.h>
#include <rtconfig.h>
#include "stm32f10x.h"
#include "usart.h"#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 
#endif#ifdef RT_USING_FINSHRT_WEAK char rt_hw_console_getchar(void)
{int ch = -1;//查詢方式實現,記得將Usart1初始化中的中斷接收配置相關代碼注釋掉/*等待串口1輸入數據*/if( USART_GetFlagStatus( RT_kprintf_USARTx, USART_FLAG_RXNE ) != RESET ){ch = ( int )USART_ReceiveData( RT_kprintf_USARTx );USART_ClearFlag( RT_kprintf_USARTx, USART_FLAG_RXNE );}else{if( USART_GetFlagStatus( RT_kprintf_USARTx, USART_FLAG_ORE ) != RESET ){USART_ClearFlag( RT_kprintf_USARTx, USART_FLAG_ORE );}rt_thread_mdelay( 10 );}return ch;
}#endif /* RT_USING_FINSH */
4. 修改串口的初始化函數
void uart1_init(uint32_t bound)
{GPIO_InitTypeDef GPIO_InitStructure;    //GPIOUSART_InitTypeDef USART_InitStructure;  //USARTNVIC_InitTypeDef NVIC_InitStructure;    //NVICRCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;    //USART1_TXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	    //USART1_RXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		//子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);USART_OverSampling8Cmd(USART1,ENABLE);USART_InitStructure.USART_BaudRate = bound;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發模式USART_Init(USART1, &USART_InitStructure);         //初始化串口1USART_Cmd(USART1, ENABLE);                       //使能串口1
}

通過以上步驟,對RT-Thread Nano版本的移植到此結束,希望大家相互學習,相互鼓勵!!!!

九、keil調試驗證

詳細調試步驟,請移步至嗶哩嗶哩視頻教程:STM32F1標準庫移植RT_Thread Nano

九、燒錄到開發板驗證

詳細步驟,請移步至嗶哩嗶哩視頻教程:STM32F1標準庫移植RT_Thread Nano

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

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

相關文章

JVM--類加載器

概念 類加載器&#xff1a;只參與加載過程中的字節碼獲取并加載到內存中的部分&#xff1b;java虛擬機提供給應用程序去實現獲取類和接口字節碼數據的一種技術&#xff0c;也就是說java虛擬機是允許程序員寫代碼去獲取字節碼信息 類加載是加載的第一步&#xff0c;主要有以下三…

ECMAScript 6語法

1.ES6簡介 ECMAScript 6&#xff08;簡稱ES6&#xff09;是于2015年6月正式發布的JavaScript語言的標準&#xff0c;正式名為ECMAScript 2015&#xff08;ES2015&#xff09;。它的目標是使得JavaScript語言可以用來編寫復雜的大型應用程序&#xff0c;成為企業級開發語言 。 …

聯想Y7000+RTX4060+i7+Ubuntu22.04運行DeepSeek開源多模態大模型Janus-Pro-1B+本地部署

直接上手搓了&#xff1a; conda create -n myenv python3.10 -ygit clone https://github.com/deepseek-ai/Janus.gitcd Januspip install -e .pip install webencodings beautifulsoup4 tinycss2pip install -e .[gradio]pip install pexpect>4.3python demo/app_januspr…

Tez 0.10.1安裝

個人博客地址&#xff1a;Tez 0.10.1安裝 | 一張假鈔的真實世界 具體安裝步驟參照官網安裝手冊即可。此處只對官網手冊進行補充。 從官網下載apache-tez-0.10.1-bin.tar.gz進行安裝未成功&#xff0c;出現下面的異常。最終按照官網源代碼編譯的方式安裝測試成功。 環境 Had…

FastAPI + GraphQL + SQLAlchemy 實現博客系統

本文將詳細介紹如何使用 FastAPI、GraphQL&#xff08;Strawberry&#xff09;和 SQLAlchemy 實現一個帶有認證功能的博客系統。 技術棧 FastAPI&#xff1a;高性能的 Python Web 框架Strawberry&#xff1a;Python GraphQL 庫SQLAlchemy&#xff1a;Python ORM 框架JWT&…

微服務入門(go)

微服務入門&#xff08;go&#xff09; 和單體服務對比&#xff1a;里面的服務僅僅用于某個特定的業務 一、領域驅動設計&#xff08;DDD&#xff09; 基本概念 領域和子域 領域&#xff1a;有范圍的界限&#xff08;邊界&#xff09; 子域&#xff1a;劃分的小范圍 核心域…

深入解析 Linux 內核內存管理核心:mm/memory.c

在 Linux 內核的眾多組件中,內存管理模塊是系統性能和穩定性的關鍵。mm/memory.c 文件作為內存管理的核心實現,承載著頁面故障處理、頁面表管理、內存區域映射與取消映射等重要功能。本文將深入探討 mm/memory.c 的設計思想、關鍵機制以及其在內核中的作用,幫助讀者更好地理…

安卓通過網絡獲取位置的方法

一 方法介紹 1. 基本權限設置 首先需要在 AndroidManifest.xml 中添加必要權限&#xff1a; xml <uses-permission android:name"android.permission.INTERNET" /> <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /&g…

【B站保姆級視頻教程:Jetson配置YOLOv11環境(二)SSH連接的三種方式】

B站同步視頻教程&#xff1a;https://www.bilibili.com/video/BV1m5wUeyEQD/ 在Jetson設備上配置YOLOv11環境時&#xff0c;SSH連接是實現遠程高效開發與管理的關鍵一環。不同的網絡環境和硬件配置可能會影響SSH連接的方式&#xff0c;本文將結合相關視頻內容&#xff0c;詳細…

視頻拼接,拼接時長版本

目錄 視頻較長&#xff0c;分辨率較大&#xff0c;這個效果很好&#xff0c;不耗用內存 ffmpeg imageio&#xff0c;適合視頻較短 視頻較長&#xff0c;分辨率較大&#xff0c;這個效果很好&#xff0c;不耗用內存 ffmpeg import subprocess import glob import os from nats…

Vue.js 什么是 Composition API?

Vue.js 什么是 Composition API&#xff1f; 今天我們來聊聊 Vue 3 引入的一個重要特性&#xff1a;組合式 API&#xff08;Composition API&#xff09;。如果你曾在開發復雜的 Vue 組件時感到代碼難以維護&#xff0c;那么組合式 API 可能正是你需要的工具。 什么是組合式 …

Selenium配合Cookies實現網頁免登錄

文章目錄 前言1 方案一&#xff1a;使用Chrome用戶數據目錄2 方案二&#xff1a;手動獲取并保存Cookies&#xff0c;后續使用保存的Cookies3 注意事項 前言 在進行使用Selenium進行爬蟲、網頁自動化操作時&#xff0c;登錄往往是一個必須解決的問題&#xff0c;但是Selenium每次…

計算機畢業設計Python+知識圖譜大模型AI醫療問答系統 健康膳食推薦系統 食譜推薦系統 醫療大數據 機器學習 深度學習 人工智能 爬蟲 大數據畢業設計

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

關于el-table翻頁后序號列遞增的組件封裝

需求說明&#xff1a; 項目中經常會用到的一個場景&#xff0c;表格第一列顯示序號&#xff08;1、2、3...&#xff09;&#xff0c;但是在翻頁后要遞增顯示序號&#xff0c;例如10、11、12&#xff08;假設一頁顯示10條數據&#xff09;&#xff0c;針對這種情況&#xff0c;封…

Elasticsearch的索引生命周期管理

目錄 說明零、參考一、ILM的基本概念二、ILM的實踐步驟Elasticsearch ILM策略中的“最小年齡”是如何計算的&#xff1f;如何監控和調整Elasticsearch ILM策略的性能&#xff1f; 1. **監控性能**使用/_cat/thread_pool API基本請求格式請求特定線程池的信息響應內容 2. **調整…

AI大模型開發原理篇-3:詞向量和詞嵌入

簡介 詞向量是用于表示單詞意義的向量&#xff0c; 并且還可以被認為是單詞的特征向量或表示。 將單詞映射到實向量的技術稱為詞嵌入。在實際應用中&#xff0c;詞向量和詞嵌入這兩個重要的NLP術語通常可以互換使用。它們都表示將詞匯表中的單詞映射到固定大小的連續向量空間中…

[內網安全] 內網滲透 - 學習手冊

這是一篇專欄的目錄文檔&#xff0c;方便讀者系統性的學習&#xff0c;筆者后續會持續更新文檔內容。 如果沒有特殊情況的話&#xff0c;大概是一天兩篇的速度。&#xff08;實驗多或者節假日&#xff0c;可能會放緩&#xff09; 筆者也是一邊學習一邊記錄筆記&#xff0c;如果…

【學術會議征稿-第二屆生成式人工智能與信息安全學術會議(GAIIS 2025)】人工智能與信息安全的魅力

重要信息 時間&#xff1a;2025年2月21日-23日 地點&#xff1a;中國杭州 官網&#xff1a;http://www.ic-gaiis.org 簡介 2025年第二屆生成式人工智能與信息安全將于 2025年2月21日-23日在中國杭州舉行。主要圍繞“生成式人工智能與信息安全”的最新研究展開&#xff0c;…

Vscode的AI插件 —— Cline

簡介 vscode的一款AI輔助吃插件&#xff0c;主要用來輔助創建和編輯文件&#xff0c;探索大型項目&#xff0c;使用瀏覽器并執行終端命令&#xff08;需要多個tokens&#xff09;&#xff0c;可以使用模型上下文協議&#xff08;MCP&#xff09;來創建新工具并擴展自己(比較慢…

2024 CVPR Highlight Learning-Feedback

圖像增強 Towards Robust Event-guided Low-Light Image Enhancement: A Large-Scale Real-World Event-Image Dataset and Novel Approach 解決的主要問題是低光照條件下的圖像增強 通過多尺度整體融合分支提取事件和圖像的結構和紋理信息&#xff0c;并引入信噪比&#xff0…