lugl4313820 发表于 2022-3-27 00:15

【AT-START-F425测评】RT_Thread Studio 工程搭建、开箱图

本帖最后由 lugl4313820 于 2022-3-27 13:43 编辑

<p>【前言】 首先感EEWORLD再次对我的信任,感谢雅物力公司提供AT32F425开发板的支持。</p>

<p>【目的】我参评的项目主要是基于RT_Thread Studio的测评,所以最起先是建立空白的开发环境。</p>

<p>【思路】由于RT_Thread Studio还没有提供对AT32F425系统芯片的支持,所以,只能自己移植。</p>

<p>1、新建MDK空白文档。</p>

<p>2、拷贝必段的组件到文件夹。</p>

<p>3、用MDK生成RT_Thread 的必须文件。</p>

<p>4、用RT_Thread Studio导入MDK工程。</p>

<p>5、建立流水灯工程。</p>

<p>【具体步聚】我将从一个空白文件夹从头新建工程</p>

<p>1、新建一个空白文档:RT_AT32F425。</p>

<p>2、准备文件:</p>

<p>&nbsp; &nbsp; 1)从官网下载雅特力官网下载支持文件:<a href="https://www.arterytek.com/cn/product/AT32F425.jsp#Resource">雅特力科技 : 32位微控制器的创新领导者! (arterytek.com)</a></p>

<p>支持AT32F425底层驱动源代码,以标准库(std. lib)呈现、支持AT32 MCU型号于Keil MDK运行。(附件我将上传)。</p>

<p></p>

<p>&nbsp; &nbsp; 2)解压压缩文件,双击AT32F425_DFP.20.0.1.pack,按默认的路径安装就行。</p>

<p> &nbsp; &nbsp;</p>

<p>&nbsp;这样就完成了MDK对AT32F425的芯片支持。</p>

<p>&nbsp; &nbsp; &nbsp;3)解压固件AT32F425_Firmware_Library_V2.0.1.zip到文件夹下。AT32F425_Firmware_Library_V2.0.1文件夹有示例,固件库等等大家可以一一看看。</p>

<p>&nbsp; &nbsp; &nbsp;4)新建用于RT_Thread的模版文件夹(RT_425_DEMO)(当然大家也可以直接用里的H:\RT_AT32F425\AT32F425_Firmware_Library_V2.0.1\project\at_start_f425\templates\mdk_v5\template.uvprojx)这样就简单一些。因为这里好多库引用的路径复杂,所以自己新建一个模版。</p>

<p>&nbsp; &nbsp;5)文件夹下新建bsp、inc、libraries、src四个空白文件夹:</p>

<p>&nbsp; &nbsp; 6)拷贝固库H:\RT_AT32F425\AT32F425_Firmware_Library_V2.0.1\libraries下的文件到libraries下:</p>

<p>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 7)拷贝H:\RT_AT32F425\AT32F425_Firmware_Library_V2.0.1\project\at32f425_board下的at32f425_board.c、at32f425_board.h到bsp文件夹下</p>

<p> &nbsp;</p>

<p>&nbsp; 8) 拷贝H:\AT32F425\AT32F425_Firmware_Library_V2.0.1\project\at_start_f425\templates 下的inc src文件拷到user文件夹下:</p>

<p></p>

<p>&nbsp;9)打开MDK5在AT32F425DEMO下新建工程项目</p>

<p>10)芯片选择AT32F425R8T7,</p>

<p>&nbsp;&nbsp; 11)打开RTOS选荐,钩选kernel、shell。点击OK生成项目。</p>

<p></p>

<p>12)配置工程: 准备创建工程文件夹,包装文件。</p>

<p>&nbsp;</p>

<p>&nbsp;文件添加我不一平细说,我会把工程模块上传,大家只管用就好了。最后生成如下工程:</p>

<p> &nbsp;</p>

<p>添加头文件:点击魔术棒:</p>

