打印
[活动专区]

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

[复制链接]
6146|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 袁胜富 于 2023-1-2 17:41 编辑

一、前言  

         首先非常感谢雅特力提供的开发板,基于此我本人发表此篇文章。
二、项目介绍

         AT32F437主频高达288MHZ和大容量的Flash和SRAM,非常适合跑操作系统,在操作系统上我们可以做很多复杂的应用逻辑,其优势远远超过了裸机的轮询方法。因此我特别在AT32F437上跑TencentOS-tiny这个开源操作系统。在此篇文章中我只在系统上跑两个任务,一个是串口每隔2秒打印一次,另外一个是分别一次点亮板载三颗LED灯。
三、实践操作

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[APPLICATION_TASK_STK_SIZE];

#define UARTLICATION_TASK_STK_SIZE       1024
k_task_t UARTlication_task;
uint8_t UARTlication_task_stk[APPLICATION_TASK_STK_SIZE];
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);

/**
  * @brief  configure button exint
  * @param  none
  * @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);
}

/**
  * @brief  button handler function
  * @param  none
  * @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;
  }
}

/**
  * @brief  exint0 interrupt handler
  * @param  none
  * @retval none
  */
void EXINT0_IRQHandler(void)
{
        if (tos_knl_is_running())
  {
    tos_knl_irq_enter();
    button_isr();
    tos_knl_irq_leave();
  }

}

/**
  * @brief  main function.
  * @param  none
  * @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();
  }
} 五、效果展示

       1.流水灯任务展示

      2.串口打印任务展示

     如果有感兴趣的朋友,可以下载工程源码跑一跑,源码已经放在了附件里 AT32F437-TencentOS-tiny.zip (3.7 MB)
  

使用特权

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

本版积分规则

29

主题

147

帖子

2

粉丝