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