本帖最后由 袁胜富 于 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)
|