本文最后修改时间: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)完整开源资料下载地址(电脑端打开):
7)香瓜CC2541开发板套件购买:
四、实验前提
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根据不同按键而不同)。
因此,实验成功。