过去了这么久,现在才拿起些许灰尘的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内核了,接下来移植网络中间件。
|