GPIO是一种具有输入和输出功能的数字引脚,简称IO口。
IO口一般具有以下几个功能模式:
- 输入上拉:内部具有弱上拉,也就是高电平输入模式。
- 输入下拉:内部具有弱下拉,也就是低电平输入模式。
- 输入:只具有读取io口电平功能,同时引脚悬空,容易被外部影响而改变电平状态。
- 模拟输入:输入功能从数字变为模拟。
- 输出:IO口具有输出功能,高低电平的输出。
- 推挽输出:IO口利用功率管进行驱动、
- 开漏输出:IO口的低电平具有输出功能,而高电平则变为悬空,也就是隔离。
- 复用开漏输出:将IO口交由外设处理开漏输出。
- 复用推挽输出:将IO口交由外设处理推挽输出。
我们基于上一个项目所使用的demo继续。
名称 | 值 | 详细 |
PIN_MODE_OUTPUT | 0x00 | 输出 |
PIN_MODE_INPUT | 0x01 | 输入 |
PIN_MODE_INPUT_PULLUP | 0x02 | 输入上拉 |
PIN_MODE_INPUT_PULLDOWN | 0x03 | 输入下拉 |
PIN_MODE_OUTPUT_OD | 0x04 | 开漏输出 |
我们开始初始化定时器吧!
#define HWTIMER_DEV_NAME "time2" /* 定时器名称 */
/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
rt_kprintf("this is hwtimer timeout callback fucntion!n");
rt_kprintf("tick is :%d !n", rt_tick_get());
return 0;
}
static int hwtimer_sample(void)
{
rt_err_t ret = RT_EOK;
rt_hwtimerval_t timeout_s; /* 定时器超时值 */
rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */
rt_hwtimer_mode_t mode; /* 定时器模式 */
/* 查找定时器设备 */
hw_dev = rt_device_find(HWTIMER_DEV_NAME);
if (hw_dev == RT_NULL)
{
rt_kprintf("hwtimer sample run failed! can't find %s device!n", HWTIMER_DEV_NAME);
return RT_ERROR;
}
/* 以读写方式打开设备 */
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
if (ret != RT_EOK)
{
rt_kprintf("open %s device failed!n", HWTIMER_DEV_NAME);
return ret;
}
/* 设置超时回调函数 */
rt_device_set_rx_indicate(hw_dev, timeout_cb);
/* 设置模式为周期性定时器 */
mode = HWTIMER_MODE_PERIOD;
ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
if (ret != RT_EOK)
{
rt_kprintf("set mode failed! ret is :%dn", ret);
return ret;
}
/* 设置定时器超时值为5s并启动定时器 */
timeout_s.sec = 0; /* 秒 */
timeout_s.usec = 1000; /* 微秒 */
if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
{
rt_kprintf("set timeout value failedn");
return RT_ERROR;
}
/* 延时3500ms */
rt_thread_mdelay(3500);
/* 读取定时器当前值 */
rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
rt_kprintf("Read: Sec = %d, Usec = %dn", timeout_s.sec, timeout_s.usec);
return ret;
}
我们进入rtthead进行组件设置,打开time的组件和硬件使能即可!
硬件定时器设置驱动程序开启我们修改定时器回调函数的内容!
/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
//rt_kprintf("this is hwtimer timeout callback fucntion!n");
//rt_kprintf("tick is :%d !n", rt_tick_get());
ledDelay++;
if(ledDelay>=ledDelayVal){
ledDelay=0;
ledStatus=~ledStatus;
}
buttonShadeTime++;
if(buttonShadeTime>=buttonShadeTimeVal){
buttonShadeTime=0;
buttonShadeFlag=1;
}
mnbn1S++;
if(mnbn1S>=mnbn1SVal){
mnbn1S=0;
rt_kprintf("button is :%d !n", rt_pin_read(Button_PIN));
}
return 0;
}
我们添加方法:
#define LED_PIN GET_PIN(0, 0)
#define Button_PIN GET_PIN(5,0)
#define ledDelayVal 500
unsigned char buttonDownFlag=0;
unsigned char ledDownFlag=0;
unsigned short ledDelay=0;
unsigned char ledStatus=0;
#define buttonShadeTimeVal 10
unsigned char buttonShadeTime=0;
#define buttonShadeCountVal 5
unsigned char buttonShadeCount=0;
unsigned char buttonShadeFlag=0,buttonFinshFlag=0;
unsigned char buttonDownLast=0;
#define mnbn1SVal 1000
unsigned short mnbn1S=0;
#define HWTIMER_DEV_NAME "time2" /* 定时器名称 */
void ButtonShadeHandler(void){
if(!buttonShadeFlag){
return;
}
buttonShadeFlag=0;
if((!rt_pin_read(Button_PIN))==buttonDownLast){
buttonShadeCount++;
if(buttonShadeCount>=buttonShadeCountVal){
buttonShadeCount=0;
buttonFinshFlag=1;
}
}else{
buttonDownLast=!rt_pin_read(Button_PIN);
buttonShadeCount=0;
}
}
void ButtonHandler(void){
if(!buttonFinshFlag){
return;
}
buttonFinshFlag=0;
if(!buttonDownLast){
if(!buttonDownFlag){
buttonDownFlag=1;
ledDownFlag=~ledDownFlag;
}
}else{
buttonDownFlag=0;
}
}
我们修改main方法为:
int main(void)
{
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(Button_PIN, PIN_MODE_INPUT_PULLUP);
hwtimer_sample();
while(1)
{
ButtonShadeHandler();
ButtonHandler();
if(!ledDownFlag){
if(!ledStatus){
rt_pin_write(LED_PIN, PIN_HIGH);
}else{
rt_pin_write(LED_PIN, PIN_LOW);
}
}else{
rt_pin_write(LED_PIN, PIN_HIGH);
}
}
}
运行效果:
点击P5.0接口的button来实现主板的灯控制!按一下开始闪烁,按一下关。
运行效果审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
单片机
+关注
关注
6030文章
44506浏览量
632371 -
GPIO
+关注
关注
16文章
1191浏览量
51869 -
IO口
+关注
关注
3文章
169浏览量
23977 -
psoc6
+关注
关注
1文章
9浏览量
4842
发布评论请先 登录
相关推荐
PSoC3内部模拟布线和管脚选择
本文是对PSoC3内部模拟布线和管脚选择的一个简单介绍,对PSoC3芯片设计规定的IDAC和Opamp直接连接到GPIO做了详细的说明
发表于 06-09 10:05
•2225次阅读
赛普拉斯推出PSoC® 6 BLE Pioneer套件
赛普拉斯今日宣布推出PSoC® 6 BLE Pioneer套件和PSoC Creator™4.2集成开发环境(IDE),使设计人员能够利用PSoC
PSoC™ 6 CY8CPROTO-062-4343W如何配置GPIO和ADC引脚?
嗨,我正在使用 PSoC™ 6 CY8CPROTO-062-4343W,我正在尝试测量 4 线电阻式触摸屏。由于 4 线电阻式触摸屏的工作原理,与某些引脚的连接会根据您是要读取 x 轴还是 y 轴上
发表于 01-18 09:23
在PSoc4上控制GPIO时,怎样才能用modustoolBox为GPIO设置驱动模式?
在 PSoc4 上控制 GPIO 时,我想为 GPIO 设置驱动模式。
在 PSoC Creator 中,可以在 “元器件目录” 中选择并放
发表于 01-22 07:29
PSOC6 GPIO无法触发中断的原因?怎么解决?
Hi all:
我们现在的项目用PSOC6的GPIOp10.6 管脚连接其他芯片的INT管脚,通过示波器可以抓到该管脚上已经产生了500us左右的脉冲(INT脚一直高,脉冲来了会拉低500us
发表于 02-02 08:01
PSoC3_5 GPIO应用笔记
PSoC3_5 GPIO应用笔记,在这里向读者介绍PSoC 3和PSoC5个GPIO基础,并展示他们如何在设计中有效地使用技术图文并茂,挺容
发表于 11-22 16:21
按时如何在PSoC6中复用?
你好,现在我用PSoC6通过UART连接其他的板。董事会只有四条线,即VCC,GND,RX(GPIO)和Tx(GPIO)。该板使用TX作为GPIO唤醒
发表于 08-19 00:26
PSOC 4怎么在固件中控制GPIO?
根据PSoC 4“使用GPIO引脚”,文档端口4和更高(P4、P5、P6、P7等)不能用于通过DSI路由。要使用它们,必须直接控制在固件中。GPION固件我不清楚如何做到这一点,如果我
发表于 10-08 13:50
PSoC 1 使用外部微控制器对 PSoC® 1 器件编程 (HSSP)-AN44168
PSoC 1 使用外部微控制器对 PSoC® 1 器件编程 (HSSP)-AN44168
发表于 10-10 16:10
•7次下载
6 . STM32 GPIO介绍
GPIO是什么?GPIO (general purpose intput output) ,是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32 芯片的GPIO 引脚与
发表于 12-24 19:08
•2次下载
评论