IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> RTT-移植Nano -> 正文阅读

[嵌入式]RTT-移植Nano

RTT-移植Nano

一、准备工作

  1. STM32F103模板工程
  2. RTT-nano源码 https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/an0038-nano-introduction

二、增减文件

  1. rt-thread\bsp里只保留board.crtconfig.h
  2. rt-thread\libcpu里只保留cortex-m3
  3. 在MDK的工程文件路径里加入:
  • rt-thread\bsp
  • rt-thread\components\finsh
  • rt-thread\include
  • rt-thread\include\libc

在这里插入图片描述

  1. 在MDK的工程文件Groups中添加RTT/src,加入rt-thread\src文件夹中的所有*.c文件
  2. 在MDK的工程文件Groups中添加RTT/port,加入rt-thread\libcpu\cortex-m3文件夹中context_rvds.Scpuport.c以及rt-thread\bsp中的rtconfig.h

在这里插入图片描述

三、修改文件

  1. 注释rtconfig.h中的#include “RTE_Components.h”
  2. 编译会发现报错,解决方法是将stm32f10x_it.c文件中的这个三个中断函数注释掉
linking...
.\Output\F103xE.axf: Error: L6200E: Symbol HardFault_Handler multiply defined (by context_rvds.o and stm32f10x_it.o).
.\Output\F103xE.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by context_rvds.o and stm32f10x_it.o).
.\Output\F103xE.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by board.o and bsp_systick.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 3 error messages.
".\Output\F103xE.axf" - 3 Error(s), 0 Warning(s).
  1. 修改rtconfig.h,取消#define RT_USING_HEAP这一行的注释,开启动态堆栈
  2. 新建board.h,修改board.c
#ifndef __BOARD_H__
#define __BOARD_H__

/* STM32 固件库头文件 */
#include "stm32f10x.h"
/* 开发板硬件bsp头文件 */
#include "bsp_uart.h"

void rt_hw_board_init(void);
void SysTick_Handler(void);
	
#endif 

/* 开发板硬件相关头文件 */
#include "board.h" 
/* RT-Thread相关头文件 */
#include <rthw.h>
#include <rtthread.h>

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#define RT_HEAP_SIZE 2048
/* 从内部SRAM里面分配一部分静态内存来作为rtt的堆空间,这里配置为8KB */
static uint32_t rt_heap[RT_HEAP_SIZE];
RT_WEAK void *rt_heap_begin_get(void)
{
    return rt_heap;
}

RT_WEAK void *rt_heap_end_get(void)
{
    return rt_heap + RT_HEAP_SIZE;
}
#endif

/**
  * @brief  开发板硬件初始化函数
  * @param  无
  * @retval 无
  *
  * @attention
  * RTT把开发板相关的初始化函数统一放到board.c文件中实现,
  * 当然,你想把这些函数统一放到main.c文件也是可以的。
  */
void rt_hw_board_init()
{
    /* 初始化SysTick */
    SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND );	
    
	/* 硬件BSP初始化统统放在这里,比如LED,串口,LCD等 */

	
/* 调用组件初始化函数 (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
    
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
	rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
    
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

/**
  * @brief  SysTick中断服务函数
  * @param  无
  * @retval 无
  *
  * @attention
  * SysTick中断服务函数在固件库文件stm32f10x_it.c中也定义了,而现在
  * 在board.c中又定义一次,那么编译的时候会出现重复定义的错误,解决
  * 方法是可以把stm32f10x_it.c中的注释或者删除即可。
  */
void SysTick_Handler(void)
{
    /* 进入中断 */
    rt_interrupt_enter();

    /* 更新时基 */
    rt_tick_increase();

    /* 离开中断 */
    rt_interrupt_leave();
}

四、适配rt_printf

  1. void rt_hw_board_init()中加入相应串口初始化
  2. board.c中适配void rt_hw_console_output(const char *str)
void rt_hw_console_output(const char *str)
{	
	/* 进入临界段 */
    rt_enter_critical();

	/* 直到字符串结束 */
    while (*str!='\0')
	{
		
		USART_SendData(DEBUG_USARTx, *str++); 				
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);	
	}	

	/* 退出临界段 */
    rt_exit_critical();
}
  1. 编写测试线程
#include "board.h"
#include "rtthread.h"

/* 定义线程控制块指针 */
static rt_thread_t test_thread = RT_NULL;
/* 线程实现 */
static void test_thread_entry(void *parameter)
{
    while (1)
    {
		rt_kprintf("test code!\n");
        rt_thread_delay(1000);   /* 延时1000个tick */
    }
}

int main(void)
{	
	
	test_thread =                          /* 线程控制块指针 */
        rt_thread_create("test",               /* 线程名字 */
                         test_thread_entry,   /* 线程入口函数 */
                         RT_NULL,             /* 线程入口函数参数 */
                         512,                 /* 线程栈大小 */
                         3,                   /* 线程的优先级 */
                         20);                 /* 线程时间片 */

    /* 启动线程,开启调度 */
    if (test_thread != RT_NULL)
        rt_thread_startup(test_thread);
    else
        return -1;
}

在这里插入图片描述

五、 适配Finsh

  1. 在MDK的工程文件Groups中添加RTT/components,加入rt-thread\components\finsh文件夹中的 cmd.cmsh.cshell.cfinsh_port.c
  2. 适配finsh_port.c中的char rt_hw_console_getchar(void)
char rt_hw_console_getchar(void)
{
    /* Note: the initial value of ch must < 0 */
    int ch = -1;

    /*等待串口1输入数据*/
    if (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) != RESET)
    {
        ch = (int)USART_ReceiveData(DEBUG_USARTx);
        USART_ClearFlag(DEBUG_USARTx, USART_FLAG_RXNE);
    }
    else
    {
        if (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_ORE) != RESET)
        {
            USART_ClearFlag(DEBUG_USARTx, USART_FLAG_ORE);
        }
        rt_thread_mdelay( 10 );
    }

    return ch;
}

  1. rtconfig.h中加入#include "finsh_config.h"

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 17:13:27  更:2021-07-31 17:13:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:55:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码