<p>&nbsp; &nbsp;</p>

<p>&nbsp; &nbsp;</p>

<p>Debug选项选择CMSIS-DAP Debugger</p>

<p>添加:AT32F425R8T7,USE_STDPERIPH_DRIVER,AT_START_F425_V1</p>

<p>ARM Compiler 选择version 5.(要不警告满天飞!)</p>

<p> &nbsp; &nbsp;</p>

<p>&nbsp; 13)保存后编译:有4项报错,下面一一去除:</p>

<p>&nbsp;</p>

<p>14)报错: RTE\RTOS\board.c(47): error: &nbsp;#35: #error directive: &quot;TODO 1: OS Tick Configuration.&quot;<br />
&nbsp; #error &quot;TODO 1: OS Tick Configuration.&quot;<br />
RTE\RTOS\board.c: 0 warnings, 1 error</p>

<p>双击打开报错位置:注释掉#error &quot;TODO 1: OS Tick Configuration.&quot;。添加如下代码:</p>

<p>#include &quot;at32f425_board.h&quot;<br />
#include &quot;at32f425_clock.h&quot;</p>

<p>&nbsp;</p>

<p>&nbsp; system_clock_config();<br />
&nbsp; at32_board_init();<br />
&nbsp;&nbsp;SysTick_Config(96000000 / RT_TICK_PER_SECOND);</p>

<p>&nbsp;15) 报错RTE\RTOS\finsh_port.c(14): error: &nbsp;#35: #error directive: Please uncomment the line &lt;#include &quot;finsh_config.h&quot;&gt; in the rtconfig.h&nbsp;<br />
&nbsp; #error Please uncomment the line &lt;#include &quot;finsh_config.h&quot;&gt; in the rtconfig.h&nbsp;</p>

<p>&nbsp;双击打开报错位置:finsh_port.c14行,提示没有包含finsh_config.h文件,在rtconfig.h中添加引用:</p>

<p>打开rtconfig.h,添加#include &quot;finsh_config.h&quot;</p>

<p>&nbsp; 16)报错:RTE\RTOS\finsh_port.c(24): error: &nbsp;#35: #error directive: &quot;TODO 4: Read a char from the uart and assign it to &#39;ch&#39;.&quot;<br />
&nbsp; #error &quot;TODO 4: Read a char from the uart and assign it to &#39;ch&#39;.&quot;</p>

<p>双击打开错误地方:提示是终端的接收函数缺失:</p>

<p>&nbsp;添加如下代码到函数中:</p>

<pre>
<code>if((USART1-&gt;sts_bit.rdbf) == 1)
                {
                                ch = USART1-&gt;dt &amp; 0xff;
                }
    else
    {
                                rt_thread_mdelay(10);
    }
    return ch;</code></pre>

<p>同时添加 #include &quot;at32f425_conf.h&quot; 头文件的引用。要不提示USART1未找到的错误 :</p>

<p></p>

<p>17)报错PendSV_Handler、SysTick_Handler、HardFault_Handler 重复定义,找到at32f425_int.c注释掉这三个函数</p>

<p>18)报错&nbsp;.\Objects\rtthread.axf: Error: L6200E: Symbol rt_hw_board_init multiply defined (by board_1.o and board.o).&nbsp; 在rtconfig.h 的115行去掉前的注释 #define RT_USING_CONSOLE</p>

<p>经过上述处理后MDK的工程就建好了。编译后如下:</p>

<p>&nbsp;最后修改main的主函数如下(这个是抄网上的代码):</p>

<pre>
<code>/**
**************************************************************************
* @file   main.c
* @versionv2.0.1
* @date   2022-02-11
* @brief    main program
**************************************************************************
*                     Copyright notice &amp; Disclaimer
*
* The software Board Support Package (BSP) that is made available to
* download from Artery official website is the copyrighted work of Artery.
* Artery authorizes customers to use, copy, and distribute the BSP
* software and its related documentation for the purpose of design and
* development in conjunction with Artery microcontrollers. Use of the
* software is governed by this copyright notice and the following disclaimer.
*
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
*
**************************************************************************
*/

