目录

线下集结

新建RTT项目

基于芯片新建工程

运行RTT程序

在线仿真问题

几个基于芯片生产程序实例

LED灯闪烁

 按键

morse(摩斯密码)

总结和感受


线下集结

  本人有幸参与了本次训练营的线下学习,线下学习的氛围让我充分感受到了学习的乐趣。和其他同学一起学习交流,大家之前的项目经验和遇到的问题都能够现场解答和讨论,这种现场的氛围不存在线上学习。特别是项目实操环节,能够现场观摩学习其他人的开发环境和编程习惯,这一点对我来说收获很大。

线下的学习过程过于,以下是针对这次的线下复习

新建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,真的能节省时间和精力。真诚感谢主办方!下次有机会再相聚!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