本帖最后由 北方西门吹雪 于 2024-5-20 09:37 编辑
#申请原创# 1. APM32F411V 内存足够大,可以容纳核心很多中间件的使用,其中最常用的就是RTOS实时操作系统,这里选择rt-thread进行开发。
这个是rt-thread nano的内核逻辑图,包括了完整的事件处理功能。完整版的rtthread也可以支持,这里就是更多的外设和配置方法,需要用scons进行编译和配置。
使用nano版本的可以更好的使用广泛的IDE,更紧凑的内存使用。
2. 加载范例代码,这里需要下载rtthread nano并解压在指定的文件夹。然后编译下载,就可以完整的驱动led的实时变换了
3 代码分析
static void led1_thread_entry(void* parameter)
{
while (1)
{
APM_LEDToggle(LED3);
rt_thread_delay(1000);
APM_LEDToggle(LED2);
}
}
int main(void)
{
APM_LEDInit(LED2);
APM_LEDInit(LED3);
led1_thread = rt_thread_create("led1",
led1_thread_entry,
RT_NULL,
512,
3,
20);
rt_thread_startup(led1_thread);
}
这里可以看到是,和GPIO的直接调用不同,这里是创建了一个线程,导入led变换功能,在同一个线程内完成,这样LED2和LED3都可以不断按时变换
4 更改为双线程
根据上述逻辑,可以创建两个线程,分别控制2个LED而且使用不同的变换频率,这样先创建两个线程
static void led1_thread_entry(void* parameter)
{
while (1)
{
APM_LEDToggle(LED3);
rt_thread_delay(1000);
//APM_LEDToggle(LED2);
}
}
static void led2_thread_entry(void* parameter)
{
while (1)
{
//APM_LEDToggle(LED3);
rt_thread_delay(500);
APM_LEDToggle(LED2);
}
}
然后分别启动两个线程,首先定义入口,然后分别启动,就可以实现这样的功能。
int main(void)
{
APM_LEDInit(LED2);
APM_LEDInit(LED3);
led1_thread = rt_thread_create("led1",
led1_thread_entry,
RT_NULL,
512,
3,
20);
rt_thread_startup(led1_thread);
led2_thread = rt_thread_create("led2",
led2_thread_entry,
RT_NULL,
512,
3,
20);
rt_thread_startup(led2_thread);
}
5 增加FInSH控制台使用FinSH是使MCU具有会话能力,启动MSH界面。这里在其中一个线程加上一句输出的语句就可以了
static void led1_thread_entry(void* parameter)
{
while (1)
{
APM_LEDToggle(LED3);
rt_thread_delay(1000);
//APM_LEDToggle(LED2);
rt_kprintf("hello RT-Thread!\n");
}
}
启动串口通讯,输入如下
显示成功。
|