本帖最后由 袁胜富 于 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, 下载次数: 3)
 
   |