【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程

5.移植 RTT NANO工程

移植步骤:
1. mdk添加rtt nano 包文件
2. 添加源码
3. 屏蔽2个中断处理函数
4. 修改board.c文件
5. 添加控制台
6. 添加finsh组件
7. 编写测试工程

1. mdk添加rtt nano 包文件

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第1张图片

也可以下载后手动安装
下载链接https://www.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.5.pack

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第2张图片

rtt nano 安装位置
【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第3张图片

2. 添加源码到工程

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第4张图片

添加后如下

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第5张图片

3. 屏蔽2个中断处理函数

void HardFault_Handler(void)

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第6张图片

void PendSV_Handler(void)

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第7张图片

修改 systick

 #include 
void SysTick_Handler(void)
{
	void rt_os_tick_callback(void);
	rt_os_tick_callback();
}

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第8张图片

3.修改board.c文件

合计修改3个地方

3.1 添加头文件

//添加头文件
#include "apm32f4xx.h"
#include "bsp_usart.h"

3.2 修改rt_hw_board_init 函数

SystemInit();// (1)系统初始化
SystemCoreClockUpdate();// (2)初始化系统时钟
SysTick_Config(SystemCoreClock/RT_TICK_PER_SECOND); //(3) 滴答定时器初始化

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第9张图片

3.4 rttconfig.h 文件说明

/* RT-Thread config file */

#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__

// <<< Use Configuration Wizard in Context Menu >>>

// RT_THREAD_PRIORITY_MAX 这个宏表示 RT-Thread 支持多少个优先级,取值范围为 8~256,默认为 32。
#define RT_THREAD_PRIORITY_MAX  32

//RT_TICK_PER_SECOND 表示操作系统每秒钟有多少个 tick,tick 即是操作系统的时钟周期,默认为 1000
#define RT_TICK_PER_SECOND  1000

// 表示 CPU 处理的数据需要多少个字节对齐,默认为 4 个字节
#define RT_ALIGN_SIZE   4

// 内核对象名字的最大长度,取值范围为 2~16,默认为 8。
#define RT_NAME_MAX    8

// 使用 RT-Thread 组件初始化,默认使能
#define RT_USING_COMPONENTS_INIT

// 使用用户 main 函数,默认打开
#define RT_USING_USER_MAIN

// main 线程栈大小,取值范围为 1~4086,单位为字节,默认为512。
#define RT_MAIN_THREAD_STACK_SIZE     256

// 

// 调试配置
// enable kernel debug configuration
//  Default: enable kernel debug configuration
//#define RT_DEBUG
// 
// enable components initialization debug configuration<0-1>
//  Default: 0
#define RT_DEBUG_INIT 0
// thread stack over flow detect
//   Diable Thread stack over flow detect
//#define RT_USING_OVERFLOW_CHECK
// 
// 

// 钩子函数配置,目前全部关闭。
// using hook
//  using hook
//#define RT_USING_HOOK
// 
// using idle hook
//  using idle hook
//#define RT_USING_IDLE_HOOK
// 
// 

// 软件定时器配置,目前关闭,不使用软件定时器。
#define RT_USING_TIMER_SOFT         0
#if RT_USING_TIMER_SOFT == 0
    #undef RT_USING_TIMER_SOFT
#endif
// The priority level of timer thread <0-31>
//  Default: 4
#define RT_TIMER_THREAD_PRIO        4
// The stack size of timer thread <0-8192>
//  Default: 512
#define RT_TIMER_THREAD_STACK_SIZE  512
// 


// 内部通信配置,包括信号量、互斥量、事件、邮箱和消息队列,根据需要配置
#define RT_USING_SEMAPHORE
// 互斥量
//#define RT_USING_MUTEX
// 事件
//#define RT_USING_EVENT
// 邮箱
#define RT_USING_MAILBOX
// 消息队列
//#define RT_USING_MESSAGEQUEUE
// 
// 

