本帖最后由 andeyqi 于 2020-11-17 13:12 编辑
一直想搞块双核的mcu玩玩,趁着社区的双十一活动优惠活动购买了块逐飞LPC55S69开发板玩玩,在此感谢管管(日天兄)安排的活动购买的价格还是比较给力的而且已经收到管管购买开发板反的京东券,价格真的很香,以下开始今天的开箱跑起来开发板,虽然主板的大小相对比较迷你不过做工还是比较精致的,板载了一路全速USB口,一路高速的USB口,调试口使用的SWD方式,六路flexcomm接口用于扩展UART,IIC,SPI接口的外设/传感器。
本次开箱使用的例程采用逐飞基于NXP SDK二次开发的接口库,逐飞的里程已经开源托管在gitee上,可以从如下链接下载获取,接口库的使用说明在如下链接也有详细的描述。
https://gitee.com/seekfree/LPC55S69_Library
开发/调试环境:使用MDK(5.29版本),JLINK-V9,因LPCS5569 相对比较新,建议使用高版本的MDK和JLINK驱动,避免因开发环境不支持造成的异常状况,开发环境要求可以参考如下内容,仅供参考。
逐飞的开源库中已经集成了大部分外设的驱动例程,可以让新手快速的上手使用该芯片,更新最新的rt-thread仓库发现已经支持了LPC55S69单核系统的移植,不负所望的逐飞的历程下也包含了rt-thread的例程,本次开箱就基于此将rt-thread 系统跑起来,rt-thread 系统我一直认为是国产里面比较好的代码也很优雅一致在默默的关注其快速发展。
废话不多说了,打开逐飞的RTT历程,先简单的分析下程序。
- #include "rtt_demo.h"
- /*******************************************************************************
- * Variables
- ******************************************************************************/
- volatile uint16_t runtime = 0;
- /*******************************************************************************
- * Code
- ******************************************************************************/
-
- void iot_print_runtime (void *parameter)
- {
- while(1)
- {
- delay_ms(1000);
- runtime++;
- rt_kprintf("\r\n%d.", runtime);
- }
- }
- void clear_runtime (int argc)
- {
- runtime = 0;
- }
- MSH_CMD_EXPORT(clear_runtime, clear runtime with no param); // ÉèÖà MSH ÃüÁî Çå¿ÕÔËÐÐʱ¼ä
- void set_runtime (int argc, char** argv)
- {
- runtime = ((uint8_t)argv[1][0]-0x30);
- if(argv[1][1] > 0x2F && argv[1][1] < 0x3A)
- {
- runtime = runtime*10 + ((uint8_t)argv[1][1]-0x30);
- if(argv[1][2] > 0x2F && argv[1][2] < 0x3A)
- runtime = runtime*10 + ((uint8_t)argv[1][2]-0x30);
- }
- if(runtime > 10000) runtime = 10000;
- }
- MSH_CMD_EXPORT(set_runtime, set runtime with decimalism param); // ÉèÖà MSH ÃüÁî ÉèÖÃÔËÐÐʱ¼ä
-
- /*!
- * @brief Main function
- */
- int main(void)
- {
- rt_thread_t tid;
- tid = rt_thread_create("runtime_print", iot_print_runtime, RT_NULL, 1024, 12, 28); // н¨Ïß³Ì
- RT_ASSERT(tid != RT_NULL);
- rt_thread_startup(tid);
- while(1)
- {
- delay_ms(50);
- }
- return 0;
- }
复制代码
从以上的代码分析,历程实现的功能还是比较简单的,创建了runtime_print 任务线程打印输出系统但当前运行的时间,并是实现了设定/清除时间的命令来设置和清除当前运行的时间,看完这段代码还会有一个疑问板子上有六路flexcomm串口,但是系统终端绑定的是哪个呢,我们从如下配置代码中可以找到答案,从配置可以看出来对应的uart7,好了我们可以编译运行下代码验证下上述分析和代码运行的效果是否一致。
- /* Kernel Device Object */
- #define RT_USING_DEVICE
- #define RT_USING_CONSOLE
- #define RT_CONSOLEBUF_SIZE 128
- #define RT_CONSOLE_DEVICE_NAME "uart7"
- #define RT_VER_NUM 0x40002
- #define ARCH_ARM_CORTEX_FPU
复制代码
根据原理图可知uart7接口在P15接口中,对应具体引脚如下.
通过串口输出信息及输入clear_runtime/set_runtime 运行效果和之前分析的保持一致。
说到双核系统我们简单的描述下LPCS5569的双核启动过程,LPC55S69芯片的双核启动方式为CORE0开始工作后从CORE0启动CORE1,CORE0为master 核,CORE1为slave 核,片上的资源可以根据各自的需求进行分配配置,在此简单的看一下逐飞的demo程序中对存储资源的分配情况,因为demo程序使用的是单核,我们看下链接脚本中对memory资源的使用分配情况。
- /* USB BDT size */
- #define usb_bdt_size 0x0
- /* Sizes */
- #if (defined(__stack_size__))
- #define Stack_Size __stack_size__
- #else
- #define Stack_Size 0x400
- #endif
- #if (defined(__heap_size__))
- #define Heap_Size __heap_size__
- #else
- #define Heap_Size 0x400
- #endif
- #define m_interrupts_start 0x00000000
- #define m_interrupts_size 0x00000200
- #define m_text_start 0x00000200
- #define m_text_size 0x00071E00
- #define m_core1_image_start 0x00072000
- #define m_core1_image_size 0x00026000
- #if (defined(__use_shmem__))
- #define m_data_start 0x20000000
- #define m_data_size 0x00031800
- #define m_rpmsg_sh_mem_start 0x20031800
- #define m_rpmsg_sh_mem_size 0x00001800
- #else
- #define m_data_start 0x20000000
- #define m_data_size 0x00033000
- #endif
- #define m_usb_sram_start 0x40100000
- #define m_usb_sram_size 0x00004000
复制代码
从如下信息可以看出0x00000200 ~ 0x00072000这部分空间是CORE0的代码段,0x00072000~0x00098000区间配置为CORE1的代码段 - #define m_text_start 0x00000200
- #define m_text_size 0x00071E00
- #define m_core1_image_start 0x00072000
- #define m_core1_image_size 0x00026000
复制代码从如下信息可以看出,两个和之间是预留了一部分共有内存用来双核间通信,SDK的接口库中已经封装可这一部分的操作处理后续进行研究。 - #if (defined(__use_shmem__))
- #define m_data_start 0x20000000
- #define m_data_size 0x00031800
- #define m_rpmsg_sh_mem_start 0x20031800
- #define m_rpmsg_sh_mem_size 0x00001800
- #else
- #define m_data_start 0x20000000
- #define m_data_size 0x00033000
- #endif
复制代码
如下是数据手册中对地址区间的划分,从中可以发现ram/rom的地址和上述的链接文件是的划分区间是匹配的。
本次开箱运行RTT就到此,后续计划研究下双核间的共享内存通信机制,在两个核上同时跑起来RTT,两个系统之间通过共有内存来通信,本贴中的某些描述如有错误,欢迎斧正。
|