#include "at32f425_board.h"
#include "at32f425_clock.h"
#include "rtthread.h"

/** @addtogroup AT32F425_periph_template
* @{
*/

/** @addtogroup 425_LED_toggle LED_toggle
* @{
*/

#define DELAY                            100
#define FAST                           1
#define SLOW                           4

uint8_t g_speed = FAST;

void button_exint_init(void);
void button_isr(void);

/**
* @briefconfigure button exint
* @paramnone
* @retval none
*/
void button_exint_init(void)
{
exint_init_type exint_init_struct;

crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);

scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOA, SCFG_PINS_SOURCE0);

exint_default_para_init(&amp;exint_init_struct);
exint_init_struct.line_enable = TRUE;
exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
exint_init_struct.line_select = EXINT_LINE_0;
exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
exint_init(&amp;exint_init_struct);

nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(EXINT1_0_IRQn, 0, 0);
}

/**
* @briefbutton handler function
* @paramnone
* @retval none
*/
void button_isr(void)
{
/* delay 5ms */
delay_ms(5);

/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_0);

/* check input pin state */
if(SET == gpio_input_data_bit_read(USER_BUTTON_PORT, USER_BUTTON_PIN))
{
    if(g_speed == SLOW)
      g_speed = FAST;
    else
      g_speed = SLOW;
}
}

/**
* @briefexint0 interrupt handler
* @paramnone
* @retval none
*/
void EXINT1_0_IRQHandler(void)
{
button_isr();
}

/**
* @briefmain function.
* @paramnone
* @retval none
*/
int main(void)
{
//system_clock_config();

// at32_board_init();

// button_exint_init();

while(1)
{
    at32_led_toggle(LED2);
    rt_thread_mdelay(g_speed * DELAY);
    at32_led_toggle(LED3);
    rt_thread_mdelay(g_speed * DELAY);
    at32_led_toggle(LED4);
    rt_thread_mdelay(g_speed * DELAY);
}
}

#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       200
#define THREAD_TIMESLICE      5

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 ++);
      rt_thread_mdelay(3000);
    }
}

static volatile rt_uint32_t addcount=0;
static rt_thread_t tid2 = RT_NULL;
/* 线程 2 入口 */
static void thread2_entry(void *parameter)
{
    rt_uint32_t count = 0;

    /* 线程 2 拥有较高的优先级,以抢占线程 1 而获得执行 */
    for (count = 0; count &lt; 10 ; count++)
    {
      /* 线程 2 打印计数值 */
      rt_kprintf("thread2 count: %d\n", count);
                                rt_thread_mdelay(500);
    }
    rt_kprintf("thread2 switch after 10 seconds!\n");
                rt_thread_mdelay(10000); // 给线程1有10秒时间运行,之后一直不休眠一直抢占线程1
                rt_kprintf("thread2 add count start!\n");
    while (1)
    {
                        addcount++;
                }
    /* 线程 2 运行结束后也将自动被系统脱离 */
}

/* 定时器的控制块 */
static rt_timer_t timer1 = RT_NULL;
/* 定时器 1 超时函数 */
static void timeout1(void *parameter)
{
                addcount=addcount/10;
                rt_kprintf("thread2 every second addcount: %d\n", addcount);
                addcount = 0;
}

