这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【EFM8BB52单片机】宠物小用具,猫咪逗猫棒(初步完结)

共30条 1/3 1 2 3 跳转至

【EFM8BB52单片机】宠物小用具,猫咪逗猫棒(初步完结)

助工
2021-12-21 11:35:58   被打赏 50 分(兑奖)     打赏

试用项目:猫咪逗猫棒

最开始是想做猫咪上水器的,不过疫情原因,水泵买不了了,就做个逗猫棒吧。


目录:

1. 开箱 (本楼)

2. 环境搭建

3. 点亮 LED

4. 通过计时器延时,闪烁

5. 串口通信

6. 驱动步进电机

7. 红外遥控(接收器已烧,这节中断了)

8. 流程框图和原理图


程序在码云上,可供参考,戳这里

功能使用:

  • delay,使用计时器0中断完成精准的延时函数

  • uart,串口通信,使用了计时器1和串口中断

  • motor,步进电机控制,使用IO口

  • ired,红外,使用外部中断



板子开箱

真开心,第一次在EEPW参加试用活动,认真负责的工作人员打了两次电话 。

快递挺快的,一直加班没去取,18号才拿到。

好大的一个箱子,拿起来很轻,以为是咸鱼的空箱,还拍了视频,看到SILICON LABS的logo就释然了。里面有芯科的EFM8BB52开发板、usb线和小卡片:

1640057631409103.jpg

板子值得单独来一张,就不多做分析了,毕竟也不太懂

1640057802137513.jpg

看到群里说软件很难搞,小白有点慌,还好有各位大佬在前面领路。不慌。

想给猫咪做个小玩意,流动水盆或者逗猫棒 。

身为一个初学者,还是先把环境搭起来点点灯吧。






关键词: MCU     BB52     宠物    

高工
2021-12-21 15:02:56     打赏
2楼

感谢楼主的分享,很实用了。


助工
2021-12-23 16:21:32     打赏
3楼

环境搭建


去官网下载Simplicity Studio 软件,下载完成后,挂载.iso文件,选择 setup.exe 进行安装。

启动界面:

Untitled.png


中间有一个安装管理器的界面,被我 Esc 跳过了,不过没关系,后面还会出来的

Untitled (1).png

插上设备后会提示安装所需的包,同意直接安装:

Untitled (2).png

点击Start,点击 Create new Project , manager 安装界面就出来了:

Untitled (3).pngUntitled (4).png选择第一项后没有找到所需的sdk,手动找sdk包:


点击 8051SDK 右边的 install new

4.2.3版本支持手上这块开发板,点击 FINISH 开始下载。

选择demo, blink。经过编译烧录就可以闪起来了。



助工
2021-12-23 16:47:25     打赏
4楼


点亮LED 

参考demo从头点亮LED。


1.新建项目

Start 后新建项目(Create New Project),选空的C项目

Untitled (9).png

编译烧录步骤如下,参考帖子 【EFM8BB52单片机】+假装开箱+Blink

Untitled (10).png烧录之后,点击 reset, lED0肯定是熄灭的,因为什么也没写。


2. 点灯还需要初始化?

main方法中加上下面代码,LED灯就会亮

enter_DefaultMode_from_RESET(); // 初始化
P1_B4 = 1; // 亮灯

这个初始化函数是从demo中拿的,如果没有初始化LED是不会亮的。P1_B4是头文件中已经定义好的P1.4口。

现在来看看函数中做了什么初始化工作

void enter_DefaultMode_from_RESET(void) {
	// $[Config Calls]
	// Save the SFRPAGE
	uint8_t SFRPAGE_save = SFRPAGE;
	WDT_0_enter_DefaultMode_from_RESET(); // 看门狗初始化
	PORTS_1_enter_DefaultMode_from_RESET(); // 端口初始化
	PBCFG_0_enter_DefaultMode_from_RESET(); // 配置
	TIMER16_2_enter_DefaultMode_from_RESET(); // 定时器
	INTERRUPT_0_enter_DefaultMode_from_RESET(); // 中断
	// Restore the SFRPAGE
	SFRPAGE = SFRPAGE_save;
	// [Config Calls]$
}

