1513|9

6105

帖子

4

TA的资源

版主

楼主
 

【极海APM32F407 Tiny Board】玩转FreeRTOS [复制链接]

  本帖最后由 damiaa 于 2023-5-28 10:55 编辑

                              【极海APM32F407 Tiny Board】玩转FreeRTOS

极海APM32F407 Tiny Board的sdk里面是有一些应用的,只不过是用的MINI板。下面就Tiny板的使用做一些介绍和实验。

1,...\APM32F4xx_SDK_v1.3\Middlewares\FreeRTOS目录里面有个文件FreeRTOSv202012.00-LTS.exe运行一下,把freertos解压到一个目录。

     现在就把它解压到这个目录 ,原因就是例子的配置的目录就是这里。

2,打开例子...\APM32F4xx_SDK_v1.3\Examples\RTOS\FreeRTOS\Project\MDK\APM32F4xx_FreeRTOS项目

3,修改预处理符号APM32F407_MINI为APM32F407_TINY适用Tiny板子。

4,配置仿真器(前面的帖子说明过)。

5,修改代码如下:

#include "main.h"
#include "Board.h"
#include "stdio.h"
/** FreeRTOS */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "list.h"
#define DATA_BUF_SIZE       (32)
typedef enum {FALSE, TRUE} BOOL;
/** USART1 receive buffer*/
uint8_t rxDataBufUSART1[DATA_BUF_SIZE] = {0};
/** USART1 transmit buffer*/
uint8_t txDataBufUSART1[DATA_BUF_SIZE] = {0};
/** USART2 receive buffer*/
uint8_t rxDataBufUSART2[DATA_BUF_SIZE] = {0};
/** USART2 transmit buffer*/
uint8_t txDataBufUSART2[DATA_BUF_SIZE] = {0};
/** USART Write data */
void USART_Write(USART_T* usart,uint8_t *dat);
/** USART Init */
void USART_Init(void);
/** Delay */
void Delay(uint32_t count);
/** Buffer compare*/
BOOL BufferCompare(uint8_t *buf1, uint8_t *buf2, uint8_t size);
/** Task handle */
static TaskHandle_t xHandleTaskLedToggle = NULL;
static TaskHandle_t xHandleTaskUsartTest = NULL;
/** User create task */
static void UserTaskCreate(void);
/** Led toggle task */
void vTaskLedToggle(void *pvParameters);
/** Usart1 test task */
void vTaskUsartTest(void *pvParameters);
int main(void){
    APM_TINY_LEDInit(LED2);
    APM_TINY_LEDInit(LED3);
    /** USART Initialization */
    USART_Init();
    /** User create task */
    UserTaskCreate();
    /** Startup FreeRTOS */
    vTaskStartScheduler();
    while(1);
}
static void UserTaskCreate(void){
    xTaskCreate(vTaskLedToggle,
                "TaskLedToggle",
                 128,
                 NULL,
                 0,
                 &xHandleTaskLedToggle);

    xTaskCreate(vTaskUsartTest,
                "TaskUsartTest",
                128,
                NULL,
                2,
                &xHandleTaskUsartTest);
}
void vTaskLedToggle(void *pvParameters){
    while(1){
        APM_TINY_LEDToggle(LED2);
        vTaskDelay(500);
    }
}
void vTaskUsartTest(void *pvParameters){
    BOOL state = TRUE;
    int timeout = 0;
    for(int i = 0; i < DATA_BUF_SIZE; i++){
        txDataBufUSART1[i] = txDataBufUSART2[i] = i;
    }
    while(1)
    {
        /** Send Data from USART1 to USART2 */
        timeout = 0;
        for(int i = 0; i < DATA_BUF_SIZE; i++){
            /** Wait until end of transmission */
            while(USART_ReadStatusFlag(TINY_COM1, USART_FLAG_TXBE) == RESET){
                vTaskDelay(10);
                timeout++;
                if(timeout > 10)
                    break;
            }
            USART_TxData(TINY_COM1, txDataBufUSART1[i]);
            /** Wait until end of reception */
            while(USART_ReadStatusFlag(TINY_COM2, USART_FLAG_RXBNE) == RESET){
                vTaskDelay(10);
                timeout++;
                if(timeout > 10)
                    break;
            }
            rxDataBufUSART2[i] = USART_RxData(TINY_COM2);
        }
         /** Verify data */
        state = BufferCompare(rxDataBufUSART2, txDataBufUSART1, DATA_BUF_SIZE);
        /** Data is ok then turn off LED3 */
        if(state == TRUE)
            APM_TINY_LEDOn(LED3);
        else
            APM_TINY_LEDOff(LED3);
        /** Task blocking time Delay */
        vTaskDelay(1000);
        timeout = 0;
        /** Send Data from USART2 to USART1 */
        for(int i = 0; i < DATA_BUF_SIZE; i++){
            /** Wait until end of transmission */
            while(USART_ReadStatusFlag(TINY_COM2, USART_FLAG_TXBE) == RESET){
                vTaskDelay(10);
                timeout++;
                if(timeout > 10)
                    break;
            }
            USART_TxData(TINY_COM2, txDataBufUSART2[i]);
            /** Wait until end of reception */
            while(USART_ReadStatusFlag(TINY_COM1, USART_FLAG_RXBNE) == RESET){
                vTaskDelay(10);
                timeout++;
                if(timeout > 10)
                    break;
            }
            rxDataBufUSART1[i] = USART_RxData(TINY_COM1);
        }
         /** Verify data */
        state = BufferCompare(rxDataBufUSART1, txDataBufUSART2, DATA_BUF_SIZE);
        /** Data is ok then turn off LED3 */
        if(state == TRUE)
					APM_TINY_LEDOn(LED3);
        else
            APM_TINY_LEDOff(LED3);
        /** Task blocking time Delay */
        vTaskDelay(2000);
				APM_TINY_LEDOff(LED3);
				vTaskDelay(2000);
    }
}
BOOL BufferCompare(uint8_t *buf1, uint8_t *buf2, uint8_t size){
    uint8_t i;
    for(i = 0; i < size; i++){
        if(buf1[i] != buf2[i])
            return FALSE;
    }
    return TRUE;
}
void USART_Init(void){
    USART_Config_T usartConfigStruct;
    usartConfigStruct.baudRate = 115200;
    usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
    usartConfigStruct.mode = USART_MODE_TX_RX;
    usartConfigStruct.parity = USART_PARITY_NONE;
    usartConfigStruct.stopBits = USART_STOP_BIT_1;
    usartConfigStruct.wordLength = USART_WORD_LEN_8B;
    APM_TINY_COMInit(COM1, &usartConfigStruct);
    APM_TINY_COMInit(COM2, &usartConfigStruct);
    Delay(0x7FFF);
    /** Disable USART1 RXBNE interrput */
    USART_DisableInterrupt(TINY_COM1,USART_INT_RXBNE);
    USART_DisableInterrupt(TINY_COM2,USART_INT_RXBNE);
    /** Disable USART2 RXBNE interrput */
    USART_ClearStatusFlag(TINY_COM1, USART_FLAG_RXBNE);
    USART_ClearStatusFlag(TINY_COM2, USART_FLAG_RXBNE);
}
void Delay(uint32_t count){
    volatile uint32_t delay = count;
    while(delay--);
}