/* 线程示例 */
int thread_sample(void)
{
    /* 创建线程 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);

    /* 初始化线程 2,名称是 thread2,入口是 thread2_entry */
    tid2 = rt_thread_create("thread2",
                            thread2_entry, RT_NULL,
                            THREAD_STACK_SIZE+200,
                            THREAD_PRIORITY-1, THREAD_TIMESLICE);
    /* 如果获得线程控制块,启动这个线程 */
    if (tid2 != RT_NULL)
      rt_thread_startup(tid2);

    /* 创建定时器 1周期定时器 */
    timer1 = rt_timer_create("timer1",
                                                                                                               timeout1, RT_NULL,
                                                                                                               10000, // 10秒一个周期 1MS一次中断的情况下
                           RT_TIMER_FLAG_PERIODIC);

    /* 启动定时器 1 */
    if (timer1 != RT_NULL) {
                        rt_timer_start(timer1);
                }

    return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(thread_sample, thread sample);


/**
* @}
*/

/**
* @}
*/
</code></pre>

<p>19)下载到开发板后,三个LED灯轮流闪烁。找开终端:rt_thread成功启动</p>

<p>&nbsp;按Tab键:</p>

<p> &nbsp;</p>

<p>运行thread_sample:</p>

<p></p>

<p>说明rt_thread基本环间组建完成,示例也成功运行</p>

<p>3、这里说到用RT_Thread Studio来编写程序:</p>

<p>打开RT_Thread Studio (RT_Thread Studio安何安装请移到看我以前的作品:<a href="https://bbs.eeworld.com.cn/thread-1192869-1-1.html">【国民技术N32G457评测】安装RT-Thread Studio - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)</a></p>

<p>1、菜单【文件】-【导入】-&gt;MDK项目到工作空间,选择刚才新建的目录:</p>

<p> &nbsp;</p>

<p>工程名称选自己定义的,最好用英文RT_AT32F425,点击完成。</p>

<p>&nbsp;</p>

<p>&nbsp;然后编译下载:</p>

<p> &nbsp;</p>

<p>2、打开终端:</p>

<p> &nbsp;&nbsp;&nbsp;致此RT_Thread Studio环境搭建成功。可以用RT&mdash;Thread Studio进行项目开发了。</p>

<p>【讨论】由于雅特力与RT还没有出对AT32F425这款芯片的支持库,所以新建环境有点麻烦,后面的硬件驱动也得用库来书写。所以还期待有早点的支持库。本来可以直接用官方的templet进行rt-thread搭建的,差不多几分钟就可以,但是我从新建项目开始来搭建,并记录下,差不多用了一天。后期如果有时间,尝试参照AT32F407的项目来移植425的项目,那样可以直接使用驱动库来开发,就简单一点。</p>

<p>最后来几张板子的美照:</p>

<p>可以说这块板子的做功用料很好,接口也是很丰富。</p>

<p>再次感谢EEWORLD、雅特力公司对我的信任。</p>

<p>感谢您的阅读,祝大家开开心心、工作顺利。<br />
<br />
<br />
&nbsp;</p>

lugl4313820 发表于 2022-3-27 13:50

<p>这里有一篇AT32移植RT&mdash;Thread 的文档,希望以后官方更新AT32F425的移植方法。</p>

yang8555u 发表于 2022-4-20 10:25

<p>楼主写的很好,深受启发</p>

lugl4313820 发表于 2022-4-20 13:05

yang8555u 发表于 2022-4-20 10:25
楼主写的很好,深受启发

<p>多谢夸奖,其实用心去做,大家都可以做得非常好的。我是业余时间来写的东西。EEWORLD提供了很好的平台。欢迎经常来这里学习、讨论!</p>

yang8555u 发表于 2022-4-20 13:43

<p>顺便批评一下,怎么能在第一句话,就把人家公司的名字写错了呢。</p>

lugl4313820 发表于 2022-4-20 15:21

yang8555u 发表于 2022-4-20 13:43
顺便批评一下,怎么能在第一句话,就把人家公司的名字写错了呢。

<p>对不起,我错了!<img height="53" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/sad.gif" width="54" />以后要认真的审核一下,先读三篇再点确定。</p>

HeTui 发表于 2024-11-20 16:39

<p>用F423,没成功</p>
页: [1]
查看完整版本: 【AT-START-F425测评】RT_Thread Studio 工程搭建、开箱图