袁胜富 发表于 2023-1-2 16:40

【AT-START-AT32F437测评】+ TencentOS-tiny移植

本帖最后由 袁胜富 于 2023-1-2 17:41 编辑

一、前言
static/image/hrline/1.gif
         首先非常感谢雅特力提供的开发板,基于此我本人发表此篇文章。
二、项目介绍
static/image/hrline/1.gif
         AT32F437主频高达288MHZ和大容量的Flash和SRAM,非常适合跑操作系统,在操作系统上我们可以做很多复杂的应用逻辑,其优势远远超过了裸机的轮询方法。因此我特别在AT32F437上跑TencentOS-tiny这个开源操作系统。在此篇文章中我只在系统上跑两个任务,一个是串口每隔2秒打印一次,另外一个是分别一次点亮板载三颗LED灯。
三、实践操作
static/image/hrline/1.gif
1.首先建立不带操作系统的模板工程,结构如下图所示

2.利用AT32_New_Clock_Configuration_V3.0.04时钟配置助手配置系统运行时钟,这里使用内部48MHZ时钟6分频后送至PLL倍频至系统时钟,配置如下图所示。
3.配置操作系统文件,文件目录结构如下

其实我早在去年做过移植教程,同为M4内核的,可以移步【N32G430开发板试用】TencentOStinyModbus_Master在测试设备中使用 - - 21ic电子技术开**坛这个帖子参考移植。
四、任务代码展示
#include "at32f435_437_board.h"
#include "at32f435_437_clock.h"
#include "tos_k.h"
#define DELAY                            100
#define FAST                           1
#define SLOW                           4
uint8_t g_speed = FAST;

#define APPLICATION_TASK_STK_SIZE       1024
k_task_t application_task;
uint8_t application_task_stk;

#define UARTLICATION_TASK_STK_SIZE       1024
k_task_t UARTlication_task;
uint8_t UARTlication_task_stk;
extern void application_entry(void *arg);

__weak void application_entry(void *arg)
{
    while (1)
                {
                        at32_led_toggle(LED2);
                        tos_task_delay(g_speed * DELAY);
                        at32_led_toggle(LED3);
                        tos_task_delay(g_speed * DELAY);
                        at32_led_toggle(LED4);
                        tos_task_delay(g_speed * DELAY);
                        printf("LED_Toggle DEMO!!!\r\n");
    }
}

__weak void uartlication_entry(void *arg)
{
    while (1)
                {
                        tos_task_delay(2000);
                        printf("UART_task running!!!\r\n");
    }
}


void button_exint_init(void);
void button_isr(void);

/**
* @briefconfigure button exint
* @paramnone
* @retval none
*/
void button_exint_init(void)
{
exint_init_type exint_init_struct;

crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);
scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOA, SCFG_PINS_SOURCE0);

exint_default_para_init(&exint_init_struct);
exint_init_struct.line_enable = TRUE;
exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
exint_init_struct.line_select = EXINT_LINE_0;
exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
exint_init(&exint_init_struct);

nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(EXINT0_IRQn, 0, 0);
}

/**
* @briefbutton handler function
* @paramnone
* @retval none
*/
void button_isr(void)
{
/* delay 5ms */
tos_task_delay(5);

/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_0);

/* check input pin state */
if(SET == gpio_input_data_bit_read(USER_BUTTON_PORT, USER_BUTTON_PIN))
{
    if(g_speed == SLOW)
      g_speed = FAST;
    else
      g_speed = SLOW;
}
}

/**
* @briefexint0 interrupt handler
* @paramnone
* @retval none
*/
void EXINT0_IRQHandler(void)
{
      if (tos_knl_is_running())
{
    tos_knl_irq_enter();
    button_isr();
    tos_knl_irq_leave();
}

}

/**
* @briefmain function.
* @paramnone
* @retval none
*/
int main(void)
{
system_clock_config();
at32_board_init();
button_exint_init();
printf("Welcome to TencentOS tiny(%s)\r\n", TOS_VERSION);
   tos_knl_init(); // TencentOS Tiny kernel initialize
   tos_task_create(&application_task, "application_task", application_entry, NULL, 0, application_task_stk, APPLICATION_TASK_STK_SIZE, 0);
   tos_task_create(&UARTlication_task, "uartlication_task", uartlication_entry, NULL, 0, UARTlication_task_stk, UARTLICATION_TASK_STK_SIZE, 0);
   tos_knl_start();
while(1)
{
    __NOP();
}
} 五、效果展示
static/image/hrline/1.gif
       1.流水灯任务展示

      2.串口打印任务展示

   如果有感兴趣的朋友,可以下载工程源码跑一跑,源码已经放在了附件里
页: [1]
查看完整版本: 【AT-START-AT32F437测评】+ TencentOS-tiny移植