打印
[AT32F407]

【AT-START-F407测评】 移植 RTX5 点亮LED

[复制链接]
1046|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
BinWin|  楼主 | 2021-2-22 23:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
     过去了这么久,现在才拿起些许灰尘的AT32,白色的板子倒是几分熟悉感,整体看一下,USB, FLASH,ETH比较着重的几点,这款MCU作为数据通信来用应该比较合适。
     进入正题,首先准备一个基本工程。这里直接使用BSP文件中的Templates工程模板。在RTE环境中已源码形式添加RTX即可, 左下角的按钮可以方便的解决缺少组件的问题。如图,然后点击OK
     
     这时候选择编译一下,看看有哪些错误,比如
error:  #35: #error directive: "Unknown Arm Architecture!"
   这是由于使用了固件库文件中的cmsis_armcc.h,打开BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\CoreSupport文件夹,把同名文件改名字或删除   
    这时候再编译,上面说的错误已经消失了。然而还是有错误信息存在
   
   这个问题确实不好查,百度后竟有朋友遇到相同的问题,修改方式是这样的
   
   接下来不出意外依然是有问题的,这个比较常见了,重复的中断定义,注释固件库中的中断服务函数掉即可。
  
  到这里,系统已经没问题了,RTX成功的加入到了工程代码中,再做一些基本配置,整体是这样的
  
  剩下的事情就是编写应用代码了,点灯是必经之路,创建两个任务线程,一个LED闪烁,使用相对延时方式。一个串口打印任务,波特率9600。代码可以是这样的
/*----------------------------------------------------------------------------
* CMSIS-RTOS 'main' function template
*---------------------------------------------------------------------------*/

#include "RTE_Components.h"
#include  CMSIS_device_header
#include "cmsis_os2.h"

#include "at32_board.h"
#include <stdio.h>

const osThreadAttr_t ThreadLED_Attr =
{
        .name = "osRtxLEDThread",
        .attr_bits = osThreadDetached,
        .priority = osPriorityHigh2,
        .stack_size = 512,
};

const osThreadAttr_t ThreadMsg_Attr =
{
        .name = "osRtxMsgThread",
        .attr_bits = osThreadDetached,
        .priority = osPriorityHigh3,
        .stack_size = 1024,
};

const osThreadAttr_t ThreadStart_Attr =
{
        .name = "osRtxStartThread",
        .attr_bits = osThreadDetached,
        .priority = osPriorityHigh4,
        .stack_size = 2048,
};

osThreadId_t ThreadIdTaskMsg = NULL;
osThreadId_t ThreadIdTaskLED = NULL;
osThreadId_t ThreadIdStart = NULL;


void AppTaskLED(void *argument)
{
        const uint16_t usFrequency = 500; /* ÑÓ³ÙÖÜÆÚ */
        uint32_t tick;

        /* »ñÈ¡µ±Ç°Ê±¼ä */
        tick = osKernelGetTickCount();

       
    while(1)
    {
                AT32_LEDn_Toggle(LED2);
                /* Ïà¶ÔÑÓ³Ù */
                tick += usFrequency;                          
                osDelayUntil(tick);
    }

}

void AppTaskMsg(void *argument)
{
        while(1)
        {
                printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
                osDelay(1000);
        }       
}

static void AppTaskCreate (void)
{
        ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);
        ThreadIdTaskMsg = osThreadNew(AppTaskMsg, NULL, &ThreadMsg_Attr);         
}

void AppTaskStart(void *argument)
{
        const uint16_t usFrequency = 1; /* ÑÓ³ÙÖÜÆÚ */
        uint32_t tick;
       

        AT32_Board_Init();

        /* ´´½¨ÈÎÎñ */
        AppTaskCreate();

        /* »ñÈ¡µ±Ç°Ê±¼ä */
        tick = osKernelGetTickCount();
       
    while(1)
    {
               
                /* Ïà¶ÔÑÓ³Ù */
                tick += usFrequency;                          
                osDelayUntil(tick);
    }
}



int main (void) {

  // System Initialization
  SystemCoreClockUpdate();
  // ...
  
       
  osKernelInitialize();                 // Initialize CMSIS-RTOS
       
       
       
  ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);  
       
  osKernelStart();                      // Start thread execution
  for (;;) {}
}
    然后编译下载就可以看到串口助手愉快的输出信息了。
   
   为止,AT32F407可以正常运行RTX内核了,接下来移植网络中间件。


     

使用特权

评论回复
沙发
xrb3115| | 2021-2-24 01:12 | 只看该作者
  支持一下,这个网络协议栈应该还是挺好的  

使用特权

评论回复
板凳
caizhiwei| | 2021-2-24 08:39 | 只看该作者
xrb3115 发表于 2021-2-24 01:12
支持一下,这个网络协议栈应该还是挺好的

这个明明是RTOS,不是网络协议栈

使用特权

评论回复
地板
xrb3115| | 2021-2-24 11:30 | 只看该作者
caizhiwei 发表于 2021-2-24 08:39
这个明明是RTOS,不是网络协议栈

楼主不是准备继续移植网络中间件嘛,我是说这个协议栈挺好的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

58

帖子

0

粉丝