最近一直在弄这个板子,但是中间遇到了很多问题还没解决,在这里先把之前做的一部分分享一下,
一、mindsdk
灵动官网的mindsdk就是一个在线生成工程的一个网页,可以下载方存放的例子以及相应API介绍,主页面如下所示。
接下来设置Host OS,工具链以及板子型号,这里支持的板子型号不多。
二、freertos
首先准备一个例程,这是使用mindsdk生成的一个基础工程,这里值得注意的是,由于这个板子使用的是AC6,工程最好别放在有中文路径的地方,放在有中文的路径下你会发现不能进行跳转功能。接下里就可以添加Freertos的源码了,如下所示。
这里主要的就是接口部分,使用的Armv8-M的接口部分,内存管理随便选一个就可以了。
由于刚才只添加了源码,还需要进行配置文件的编写,这里的配置文件我首先是使用了之前移植过的配置文件,将配置文件添加进去后会报错,将报错的地方进行一一修改就可以了,编译器会提示报错地方,根据报错的地方添加头文件,下面是我已经弄好的。
#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 zero
to 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 <stdint.h>
#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"
#include "QDTFT_demo.h"
#include "Lcd_Driver.h"
#include "GUI.h"
#include "board_init.h"
#include <string.h>
#include "Timer1.h"
#include "arm_math.h"
#include "math.h"
//任务堆栈大小
#define LED_TASK_STACK 512
#define ESP_TASK_STACK 1024
//任务优先级
#define LED_TASK_PRIORITY 3
#define ESP_TASK_PRIORITY 5
xTaskHandle 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口来模拟。
程序部分,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给支持起来就好了。