一,申请过程。
在MM32公开课群中获知,可以申请MM32 eMiniBoard蓝牙开发板的信息,就第一时间注册并登录面包板社区,进入测评中心申请。在这段时间内都有空上来查看申请人数,经过长久的等待再终达成心愿,终于申请通过获得开发板。但在收到开发板前,要表扬面包板社会的工作人员的工作严谨热情的态度。并通过沟通后才能获得开发板。
二,收到开发板的感觉。
当取得顺丰快递单号后,经过二天的时间,终于开发板收到。找开包装后,第一感觉这包装是我暂时见到包装最好的一块开发板。未拆包装前就来张照片。拆取过程都还算顺利,拿到手上来个上下翻转来看个够,下一步当然是来张脱包装的PCB真相照片。上传相片一见真容。
复制代码
三,下载MM32W3xx模板程序及提取相应的MM32W373PSB文件。
1,在此首先感谢“面包板社区~灵动开发板评测6群”中的大神,及时发送出来模板程序。来下载一个
2020-6-14 12:51 上传
点击文件名下载附件
MM32W3xx模板程序 。
2,在MM32官网中下载keil5 pack安装包并解压后打开MindMotion.MM32W3xxB_DFP.1.0.7.pack进行安装。mm32 pack文件包
3,建立工程,提取Device整个文档内容到自建工程中。相信大家对keil5开发有一定经验了,这里就不写出步骤,如有不明相关步骤请度娘,。最后文件架构如下。
四,功能PIN口编写(LED点灯闪烁)。
1,根据MM32 eMiniBoard蓝牙开发板的原理图,将四粒LED的端口初始化。代码如下:
文件:lec.h#ifndef __LED_H #define __LED_H #include "HAL_gpio.h" #include "rtthread.h" enum LED_ENUM_LIST{ LED1 = 0, LED2, LED3, LED4, }; void LED_Init(void); void LEDx_SHOW(enum LED_ENUM_LIST ledx,rt_bool_t flag); #endif
复制代码文件:led.c#include "led.h" #include "hal_rcc.h" void LED_Init(void){ //使能端口时钟。 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOC, ENABLE ); //配置端口参数 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //LED1 GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 ; //LED2,LED3,LED4 GPIO_Init(GPIOC,&GPIO_InitStructure); LEDx_SHOW(LED1,RT_FALSE); LEDx_SHOW(LED2,RT_FALSE); LEDx_SHOW(LED3,RT_FALSE); LEDx_SHOW(LED4,RT_FALSE); } //LED显示 void LEDx_SHOW(enum LED_ENUM_LIST ledx, rt_bool_t flag){ switch(ledx){ case LED1: flag?(GPIO_ResetBits(GPIOA,GPIO_Pin_15)):(GPIO_SetBits(GPIOA,GPIO_Pin_15)); break; case LED2: flag?(GPIO_ResetBits(GPIOC,GPIO_Pin_10)):(GPIO_SetBits(GPIOC,GPIO_Pin_10)); break; case LED3: flag?(GPIO_ResetBits(GPIOC,GPIO_Pin_11)):(GPIO_SetBits(GPIOC,GPIO_Pin_11)); break; case LED4: flag?(GPIO_ResetBits(GPIOC,GPIO_Pin_12)):(GPIO_SetBits(GPIOC,GPIO_Pin_12)); break; } }
复制代码2,在main函数中调用LED的初始化函数,并在while中循环调用LED显示,0.1S闪烁。代码如下:
文件:maic.c#include "HAL_device.h" // Device header #include "led.h" #include "uart.h" #include "delay.h" int main(void){ LED_Init(); while(1){ //Led1闪烁 LEDx_SHOW(LED1,RT_TRUE); DELAY_MS(100); LEDx_SHOW(LED1,RT_FALSE); DELAY_MS(100); } }
复制代码文件: delay.c#include "delay.h" void DELAY_MS(rt_uint16_t ms){ do{ rt_uint16_t x = 5963; while(x--); }while(ms--); }
复制代码3,用逻辑分析仪捕获到的波形如下图。这样显示不觉得有问题0.1S闪烁,好吧,那下一步要分段显示四只LED都是0.1S闪烁效果 。
4,分段显示四只LED都是0.1S闪烁效果。代码及显示效果以下:
int main(void){ LED_Init(); while(1){ //Led1闪烁 LEDx_SHOW(LED1,RT_TRUE); DELAY_MS(100); LEDx_SHOW(LED1,RT_FALSE); DELAY_MS(100); //Led2闪烁 LEDx_SHOW(LED2,RT_TRUE); DELAY_MS(100); LEDx_SHOW(LED2,RT_FALSE); DELAY_MS(100); //Led4闪烁 LEDx_SHOW(LED3,RT_TRUE); DELAY_MS(100); LEDx_SHOW(LED3,RT_FALSE); DELAY_MS(100); //Led4闪烁 LEDx_SHOW(LED4,RT_TRUE); DELAY_MS(100); LEDx_SHOW(LED4,RT_FALSE); DELAY_MS(100); } }
复制代码这样显示效果不是我想要的,好了,不用怕,中国多的是人才。那就使用国产RTOS系统RT-Thread吧!RT-Thread分为两大类,我这次用Nano版,主要是使用内核部分,详细的使用方法见RT-Thread官网网址。
5,单只LED使用RT-Thread后的效果如下。
6,发现不是0.1S而是0.099S,是因为MCU用了内部RC振荡,为了达到更加准确的时间,用外部晶振,打开system_MM32W3xx.c修改方法及运行结果如下:
五,RT-Thread移植并使用RT-Thread线程单独驱动四粒LED。
1,首先检查keil5是否已成功安装了RT-Thread.
2,如果没有则要下载安装RT-Thread pack.
2020-6-14 16:41 上传
点击文件名下载附件
RT-Thread pack 。
3,安装完成后,重新打开keil5。移植RT_Thread内核较为简单方便。如下图所示:
4,已添加了RT_Thread内核,keil5界面左边显示效果如下:
5,在main.c头文件中添加rtthread.h,并在while(1){ ...}添加以下代码.
//Led1闪烁 LEDx_SHOW(LED1,RT_TRUE); rt_thread_mdelay(100); //rt-thread延时线程 LEDx_SHOW(LED1,RT_FALSE); rt_thread_mdelay(100); //rt-thread延时线程
复制代码6,点击Rebuild按钮,编译后出现错误,如下图所示,报错显示为L6218E:未定义符号SystemCoreClockUpdate(引用自board.o)。
7,打开board.c,将SystemCoreClockUpdate()注释后,重新编译后通过。下载到开发板后,显示波形效果为“四,功能PIN口编写(LED点灯闪烁)中的第6点图片效果 ”。这是基于RT-Thread的延时。
8,在 main.c中增加LED线程函数,具体代码如下:
//基于RT_Thread线程分别驱动四粒LED#include "HAL_device.h" // Device header #include "rtthread.h" // RealThread.RT-Thread::RTOS:kernel #include "led.h" #include "uart.h" #include "delay.h" #define THREAD_PRIORITY 15 //线程优先级 #define THREAD_STACK_SIZE 512 //线程堆大小 #define THREAD_TIMESLICE 10 //线程运行时间片 /* *led线程入口 */ static void led1_thread_entry(void *paramenter){ static rt_bool_t flag;// = RT_TRUE; while(1){ flag = ~flag; LEDx_SHOW(LED1,flag); rt_thread_mdelay(100); } } static void led2_thread_entry(void *paramenter){ static rt_bool_t flag; while(1){ flag = ~flag; LEDx_SHOW(LED2,flag); rt_thread_mdelay(100); } } static void led3_thread_entry(void *paramenter){ static rt_bool_t flag; while(1){ flag = ~flag; LEDx_SHOW(LED3,flag); rt_thread_mdelay(100); } } static void led4_thread_entry(void *paramenter){ static rt_bool_t flag; while(1){ flag = ~flag; LEDx_SHOW(LED4,flag); rt_thread_mdelay(100); } } /* *创建动态LED线程,线程可分为静态及动态线程。 */ int led_thread_init(void){ static rt_thread_t led1_thread; static rt_thread_t led2_thread; static rt_thread_t led3_thread; static rt_thread_t led4_thread; led1_thread = rt_thread_create("led1_thread", led1_thread_entry,RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, //优先级 THREAD_TIMESLICE); if(led1_thread != RT_NULL){ rt_thread_startup(led1_thread); } led2_thread = rt_thread_create("led2_thread", led2_thread_entry,RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY + 1, //优先级比LED1低1级 THREAD_TIMESLICE); if(led2_thread != RT_NULL){ rt_thread_startup(led2_thread); } led3_thread = rt_thread_create("led3_thread", led3_thread_entry,RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY + 2, //优先级比LED1低2级 THREAD_TIMESLICE); if(led3_thread != RT_NULL){ rt_thread_startup(led3_thread); } led4_thread = rt_thread_create("led4_thread", led4_thread_entry,RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY + 3, //优先级比LED1低3级 THREAD_TIMESLICE); if(led4_thread != RT_NULL){ rt_thread_startup(led4_thread); } return 0; } int main(void){ LED_Init(); led_thread_init(); while(1){ } }
复制代码10,重新编译下载到开发板后。四粒LED同时运行起来。驱动波形如下,这才是我想要的效果。
六,代码及视频。
评测文章
热帖
大家都在看的技术资料
举报
内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
关闭
站长推荐 /3
- 返回顶部
工具栏