> 文档中心 > 【MM32F5270开发板试用】+Freertos(+1.8寸TFT)

【MM32F5270开发板试用】+Freertos(+1.8寸TFT)


本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:理想三旬

最近一直在弄这个板子,但是中间遇到了很多问题还没解决,在这里先把之前做的一部分分享一下,

一、mindsdk

灵动官网的mindsdk就是一个在线生成工程的一个网页,可以下载方存放的例子以及相应API介绍,主页面如下所示。

【MM32F5270开发板试用】+Freertos(+1.8寸TFT)

接下来设置Host OS,工具链以及板子型号,这里支持的板子型号不多。

【MM32F5270开发板试用】+Freertos(+1.8寸TFT)

二、freertos

首先准备一个例程,这是使用mindsdk生成的一个基础工程,这里值得注意的是,由于这个板子使用的是AC6,工程最好别放在有中文路径的地方,放在有中文的路径下你会发现不能进行跳转功能。接下里就可以添加Freertos的源码了,如下所示。

【MM32F5270开发板试用】+Freertos(+1.8寸TFT)

这里主要的就是接口部分,使用的Armv8-M的接口部分,内存管理随便选一个就可以了。

【MM32F5270开发板试用】+Freertos(+1.8寸TFT)

由于刚才只添加了源码,还需要进行配置文件的编写,这里的配置文件我首先是使用了之前移植过的配置文件,将配置文件添加进去后会报错,将报错的地方进行一一修改就可以了,编译器会提示报错地方,根据报错的地方添加头文件,下面是我已经弄好的。

#ifndef FREERTOS_CONFIG_H#define FREERTOS_CONFIG_H#define configENABLE_FPU    0#define configENABLE_MPU 0#define configENABLE_TRUSTZONE 0#define configUSE_PREEMPTION     1#define configUSE_IDLE_HOOK  0#define configUSE_TICK_HOOK  0#define configCPU_CLOCK_HZ  ( 120000000 )#define configTICK_RATE_HZ  ( ( TickType_t ) 1000 )#define configMAX_PRIORITIES     ( 15 )#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 600 )#define configTOTAL_HEAP_SIZE     ( ( size_t ) ( 10*1024 ) )#define configMAX_TASK_NAME_LEN     ( 5 )#define configUSE_TRACE_FACILITY 1#define configUSE_16_BIT_TICKS     0#define configIDLE_SHOULD_YIELD     1#define configUSE_MUTEXES  1#define configQUEUE_REGISTRY_SIZE 8#define configCHECK_FOR_STACK_OVERFLOW    0#define configUSE_RECURSIVE_MUTEXES 1#define configUSE_MALLOC_FAILED_HOOK    0#define configUSE_APPLICATION_TASK_TAG    0#define configUSE_COUNTING_SEMAPHORES    1#define configGENERATE_RUN_TIME_STATS    0/* Co-routine definitions. */#define configUSE_CO_ROUTINES      0#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191/* Software timer definitions. */#define configUSE_TIMERS  0#define configTIMER_TASK_PRIORITY ( 2 )#define configTIMER_QUEUE_LENGTH 5#define configTIMER_TASK_STACK_DEPTH    ( 80 )/* Set the following definitions to 1 to include the API function, or zeroto exclude the API function. */#define INCLUDE_vTaskPrioritySet 1#define INCLUDE_uxTaskPriorityGet 1#define INCLUDE_vTaskDelete  1#define INCLUDE_vTaskCleanUpResources    1#define INCLUDE_vTaskSuspend     1#define INCLUDE_vTaskDelayUntil     1#define INCLUDE_vTaskDelay  1#define xPortSysTickHandler SysTick_Handler#define xPortPendSVHandler    PendSV_Handler#define vPortSVCHandler SVC_Handler#endif /* FREERTOS_CONFIG_H */

接下来就可以创建线程了,如下所示。

#include #include #include "FreeRTOS.h"#include "task.h"#include "QDTFT_demo.h"#include "Lcd_Driver.h"#include "GUI.h"#include "board_init.h"#include #include "Timer1.h"#include "arm_math.h"#include "math.h"//任务堆栈大小#define LED_TASK_STACK512#define ESP_TASK_STACK1024//任务优先级#define LED_TASK_PRIORITY     3#define ESP_TASK_PRIORITY     5xTaskHandle startTask;xTaskHandle LEDTask;xTaskHandle ESPTask;portTASK_FUNCTION(vLEDTask, pvParameters){    while(1)    {  GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 1u);  GPIO_WriteBit(BOARD_LED1_GPIO_PORT, BOARD_LED1_GPIO_PIN, 1u);  vTaskDelay(500); GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 0u);  GPIO_WriteBit(BOARD_LED1_GPIO_PORT, BOARD_LED1_GPIO_PIN, 0u);  vTaskDelay(500);    }}portTASK_FUNCTION(vESPTask, pvParameters){     while(1)    {  QDTFT_Test_Demo();// vTaskDelay(500);    }}**/*函 数 名: vStartTask*功能说明: 系统启动任务,调用各类初始化函数,并创建消息队列和要运行的用户任务*形    参: 无*返 回 值: 无/**portTASK_FUNCTION(vStartTask, pvParameters){    xTaskCreate(vLEDTask, (char const*)"SensorReadTask",LED_TASK_STACK, NULL, LED_TASK_PRIORITY, &LEDTask);    xTaskCreate(vESPTask, (char const*)"SensorUpdateTask",ESP_TASK_STACK, NULL,ESP_TASK_PRIORITY, &ESPTask);    //删除本任务    vTaskDelete(NULL);}**int main(void){    BOARD_Init();    //创建启动任务    xTaskCreate(vStartTask, "startTask", 128, NULL, 0, &startTask);    //OS调度器启动    vTaskStartScheduler();      }

