当前位置:   article > 正文

stm32移植RT-Thread Nano实现finsh全步骤_stm32 rtthread移植

stm32 rtthread移植

stm32移植RT-Thread Nano实现Finsh全步骤


参考资料 RT-Thread 文档中心 RT-Thread 文档中心
  • 准备工作
    1. stm32f103裸机点灯源码
    2. keil安装RT-Thread Nano Pack。(RT-Thread 文档中心有下载连接,下载完毕直接点击安装)
步骤详解
  1. 添加RT-Thread Nano到工程 (这里的步骤见RT-Thread 文档中心,链接在文章头部)

  2. 删除 stm32f10x_it.c中的 HardFault_Handler以及PendSV_Handler函数,这两个函数已经由RT-Thread实现

  3. 此时会出现 #error "TODO 1: OS Tick Configuration.错误,提醒你配置时钟

  4. board.c中实现时钟的配置操作 rt_hw_board_init函数
    - a:注释掉提示代码#error "TODO 1: OS Tick Configuration."
    - b:添加系统时钟配置 SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
    - 在这里插入图片描述

      - c:在`board.c`中添加下列函数,添加完毕之后删除` stm32f10x_it.c中的SysTick_Handler`函数。此时还需要在`board.c`文件顶部添加`#include "stm32f10x.h"`,要不然会报错。
    
    • 1
void SysTick_Handler()
{
	 rt_interrupt_enter();
	  rt_tick_increase();
	  rt_interrupt_leave();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5.此时RT-Thread内核已经移植完毕,在main函数中添加相关代码测试,记得添加RT-Thread头文件#include <rtthread.h>

  • 内核功能测试代码,跑一个点灯线程,这里没有写初始化,初始化需要放在系统的硬件初始化里面:components.c文件夹,找到rtthread_startup->rt_hw_board_init;将所有的硬件初始化都写在rt_hw_board_init函数顶部。
#include "stm32f10x.h"
#include "bsp_led.h"
#include "delay.h" 
#include <rtthread.h>
void thread01_entry( void *parameter);
static rt_thread_t thread01 = RT_NULL;
//这里没有写LED初始化,LED初始化需要放在系统的硬件初始化里面:components.c文件夹,找到rtthread_startup->rt_hw_board_init;将所有的硬件初始化都写在rt_hw_board_init函数顶部。
int main(void)
{	
	 thread01 = rt_thread_create( "thread01",thread01_entry,RT_NULL,512,3,20);  
	 rt_thread_startup(thread01);

}
void thread01_entry( void *parameter)
{
	while(1)
	{
		LED1_ON;
	    rt_thread_delay(500);
		LED1_OFF;
		rt_thread_delay(500);
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

现象就是LED灯不断闪烁,这里已经完成内核移植测试,接下来移植finsh组件。

finsh移植,finsh一般通过串口和用户交互
  • 首先实现rt_kprintf函数,
  1. 新建文件夹,串口实现初始化,并且添加头文件路径

(bsp_usart.c)

#include "bsp_usart.h"
#include <rtthread.h>
 /**
  * @brief  USART GPIO 配置,工作参数配置
  * @param  无
  * @retval 无
  */

void USART_Config( void )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
 
    // 打开串口GPIO的时钟
    DEBUG_USART_GPIO_APBxClkCmd( DEBUG_USART_GPIO_CLK, ENABLE );
 
    // 打开串口外设的时钟
    DEBUG_USART_APBxClkCmd( DEBUG_USART_CLK, ENABLE );
 
    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure );
 
    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init( DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure );
 
    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
    // 配置 针数据字长
    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( DEBUG_USARTx, &USART_InitStructure );
 
    // 使能串口
    USART_Cmd( DEBUG_USARTx, ENABLE );
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

bsp_usart.h

#ifndef __USART_H
#define	__USART_H


#include "stm32f10x.h"
#include <stdio.h>

/** 
  * 串口宏定义,不同的串口挂载的总线和IO不一样,移植时需要修改这几个宏
	* 1-修改总线时钟的宏,uart1挂载到apb2总线,其他uart挂载到apb1总线
	* 2-修改GPIO的宏
  */
	
// 串口1-USART1
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10

#define  DEBUG_USART_IRQ                USART1_IRQn
#define  DEBUG_USART_IRQHandler         USART1_IRQHandler

void USART_Config(void);
#endif /* __USART_H */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  1. rtconfig.h中定义RT_USING_CONSOLE,打开下面代码,并且编译之后出现的两个error提示代码注释掉
  2. 在这里插入图片描述
    (board.c),将下列代码注释掉
static int uart_init(void)
{
#error "TODO 2: Enable the hardware uart and config baudrate."
    return 0;
}
INIT_BOARD_EXPORT(uart_init);
void rt_hw_console_output(const char *str)
{
#error "TODO 3: Output the string 'str' through the uart."
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 修改为以下代码,注意包含串口的头文件,以及头文件"stm32f10x.h"
    (board.c)
static int uart_init(void)
{
//#error "TODO 2: Enable the hardware uart and config baudrate."
	USART_Config();
    return 0;
}
INIT_BOARD_EXPORT(uart_init);

void rt_hw_console_output(const char *str)
{
//#error "TODO 3: Output the string 'str' through the uart."
	    rt_enter_critical();
 
    /* 直到字符串结束 */
    while ( *str != '\0' )
    {
        /* 换行 */
        //RT-Thread 系统中已有的打印均以 \n 结尾,而并非 \r\n,所以在字符输出时,需要在输出 \n 之前输出 \r,完成回车与换行,否则系统打印出来的信息将只有换行
        if ( *str == '\n' )
        {
            USART_SendData( DEBUG_USARTx, '\r' );
            while ( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_TXE ) == RESET );
        }
 
        USART_SendData( DEBUG_USARTx, *str++ );
        while ( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_TXE ) == RESET );
    }
 
    /* 退出临界段 */
    rt_exit_critical();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 编译不报错代表rt_kprintf函数以及可以正常使用,在点灯线程里该代码测试。可以正常打印。

在这里插入图片描述
在这里插入图片描述

在nano上添加finsh组件

  • 当实现上述全部步骤时,可以开始添加组件。
  1. 添加finsh源码到工程,然后在 rtconfig.h 中打开 finsh 相关选项,(这一步图解见RT-Thread 文档中心,链接在文章头部)
    在这里插入图片描述
    在这里插入图片描述

  2. 这里有报错,提示我们要实现rt_hw_console_getchar,双击报错进入相关文档

  • 替换finsh_port.c相关代码

(finsh_port.c)

#include <rthw.h>
#include <rtconfig.h>
#include "stm32f10x.h"
#include "bsp_usart.h"

#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 
#endif


#ifdef RT_USING_FINSH

RT_WEAK char rt_hw_console_getchar(void)
{
    /* Note: the initial value of ch must < 0 */
    int ch = -1;

	  //查询方式实现,记得将Usart1初始化中的中断接收配置相关代码注释掉
    /*等待串口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;
	 
//#error "TODO 4: Read a char from the uart and assign it to 'ch'."

    return ch;
}

#endif /* RT_USING_FINSH */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

到此finsh组件移植完毕

测试:使用软件 SecureCRT 7.3,一般的串口调试助手有时候可以,有时候不行,不清楚原因,在使用SecureCRT 7.3的时候要先让开发板工作,再打开串口。
在这里插入图片描述
一般的串口调试助手有时候只能读取一个字节,当然如果你不怕麻烦,一个字母一个字母输入也可以。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/67466
推荐阅读
相关标签
  

闽ICP备14008679号