6,这里说明一下,freertos创建 了2个任务,一个是让led2每0.5秒交替亮灭。

     任务二是串口1和串口 2直接互发数据正确就led3亮,完成 后保持2秒亮,然后熄灭2秒然后再开始下一次比较。如果led3能几秒亮然后熄灭一阵再亮就对了。

7,串口1和2直接连接好线,编译运行,查看结果:

8,谢谢。

758d0780e6cef433bbb34808e0639e78

 

最新回复

学习了,不知道和407有多少差异。   详情 回复 发表于 2023-6-21 15:37
点赞 关注
 
 

回复
举报

4854

帖子

3

TA的资源

版主

沙发
 

极海APM32F407 Tiny Board是一款基于ARM Cortex-M4内核的嵌入式开发板,它可以使用Keil、IAR等常见的开发软件进行编程。

点评

感谢支持!  详情 回复 发表于 2023-5-28 22:02
 
 
 

回复

1704

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 

FreeRTOS的测试结果不错

点评

感谢支持!  详情 回复 发表于 2023-5-28 22:02
 
 
 

回复

6105

帖子

4

TA的资源

版主

4
 
火辣西米秀 发表于 2023-5-28 21:57 FreeRTOS的测试结果不错

感谢支持!

 
 
 

回复

6105

帖子

4

TA的资源

版主

5
 
led2015 发表于 2023-5-28 21:20 极海APM32F407 Tiny Board是一款基于ARM Cortex-M4内核的嵌入式开发板,它可以使用Keil、IAR等常见的开发软 ...

感谢支持!

 
 
 

回复

6980

帖子

11

TA的资源

版主

6
 
版主大佬的优秀帖子,拜读后,佩服大佬的知识那是真的广!
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

7
 

版主老大的优秀帖子,拜读后,真是佩服大佬的知识,佩服

 
 
 

回复

6105

帖子

4

TA的资源

版主

8
 

lugl4313820  feng289695601   惭愧  惭愧  感谢支持!

 
 
 

回复

7618

帖子

18

TA的资源

五彩晶圆(高级)

9
 

学习了,不知道和407有多少差异。

点评

差别应该不大。资源都一样。只是这个用的人还比较少。  详情 回复 发表于 2023-6-21 20:33
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

6105

帖子

4

TA的资源

版主

10
 
freebsder 发表于 2023-6-21 15:37 学习了,不知道和407有多少差异。

差别应该不大。资源都一样。只是这个用的人还比较少。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表