【开放原子训练营(第二季)RT-Thread Nano学习营 北京站】RTT入门实操
RTT与RT-Thread Studio 的初识。
目录
线下集结
本人有幸参与了本次训练营的线下学习,线下学习的氛围让我充分感受到了学习的乐趣。和其他同学一起学习交流,大家之前的项目经验和遇到的问题都能够现场解答和讨论,这种现场的氛围不存在线上学习。特别是项目实操环节,能够现场观摩学习其他人的开发环境和编程习惯,这一点对我来说收获很大。

线下的学习过程过于,以下是针对这次的线下复习
新建RTT项目
因手里没有现场的STM32F411的开发板,手里有套野火霸道STM32F103ZE的开发板,后续内容基于此开发板完成。
如何搭建环境,参考本次培训的官方文档:
https://atomgit.com/joyce/train-note
我这里多安装了STM32F1的包:

基于芯片新建工程
因没有相应的开发板支持包,新建项目基于芯片:

注意这里新建之后,芯片时钟都是以内部晶振为基准,如果要修改也比较简单,找到drivers下的board.h修改即可,如我板载是8MHz晶振,F103最大支持72Mhz内核频率,配置如下:
#define BSP_CLOCK_SOURCE ("HSE")
#define BSP_CLOCK_SOURCE_FREQ_MHZ ((int32_t)8)
#define BSP_CLOCK_SYSTEM_FREQ_MHZ ((int32_t)72)
运行RTT程序
配置完后点击下载,链接串口,可打开终端:


在线仿真问题
如果需要在线用ST-LINK仿真,遇到不能进入仿真的报错,则可以用以下程序将ST-LINK固件进行升级:


几个基于芯片生产程序实例
LED灯闪烁
LED硬件原理图如下:

修改main.c内程序如下:
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include <rtdevice.h>
#include <drivers\pin.h>
#include <drivers\include\drv_common.h>
#define LED_PIN GET_PIN(F,7)
int main(void)
{
int count = 1;
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
while (count++)
{
LOG_D("Hello RT-Thread!");
rt_pin_write(LED_PIN, 0);
rt_thread_mdelay(1000);
rt_pin_write(LED_PIN, 1);
rt_thread_mdelay(1000);
}
return RT_EOK;
}
按键
按键原理图如下:

在applition里新建key.c
#include <rtthread.h>
#include <rtdevice.h>
#include <drivers\pin.h>
#include <drivers\include\drv_common.h>
#define KEY_PIN GET_PIN(A,0)
#define LED2_PIN GET_PIN(F,8)
int key_irq_count = 0;
void key_irq()
{
//按下触发,控制LED2亮灭
key_irq_count++;
rt_pin_write(LED2_PIN, key_irq_count&0x01);
}
int key()
{
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(KEY_PIN, PIN_MODE_INPUT_PULLDOWN);
rt_pin_write(LED2_PIN, PIN_LOW);
//注册中断
rt_pin_attach_irq(KEY_PIN, PIN_IRQ_MODE_RISING, key_irq, RT_NULL);
//使能中断
rt_pin_irq_enable(KEY_PIN, PIN_IRQ_ENABLE);
return 1;
}
/*注册自动初始化key*/
INIT_BOARD_EXPORT(key);
注意最后的初始化,不像以前的裸板驱动,这里更加模块化,自动初始化机制的几个API介绍:
| 初始化顺序 | 宏接口 | 描述 |
| 1 | INIT_BOARD_EXPORT(fn) | 非常早期的初始化,此时调度器还未启动 |
| 2 | INIT_PREV_EXPORT(fn) | 主要是用于纯软件的初始化、没有太多依赖的函数 |
| 3 | INIT_DEVICE_EXPORT(fn) | 外设驱动初始化相关,比如网卡设备 |
| 4 | INIT_COMPONENT_EXPORT(fn) | 组件初始化,比如文件系统或者 LWIP |
| 5 | INIT_ENV_EXPORT(fn) | 系统环境初始化,比如挂载文件系统 |
| 6 | INIT_APP_EXPORT(fn) | 应用初始化,比如 GUI 应用 |
想要更详细了解机制,可以戳链接,跳转官方文档。
morse(摩斯密码)
使用rtt较为方便的一点是可以方便的添加其他人写好的模块:
1、添加软件包


2、配置


3、保存并进行适配性的修改


//修改按键IO口
#define USER_KEY GET_PIN(C, 13) // GET_PIN(H,4)
void irq_callback()
{
morse_input(!rt_pin_read(USER_KEY));
// rt_kprintf("key_irq\r\n");
}
int morse_key_example(void)
{
rt_pin_mode(USER_KEY, PIN_MODE_INPUT_PULLDOWN);
rt_pin_attach_irq(USER_KEY, PIN_IRQ_MODE_RISING_FALLING, irq_callback, RT_NULL);
rt_pin_irq_enable(USER_KEY, PIN_IRQ_ENABLE);
//增加输出,查看示例是否已调用
rt_kprintf("key_example\r\n");
return 0;
}
4、编译下载运行

5、结果
初始化运行结果:

按照相应的摩斯密码来点击按键输出字符到终端(morse相关说明GitHub - zhkag/morse: morse):

总结和感受
RTT的RT-Thread Studio 一战式的IDE给我极大的震撼,与我之前长期使用Free-RTos对比起来看,RTT的生态真的是太强大了,以本次为契机,后续项目上会优先考虑RTT,真的能节省时间和精力。真诚感谢主办方!下次有机会再相聚!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)