【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> 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> 2)解压压缩文件,双击AT32F425_DFP.20.0.1.pack,按默认的路径安装就行。</p>
<p> </p>
<p> 这样就完成了MDK对AT32F425的芯片支持。</p>
<p> 3)解压固件AT32F425_Firmware_Library_V2.0.1.zip到文件夹下。AT32F425_Firmware_Library_V2.0.1文件夹有示例,固件库等等大家可以一一看看。</p>
<p> 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> 5)文件夹下新建bsp、inc、libraries、src四个空白文件夹:</p>
<p> 6)拷贝固库H:\RT_AT32F425\AT32F425_Firmware_Library_V2.0.1\libraries下的文件到libraries下:</p>
<p> 7)拷贝H:\RT_AT32F425\AT32F425_Firmware_Library_V2.0.1\project\at32f425_board下的at32f425_board.c、at32f425_board.h到bsp文件夹下</p>
<p> </p>
<p> 8) 拷贝H:\AT32F425\AT32F425_Firmware_Library_V2.0.1\project\at_start_f425\templates 下的inc src文件拷到user文件夹下:</p>
<p></p>
<p> 9)打开MDK5在AT32F425DEMO下新建工程项目</p>
<p>10)芯片选择AT32F425R8T7,</p>
<p> 11)打开RTOS选荐,钩选kernel、shell。点击OK生成项目。</p>
<p></p>
<p>12)配置工程: 准备创建工程文件夹,包装文件。</p>
<p> </p>
<p> 文件添加我不一平细说,我会把工程模块上传,大家只管用就好了。最后生成如下工程:</p>
<p> </p>
<p>添加头文件:点击魔术棒:</p>
<p> </p>
<p> </p>
<p>Debug选项选择CMSIS-DAP Debugger</p>
<p>添加:AT32F425R8T7,USE_STDPERIPH_DRIVER,AT_START_F425_V1</p>
<p>ARM Compiler 选择version 5.(要不警告满天飞!)</p>
<p> </p>
<p> 13)保存后编译:有4项报错,下面一一去除:</p>
<p> </p>
<p>14)报错: RTE\RTOS\board.c(47): error: #35: #error directive: "TODO 1: OS Tick Configuration."<br />
#error "TODO 1: OS Tick Configuration."<br />
RTE\RTOS\board.c: 0 warnings, 1 error</p>
<p>双击打开报错位置:注释掉#error "TODO 1: OS Tick Configuration."。添加如下代码:</p>
<p>#include "at32f425_board.h"<br />
#include "at32f425_clock.h"</p>
<p> </p>
<p> system_clock_config();<br />
at32_board_init();<br />
SysTick_Config(96000000 / RT_TICK_PER_SECOND);</p>
<p> 15) 报错RTE\RTOS\finsh_port.c(14): error: #35: #error directive: Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h <br />
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h </p>
<p> 双击打开报错位置:finsh_port.c14行,提示没有包含finsh_config.h文件,在rtconfig.h中添加引用:</p>
<p>打开rtconfig.h,添加#include "finsh_config.h"</p>
<p> 16)报错:RTE\RTOS\finsh_port.c(24): error: #35: #error directive: "TODO 4: Read a char from the uart and assign it to 'ch'."<br />
#error "TODO 4: Read a char from the uart and assign it to 'ch'."</p>
<p>双击打开错误地方:提示是终端的接收函数缺失:</p>
<p> 添加如下代码到函数中:</p>
<pre>
<code>if((USART1->sts_bit.rdbf) == 1)
{
ch = USART1->dt & 0xff;
}
else
{
rt_thread_mdelay(10);
}
return ch;</code></pre>
<p>同时添加 #include "at32f425_conf.h" 头文件的引用。要不提示USART1未找到的错误 :</p>
<p></p>
<p>17)报错PendSV_Handler、SysTick_Handler、HardFault_Handler 重复定义,找到at32f425_int.c注释掉这三个函数</p>
<p>18)报错 .\Objects\rtthread.axf: Error: L6200E: Symbol rt_hw_board_init multiply defined (by board_1.o and board.o). 在rtconfig.h 的115行去掉前的注释 #define RT_USING_CONSOLE</p>
<p>经过上述处理后MDK的工程就建好了。编译后如下:</p>
<p> 最后修改main的主函数如下(这个是抄网上的代码):</p>
<pre>
<code>/**
**************************************************************************
* @file main.c
* @versionv2.0.1
* @date 2022-02-11
* @brief main program
**************************************************************************
* Copyright notice & 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(&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(&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 < 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> 按Tab键:</p>
<p> </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、菜单【文件】-【导入】->MDK项目到工作空间,选择刚才新建的目录:</p>
<p> </p>
<p>工程名称选自己定义的,最好用英文RT_AT32F425,点击完成。</p>
<p> </p>
<p> 然后编译下载:</p>
<p> </p>
<p>2、打开终端:</p>
<p> 致此RT_Thread Studio环境搭建成功。可以用RT—Thread Studio进行项目开发了。</p>
<p>【讨论】由于雅特力与RT还没有出对AT32F425这款芯片的支持库,所以新建环境有点麻烦,后面的硬件驱动也得用库来书写。所以还期待有早点的支持库。本来可以直接用官方的templet进行rt-thread搭建的,差不多几分钟就可以,但是我从新建项目开始来搭建,并记录下,差不多用了一天。后期如果有时间,尝试参照AT32F407的项目来移植425的项目,那样可以直接使用驱动库来开发,就简单一点。</p>
<p>最后来几张板子的美照:</p>
<p>可以说这块板子的做功用料很好,接口也是很丰富。</p>
<p>再次感谢EEWORLD、雅特力公司对我的信任。</p>
<p>感谢您的阅读,祝大家开开心心、工作顺利。<br />
<br />
<br />
</p>
<p>这里有一篇AT32移植RT—Thread 的文档,希望以后官方更新AT32F425的移植方法。</p>
<p>楼主写的很好,深受启发</p>
yang8555u 发表于 2022-4-20 10:25
楼主写的很好,深受启发
<p>多谢夸奖,其实用心去做,大家都可以做得非常好的。我是业余时间来写的东西。EEWORLD提供了很好的平台。欢迎经常来这里学习、讨论!</p>
<p>顺便批评一下,怎么能在第一句话,就把人家公司的名字写错了呢。</p>
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>
<p>用F423,没成功</p>
页:
[1]