点灯是大部分单片机学习时完成的第一个功能,机智云的gokit3的大部分外设虽然都在拓展板上,但是在st底板上还是留下了4个LED供我们测试使用。
机智云平台生成的代码是可以通过cubemx配置的,cubemx则包含了hal库,那么用hal进行开发最适合不过了。假如这是第一次上手单片机,那么还是建议先通过寄存器进行测试,或者基于标准库开发。
那么这次我们就使用这4个LED,来模拟一个4灯环境的智能设备。 首先我们要在机智云上创建一个智能设备,就以吸顶灯为例,创建一个自定义的吸顶灯项目。 接下来就是创建我们的数据点,创建4个可写的布尔值,用于控制4个led灯 再到模组信息页面,选择乐鑫模组,Gokit由乐鑫的esp模组负责wifi通讯。 接下来,点击控制页面,再点击配网引导。为了更方便用户使用,建议启用airlink方式连接设备,并把首选方式更改为airlink,通过长按可进行拖拽排序,把airlink拖动到第一位并选中即可。 点击保存,然后,我们创建一个移动应用,用于控制我们的设备 可以选择关联或不关联现有应用,看个人选择,关联现有应用就不用再注册账号,上一个应用的账号也可以在这个应用登录使用。 下一步就是关联我们上一步创建的智能设备,点击页面的关联,把刚才创建的智能设备关联上。 关联完成后,即可构建我们的应用,使用自动生成的签名生成debug包 现在我们就可以来配置编写我们的代码了。 在产品开发的 mcu开发里,选择 STM32f103c8x 填入我们的product secret生成mcu代码包。 等待生成完成后即可下载代码包。 机智云已经帮我们定义好了数据点,剩下的管脚配置和具体的外设驱动还需要我们自己来完成。首先第一步是完成管脚的配置,这里我们使用cubemx来方便开发,打开云平台代码里的STM32F103C8x.ioc 假设cubemx版本不同则会弹出警告,这里我们选择migrate 迁移到新版本 在配置管脚前,先看一下led灯具体连接到哪个io口,gokit2和gokit3几乎无区别,因此可以看gokit2 st底板的电路图 从图中可知,我们要配置的io是PB1 11 14和15,点击cubemx软件内芯片上的管脚,把上述几个管脚配置成output 接下来,给管脚定义一个别名,点击软件上方的point->Pin/Signals options 为管脚起个别名,方便管理 这里我以LED 1 2 3 4为例,输入后点击apply使其生效 接下来点击右上方generate code生成代码 完成之后点击close关闭cubemx,使用keil打开项目 有没有发现一些异常,cubemx重新生成后我们之前的部分路径丢失了,但是问题不大,重新添加回来即可 右键项目STM32F103c8x 在弹出的选项中选择add group 像下图那样添加三个组,与文件名一致 再分别向三个组添加文件夹里的.c文件 添加完成后如图所示 此时完成文件的添加,但是我们还没有包含我们的文件路径,此时进行编译会报错。 点击keil的魔术棒,选择c/c++ 单击include paths右边的三个点,添加我们的文件路径 如图所示,添加代码包里的Hal Gizwits Utils三个文件夹
完成文件路径的添加后,返回target,勾选microlib,不勾选这个生成的文件烧录会导致stm启动异常,microlib是针对arm嵌入式高度优化的库,缩减了部分代码,并且默认把printf定向到串口方便调试。 接下来我们就要实现我们的灯的功能代码了。 在gizwits_product.c里面已经为我们定义好了基本的条件语句,只要完成io管脚的驱动即可。 按下列代码,完成编写我们四个led事件的驱动 注意包含头文件main.h,具体代码是如何实现可以参考hal开发手册。 具体的代码 - if(0x01 == currentDataPoint.valueLED_OnOff_1)
- {
- //user handle
- HAL_GPIO_WritePin(GPIOB,LED1_Pin,GPIO_PIN_SET);
- }
- else
- {
- //user handle
- HAL_GPIO_WritePin(GPIOB,LED1_Pin,GPIO_PIN_RESET);
- }
- if(0x01 == currentDataPoint.valueLED_OnOff_2)
- {
- //user handle
- HAL_GPIO_WritePin(GPIOB,LED2_Pin,GPIO_PIN_SET);
- }
- else
- {
- //user handle
- HAL_GPIO_WritePin(GPIOB,LED2_Pin,GPIO_PIN_RESET);
- }
- if(0x01 == currentDataPoint.valueLED_OnOff_3)
- {
- //user handle
- HAL_GPIO_WritePin(GPIOB,LED3_Pin,GPIO_PIN_SET);
- }
- else
- {
- //user handle
- HAL_GPIO_WritePin(GPIOB,LED3_Pin,GPIO_PIN_RESET);
- }
- if(0x01 == currentDataPoint.valueLED_OnOff_4)
- {
- //user handle
- HAL_GPIO_WritePin(GPIOB,LED4_Pin,GPIO_PIN_SET);
- }
- else
- {
- //user handle
- HAL_GPIO_WritePin(GPIOB,LED4_Pin,GPIO_PIN_RESET);
- }
复制代码至此,暂时完成了网络点灯的代码,要是想让按键点灯,需要在userhandle里写数据点的上报以及完成按键实现,这里就只是简单测试led就不写了。 接下来生成烧录文件,打开STM32CubeProgrammer烧录到gokit里,由于我们并未编写rgb的驱动,所以按键长按还无法显示到rgb灯上 但是我们可以使用串口调试连接stm的串口,长按key2进入airlink配对模式,看到串口输出信息 最后是实现效果,配对完成后,在APP里点亮第一个第三个灯,可以看到开发板上对应的灯亮起。 开发板图
|