【BLE】CC2541之多个自定义IO输出

发布于:2025-02-10 ⋅ 阅读:(59) ⋅ 点赞:(0)

本文最后修改时间:2018年05月01日 12:46

一、本节简介

本文以\SimpleBLECentral为例,介绍如何将3个普通IO口(P10、P11、P14,刚好对应香瓜开发板的D1、D2、D3三个LED)自定义为IO输出,实现电平翻转控制。

二、实验平台

1)CC2541平台

①协议栈版本:BLE-CC254x-1.4.0

②编译软件:IAR 9.10.1

③硬件平台:香瓜CC2541开发板、香瓜OLED显示屏

④仿真器:香瓜CC Debugger下载器

三、版权声明

1)作者:甜甜的大香瓜

2)声明:喝水不忘挖井人,转载请注明出处。

3)纠错/业务合作:897503845@qq.com

4)香瓜BLE之CC2541群:127442605

5)本文出处:原创连载资料《简单粗暴学蓝牙4.0(CC2541篇)》

6)完整开源资料下载地址(电脑端打开):

opengua.taobao.com

7)香瓜CC2541开发板套件购买:

opengua.taobao.com

四、实验前提

1、在进行本文步骤前,请先阅读以下章节:

1)《简单粗暴学蓝牙4.0(CC2541篇)》的“第一章至第三章”章节

2、在进行本文步骤前,请先实现以下章节:

1)《简单粗暴学蓝牙4.0(CC2541篇)》的“第三章 软件的安装及使用”章节。

2)《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之OLED》。

3)《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之按键》。

五、基础知识

暂无

六、硬件原理

七、实验步骤

1、编写并添加自定义的驱动

1)写一个驱动GUA_IO.c(存放在“……

\BLE-CC254x-1.4.0\Projects\ble\SimpleBLECentral\Source\GUA”路径下)

//******************************************************************************                               

//name:             GUA_IO.c                  

//introduce:        香瓜自定义的IO驱动           

//author:           甜甜的大香瓜                        

//email:            897503845@qq.com            

//QQ group:         香瓜BLE之CC2541(127442605)

//shop:             opengua.taobao.com

//changetime:       2018.04.25          

//******************************************************************************          

#include "GUA_IO.h"     

//******************************************************************************                   

//name:             GUA_IO_Control                  

//introduce:        控制IO的电平               

//parameter:        nGUA_IO_Level:GUA_IO_LEVEL_HIGH or GUA_IO_LEVEL_LOW          

//return:           none               

//author:           甜甜的大香瓜                        

//email:            897503845@qq.com            

//QQ group:         香瓜BLE之CC2541(127442605)    

//shop:             opengua.taobao.com

//changetime:       2018.04.25                     

//******************************************************************************  

void GUA_IO_Control(GUA_U8 nGUA_IO_Pin, GUA_U8 nGUA_IO_Level)     

  //判断引脚

  switch(nGUA_IO_Pin)

  {

    //P10

    case GUA_IO_PIN_1_0:

    {

      //高

      if(nGUA_IO_Level == GUA_IO_LEVEL_HIGH)

      {

        P1_0 = 1;

      }

      //低

      else

      {

        P1_0 = 0;

      }  

     

      break;

    }

    //P11

    case GUA_IO_PIN_1_1:

    {

      //高

      if(nGUA_IO_Level == GUA_IO_LEVEL_HIGH)

      {

        P1_1 = 1;

      }

      //低

      else

      {

        P1_1 = 0;

      }  

     

      break;

    }   

   

    //P14

    case GUA_IO_PIN_1_4:

    {

      //高

      if(nGUA_IO_Level == GUA_IO_LEVEL_HIGH)

      {

        P1_4 = 1;

      }

      //低

      else

      {

        P1_4 = 0;

      }  

     

      break;

    }  

   

    default:break;

  }

}

//******************************************************************************                   

//name:             GUA_IO_Init                  

//introduce:        IO初始化               

//parameter:        none          

//return:           none               

//author:           甜甜的大香瓜                        

//email:            897503845@qq.com            

//QQ group:         香瓜BLE之CC2541(127442605)

//shop:             opengua.taobao.com

//changetime:       2018.04.25                      

//******************************************************************************  

void GUA_IO_Init(void)     

  //P10输出低

  P1SEL &= ~(1 << 0);                                   //P10设置为IO口   

  P1DIR |= (1 << 0);                                    //P10设置为输出   

  GUA_IO_Control(GUA_IO_PIN_1_0, GUA_IO_LEVEL_LOW);     //默认低电平 

 

  //P11输出低

  P1SEL &= ~(1 << 1);                                   //P11设置为IO口   

  P1DIR |= (1 << 1);                                    //P11设置为输出   

  GUA_IO_Control(GUA_IO_PIN_1_1, GUA_IO_LEVEL_LOW);     //默认低电平

 

  //P14输出低

  P1SEL &= ~(1 << 4);                                   //P14设置为IO口   

  P1DIR |= (1 << 4);                                    //P14设置为输出   

  GUA_IO_Control(GUA_IO_PIN_1_4, GUA_IO_LEVEL_LOW);     //默认低电平

}

2)写一个驱动头文件GUA_IO.h(存放在“……

\BLE-CC254x-1.4.0\Projects\ble\SimpleBLECentral\Source\GUA”路径下)

//******************************************************************************                               

//name:             GUA_IO.h                 

//introduce:        香瓜自定义的IO驱动的头文件           

//author:           甜甜的大香瓜                        

//email:            897503845@qq.com            