//内存管理配置。
// 这个宏用于表示是否使用内存池,目前关闭,不使用内存池。
//#define RT_USING_MEMPOOL

// 于表示是否堆,目前关闭,不使用堆
/*
	通过使能或者失能 RT_USING_HEAP 这个宏来选择
	使用静态或者动态内存。无论是使用静态还是动态内存方案,使用的都是内部的 SRAM,
	区别是使用的内存是在程序编译的时候分配还是在运行的时候分配。
*/
#define RT_USING_HEAP
#define RT_USING_SMALL_MEM
// 
// using tiny size of memory
//  using tiny size of memory
//#define RT_USING_TINY_SIZE
// 
// 

// 控制台配置。控制台即是 rt_kprintf()函数调试输出的设备,通常使用串口
#define RT_USING_CONSOLE
//控制台缓存大小
#define RT_CONSOLEBUF_SIZE          256
// 

//FINSH  shell 配置
#include "finsh_config.h"
// 
// 

// Device Configuration
// using device framework
//  using device framework
//#define RT_USING_DEVICE
// 
// 

// <<< end of configuration section >>>

#endif

4. 添加控制台

4.1在uart_init中添加串口初始化函数

static int uart_init(void)
{
		bsp_uart1_init(115200);
	
    return 0;
}

4.2.添加控制台输出函数

//(4)添加控制台输出函数
void rt_hw_console_output(const char *str)
{
	rt_size_t size =0;
	size = rt_strlen(str);
	for(int i=0;i<size;i++)
	{
		if(str[i]=='\n')
		{
						/* send a byte of data to the serial port */
			USART_TxData(DEBUG_USART, (uint8_t)'\r');
			/* wait for the data to be send */
			while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET);
		}
		  /* send a byte of data to the serial port */
    USART_TxData(DEBUG_USART, (uint8_t)str[i]);
    /* wait for the data to be send */
    while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET);
	}
}

5. 添加finsh组件

在finsh_port.h 中完善串口获取数据的功能

RT_WEAK char rt_hw_console_getchar(void)
{
    /* Note: the initial value of ch must < 0 */
    int ch = -1;
    if(USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_RXBNE) != RESET)
    {
        ch = USART_RxData(DEBUG_USART);
    }
    else {

        if(USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_OVRE) != RESET)
        {
            USART_ClearStatusFlag(DEBUG_USART,USART_FLAG_OVRE);
        }
        rt_thread_mdelay(10);
    }

    return ch;
}

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第10张图片

6.编写测试工程

static rt_thread_t tid1 = RT_NULL;

/* 线程 1 的入口函数 */
static void thread1_entry(void *parameter)
{
    rt_uint32_t count = 0;

    while (1)
    {
        /* 线程 1 采用低优先级运行,一直打印计数值 */
        //  rt_kprintf("thread1 count: %d\n", count ++);
        led_toggle(LED1);
        rt_thread_delay(1000);
        // led_toggle(LED0);
    }
}

#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5

int main(void)
{
    led_init(LED0);
    led_init(LED1);

    /* 创建线程 1,名称是 thread1,入口是 thread1_entry*/
    tid1 = rt_thread_create("thread1",
                            thread1_entry, RT_NULL,
                            THREAD_STACK_SIZE,
                            THREAD_PRIORITY, THREAD_TIMESLICE);

    /* 如果获得线程控制块,启动这个线程 */
    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);

    init_key_btn();
    while (1)
    {
        rt_thread_mdelay(500);
        led_toggle(LED0);
        //  rt_kprintf("hello\n") ;
        key_lib_buttons_process();

    }
}

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第11张图片

实例输出结果:

led0 500ms闪烁间隔 LED1 1000ms闪烁间隔

控制台输出RTT版本欢迎信息,可以shell交互
【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程_第12张图片

你可能感兴趣的:(APM32F4,apm32f4,rtt,nano,移植,mdk)