测试了下,五个方法中,第2-3个方法加上就可以点亮LED灯了。第二个是端口初始化,第三个不太清楚,里面配置了 XBR2 (XBR2 - Port I/O Crossbar 2 ?)如果不加第三个方法,LED也会亮,亮度很低。

LED 灭-微亮-亮:

QQ图片20211223164102.jpg

优化了下代码,有了最简点灯程序:

#include <SI_EFM8BB52_Register_Enums.h>                // SFR declarations

//-----------------------------------------------------------------------------
// SiLabs_Startup() Routine
// ----------------------------------------------------------------------------
// This function is called immediately after reset, before the initialization
// code is run in SILABS_STARTUP.A51 (which runs before main() ). This is a
// useful place to disable the watchdog timer, which is enable by default
// and may trigger before main() in some instances.
//-----------------------------------------------------------------------------
void SiLabs_Startup (void)
{
}

int main (void)
{
  P1MDIN =  P1MDIN_B4__DIGITAL; // 设置 P1.4 输入模式
  P1MDOUT = P1MDOUT_B4__PUSH_PULL; // 设置 P1.4 输出模式
  XBR2 = XBR2_XBARE__ENABLED; //  启用 Crossbar

  P1_B4 = 1; // 点亮 LED0

  while (1) {}
}

注:如果没有 SiLabs_Startup() 方法,编译会出错  make: *** [makefile:31: xxxxxx.omf] Error 1。



助工
2022-01-01 23:25:54     打赏
5楼

通过计时器延时,闪烁

想使用计时器实现定时,这个问题卡了两天,才搞出一个准确的delay函数

参考自示例 (.\SiliconLabs\SimplicityStudio\v5\developer\sdks\8051\v4.2.3\examples\EFM8BB52_PK5206B)


#define SYSCLK       24500000/8         // Clock speed in Hz / 8


void timer0Init(){
  /**
   * 设置晶振为12分频
   */
  CKCON0 = CKCON0_SCA__SYSCLK_DIV_12 | CKCON0_T0M__PRESCALE
      | CKCON0_T2MH__EXTERNAL_CLOCK | CKCON0_T2ML__EXTERNAL_CLOCK
      | CKCON0_T3MH__EXTERNAL_CLOCK | CKCON0_T3ML__EXTERNAL_CLOCK
      | CKCON0_T1M__PRESCALE;

  TMOD = TMOD_T0M__MODE1 | TMOD_T1M__MODE0 | TMOD_CT0__TIMER
      | TMOD_GATE0__DISABLED | TMOD_CT1__TIMER | TMOD_GATE1__DISABLED;
}

void Timer0_Delay1ms (uint16_t ms)
{

    uint16_t i;

    for (i = 0; i < ms; i++) {         // Count microseconds
        TCON &= ~0x30;                   // STOP Timer0 and clear overflow
        TH0 = (-SYSCLK/12/1000) >> 8;    // 1 ms
        TL0 = -SYSCLK/12/1000;

        TCON |= 0x10;                    // START Timer0
        while (TCON_TF0 == 0);           // Wait for overflow
    }

}


解释一下几处要点:


#define SYSCLK 24500000/8

系统时钟设置为 24500000/8 (为啥除以8,这个之后再解释,因为我还没经过验证,先抛个砖,大概率和CLKDIV相关)


初始化时设置中,

CKCON0 = CKCON0_SCA__SYSCLK_DIV_12 | CKCON0_T0M__PRESCALE

 表示晶振为12分频,TIME0使用分频后的时钟。


delay函数中,设置的TH0和TH1为 -SYSCLK/12/1000 ,因为12分频后,所以 SYSCLK/12 为一秒的时钟周期数,再除1000就是毫秒数。如果分频是 48 的话,那这里就是 -SYSCLK/48/1000 。


有了delay函数,闪烁LED调用下就成,就不上闪烁的代码了。



院士
2022-01-01 23:35:02     打赏
6楼
谢谢

院士
2022-01-01 23:35:09     打赏
7楼
学习

院士
2022-01-01 23:35:15     打赏
8楼
谢谢

专家
2022-01-12 23:43:26     打赏
9楼

谢谢


助工
2022-01-16 20:51:29     打赏
10楼

准备学着画原理图,发现立创升级中。


共30条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]