三、1.8寸TFT

在这块款子上设计了屏幕接口,有个屏幕看起来确实养眼一点,但是看了一下价格不低,也没找到其他可以替换的屏幕,我找了找之前的元器件,正好翻到之前9.9元买的1.8寸的TFT屏,看了一下接口,电源刚好能对的上,插上接口也刚好,只要电源接口合适其他的口就用I/O口来模拟。

【MM32F5270开发板试用】+Freertos(+1.8寸TFT)

程序部分,I/O初始化

void LCD_GPIO_Init(void){     GPIO_Init_Type gpio_init;    RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOD, true);    RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOD);  RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOE, true);    RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOE);  RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOG, true);    RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOG); gpio_init.Pins  = GPIO_PIN_4| GPIO_PIN_5;    gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;    gpio_init.Speed = GPIO_Speed_50MHz;    GPIO_Init(GPIOD, &gpio_init); gpio_init.Pins  = GPIO_PIN_2| GPIO_PIN_3;    gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;    gpio_init.Speed = GPIO_Speed_50MHz;    GPIO_Init(GPIOE, &gpio_init); gpio_init.Pins  = GPIO_PIN_12|GPIO_PIN_11;    gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;    gpio_init.Speed = GPIO_Speed_50MHz;    GPIO_Init(GPIOG, &gpio_init);}

修改头文件

/********************************************************************************///GND   电源地//VCC   接5V或3.3v电源//SCL   接PD4(SCL)//SDA   接PD5(SDA)//RES   接PE2//DC    接PG11//CS    接PG12 //  BL      接PE3/*******************************************************************************/#ifndef   LCD_DRIVE_H#define   LCD_DRIVE_H#include "stdint.h"#include "board_init.h"#define RED      0xf800#define GREEN    0x07e0#define BLUE     0x001f#define WHITE    0xffff#define BLACK    0x0000#define YELLOW  0xFFE0#define GRAY0   0xEF7D//灰色0 3165 00110 001011 00101#define GRAY1   0x8410   //灰色1      00000 000000 00000#define GRAY2   0x4208   //灰色2  1111111111011111#define LCD_CTRLD      GPIOD //定义TFT数据端口#define LCD_CTRLE      GPIOE //定义TFT数据端口#define LCD_CTRLG      GPIOG //定义TFT数据端口#define LCD_SCL     GPIO_PIN_4    //PD4--->>TFT --SCL/SCK#define LCD_SDA     GPIO_PIN_5    //PD5 MOSI--->>TFT --SDA/DIN#define LCD_RST  GPIO_PIN_2    //PE2--->>TFT --RST#define LCD_RS      GPIO_PIN_11    //PG11--->>TFT --RS/DC#define LCD_CS     GPIO_PIN_12  //PG12--->>TFT --CS#define LCD_LED     GPIO_PIN_3  //PE3--->>TFT --BL//#define LCD_CS_SET(x) LCD_CTRL->ODR=(LCD_CTRL->ODR&~LCD_CS)|(x ? LCD_CS:0)//液晶控制口置1操作语句宏定义#define    LCD_SCL_SET      LCD_CTRLD->BSRR=LCD_SCL    #define    LCD_SDA_SET      LCD_CTRLD->BSRR=LCD_SDA  #define    LCD_RST_SET      LCD_CTRLE->BSRR=LCD_RST#define    LCD_RS_SET      LCD_CTRLG->BSRR=LCD_RS #define    LCD_CS_SET      LCD_CTRLG->BSRR=LCD_CS#define    LCD_LED_SET      LCD_CTRLE->BSRR=LCD_LED  //液晶控制口置0操作语句宏定义#define    LCD_SCL_CLR      LCD_CTRLD->BRR=LCD_SCL  #define    LCD_SDA_CLR      LCD_CTRLD->BRR=LCD_SDA  #define    LCD_RST_CLR      LCD_CTRLE->BRR=LCD_RST#define    LCD_RS_CLR      LCD_CTRLG->BRR=LCD_RS #define    LCD_CS_CLR      LCD_CTRLG->BRR=LCD_CS#define    LCD_LED_CLR      LCD_CTRLE->BRR=LCD_LED #define LCD_DATAOUT(x) LCD_DATA->ODR=x; //数据输出#define LCD_DATAIN     LCD_DATA->IDR;   //数据输入

接下来就可以运行已经写好的屏幕程序了。

四、总结

板子外设挺丰富的,官方给的只有一些基础的外设,对以太网还没支持。我自己也试着弄了一下,结果没弄出来,还有就是官方的例程对程序没有注释,这个不太好。总体来说用着还不错,希望官方能把rtt给支持起来就好了。