//QQ group:         香瓜BLE之CC2541(127442605)                          

//shop:             opengua.taobao.com

//changetime:       2018.04.25                     

//****************************************************************************** 

#ifndef _GUA_IO_H_   

#define _GUA_IO_H_   

   

/*********************头文件************************/

#include <ioCC2540.h>

/*********************宏定义************************/

//类型宏

#ifndef GUA_U8         

typedef unsigned char GUA_U8;         

#endif     

 

#ifndef GUA_8         

typedef signed char GUA_8;         

#endif       

        

#ifndef GUA_U16         

typedef unsigned short GUA_U16;         

#endif  

 

#ifndef GUA_16         

typedef signed short GUA_16;         

#endif          

       

#ifndef GUA_U32         

typedef unsigned long GUA_U32;         

#endif  

 

#ifndef GUA_32         

typedef signed long GUA_32;        

#endif 

 

#ifndef GUA_U64     

typedef unsigned long long GUA_U64;   

#endif 

 

#ifndef GUA_64     

typedef signed long long GUA_64;   

#endif  

   

//IO引脚     

#define GUA_IO_PIN_1_0          0   

#define GUA_IO_PIN_1_1          1    

#define GUA_IO_PIN_1_4          2

//IO电平宏     

#define GUA_IO_LEVEL_HIGH               0x01    //高电平     

#define GUA_IO_LEVEL_LOW                0x00    //低电平    

   

/*********************外部函数************************/    

extern void GUA_IO_Control(GUA_U8 nGUA_IO_Pin, GUA_U8 nGUA_IO_Level);   

extern void GUA_IO_Init(void);   

   

#endif

3)工程中添加GUA_IO.c

4)在IAR设置中添加按键驱动源文件路径

$PROJ_DIR$\..\..\SimpleBLEPeripheral\Source\GUA

2、在应用层中使用

1)初始化(SimpleBLECentral.c的SimpleBLECentral_Init中)

  //IO初始化

  GUA_IO_Init();

2)应用层代码中添加驱动头文件(SimpleBLECentral.c中)

//GUA

#include "GUA_IO.h"

//GUA

3)添加测试代码(替换SimpleBLECentral.c的simpleBLEPeripheral_HandleKeys中)

 static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )

{

  VOID shift;  // Intentionally unreferenced parameter

  //上

  if(keys & HAL_KEY_UP)

  {   

    //IO测试

    GUA_IO_Control(GUA_IO_PIN_1_0, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_1, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_4, GUA_IO_LEVEL_HIGH);    //LED亮

    

    //OLED显示

    HalLcdWriteString("UP is press", HAL_LCD_LINE_8);

  }

 

  //下

  if(keys & HAL_KEY_DOWN)

  { 

    //IO测试

    GUA_IO_Control(GUA_IO_PIN_1_0, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_1, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_4, GUA_IO_LEVEL_HIGH);    //LED亮

    

    //OLED显示   

    HalLcdWriteString("DOWN is press", HAL_LCD_LINE_8);

  }

  //左

  if(keys & HAL_KEY_LEFT)

  {

    //IO测试

    GUA_IO_Control(GUA_IO_PIN_1_0, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_1, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_4, GUA_IO_LEVEL_HIGH);    //LED亮

    

    //OLED显示   

    HalLcdWriteString("LEFT is press", HAL_LCD_LINE_8);

  }

 

  //右

  if(keys & HAL_KEY_RIGHT)

  { 

    //IO测试

    GUA_IO_Control(GUA_IO_PIN_1_0, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_1, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_4, GUA_IO_LEVEL_HIGH);    //LED亮

    

    //OLED显示   

    HalLcdWriteString("RIGHT is press", HAL_LCD_LINE_8);

  }

 

  //中

  if(keys & HAL_KEY_CENTER)

  { 

    //IO测试

    GUA_IO_Control(GUA_IO_PIN_1_0, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_1, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_4, GUA_IO_LEVEL_HIGH);    //LED亮

    

    //OLED显示   

    HalLcdWriteString("CENTER is press", HAL_LCD_LINE_8);

  }

 

  //S1

  if(keys & HAL_KEY_SW_6)

  {

    //IO测试

    GUA_IO_Control(GUA_IO_PIN_1_0, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_1, GUA_IO_LEVEL_HIGH);    //LED亮

    GUA_IO_Control(GUA_IO_PIN_1_4, GUA_IO_LEVEL_HIGH);    //LED亮

    

    //OLED显示   

    HalLcdWriteString("S1 is press", HAL_LCD_LINE_8);

  }

 

  //松开

  if(keys == 0x00)

  {

    HalLcdWriteString("key is loosen", HAL_LCD_LINE_8);

 

    GUA_IO_Control(GUA_IO_PIN_1_0, GUA_IO_LEVEL_LOW);     //LED灭 

    GUA_IO_Control(GUA_IO_PIN_1_1, GUA_IO_LEVEL_LOW);     //LED灭 

    GUA_IO_Control(GUA_IO_PIN_1_4, GUA_IO_LEVEL_LOW);     //LED灭    

  } 

}

八、注意事项

暂无

九、实验结果

仿真并全速运行。

当按下所有方向键和S1键时,香瓜开发板上的D1、D2、D3三个都会亮起(S1硬件上链接了D4,所以S1按下时D4也会同时亮起),同时OLED上会显示“XX is press”(XX根据不同按键而不同)。

当松开按键时OLED上胡显示“XX is loosen”(XX根据不同按键而不同)。

因此,实验成功。


网站公告

今日签到

点亮在社区的每一天
去签到