GPIO是一種具有輸入和輸出功能的數(shù)字引腳,簡(jiǎn)稱IO口。
IO口一般具有以下幾個(gè)功能模式:
- 輸入上拉:內(nèi)部具有弱上拉,也就是高電平輸入模式。
- 輸入下拉:內(nèi)部具有弱下拉,也就是低電平輸入模式。
- 輸入:只具有讀取io口電平功能,同時(shí)引腳懸空,容易被外部影響而改變電平狀態(tài)。
- 模擬輸入:輸入功能從數(shù)字變?yōu)槟M。
- 輸出:IO口具有輸出功能,高低電平的輸出。
- 推挽輸出:IO口利用功率管進(jìn)行驅(qū)動(dòng)、
- 開(kāi)漏輸出:IO口的低電平具有輸出功能,而高電平則變?yōu)閼铱?,也就是隔離。
- 復(fù)用開(kāi)漏輸出:將IO口交由外設(shè)處理開(kāi)漏輸出。
- 復(fù)用推挽輸出:將IO口交由外設(shè)處理推挽輸出。
我們基于上一個(gè)項(xiàng)目所使用的demo繼續(xù)。
| 名稱 | 值 | 詳細(xì) |
| PIN_MODE_OUTPUT | 0x00 | 輸出 |
| PIN_MODE_INPUT | 0x01 | 輸入 |
| PIN_MODE_INPUT_PULLUP | 0x02 | 輸入上拉 |
| PIN_MODE_INPUT_PULLDOWN | 0x03 | 輸入下拉 |
| PIN_MODE_OUTPUT_OD | 0x04 | 開(kāi)漏輸出 |
我們開(kāi)始初始化定時(shí)器吧!
#define HWTIMER_DEV_NAME "time2" /* 定時(shí)器名稱 */
/* 定時(shí)器超時(shí)回調(diào)函數(shù) */
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; /* 定時(shí)器超時(shí)值 */
rt_device_t hw_dev = RT_NULL; /* 定時(shí)器設(shè)備句柄 */
rt_hwtimer_mode_t mode; /* 定時(shí)器模式 */
/* 查找定時(shí)器設(shè)備 */
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;
}
/* 以讀寫(xiě)方式打開(kāi)設(shè)備 */
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;
}
/* 設(shè)置超時(shí)回調(diào)函數(shù) */
rt_device_set_rx_indicate(hw_dev, timeout_cb);
/* 設(shè)置模式為周期性定時(shí)器 */
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;
}
/* 設(shè)置定時(shí)器超時(shí)值為5s并啟動(dòng)定時(shí)器 */
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;
}
/* 延時(shí)3500ms */
rt_thread_mdelay(3500);
/* 讀取定時(shí)器當(dāng)前值 */
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;
}
我們進(jìn)入rtthead進(jìn)行組件設(shè)置,打開(kāi)time的組件和硬件使能即可!
硬件定時(shí)器設(shè)置
驅(qū)動(dòng)程序開(kāi)啟
我們修改定時(shí)器回調(diào)函數(shù)的內(nèi)容!
/* 定時(shí)器超時(shí)回調(diào)函數(shù) */
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" /* 定時(shí)器名稱 */
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);
}
}
}
運(yùn)行效果:
點(diǎn)擊P5.0接口的button來(lái)實(shí)現(xiàn)主板的燈控制!按一下開(kāi)始閃爍,按一下關(guān)。
運(yùn)行效果審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
單片機(jī)
+關(guān)注
關(guān)注
6078文章
45569瀏覽量
673320 -
GPIO
+關(guān)注
關(guān)注
16文章
1333瀏覽量
56430 -
IO口
+關(guān)注
關(guān)注
3文章
170瀏覽量
25853 -
psoc6
+關(guān)注
關(guān)注
1文章
10瀏覽量
5263
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
PSoC3內(nèi)部模擬布線和管腳選擇
本文是對(duì)PSoC3內(nèi)部模擬布線和管腳選擇的一個(gè)簡(jiǎn)單介紹,對(duì)PSoC3芯片設(shè)計(jì)規(guī)定的IDAC和Opamp直接連接到GPIO做了詳細(xì)的說(shuō)明
發(fā)表于 06-09 10:05
?2803次閱讀
賽普拉斯推出PSoC? 6 BLE Pioneer套件
賽普拉斯今日宣布推出PSoC? 6 BLE Pioneer套件和PSoC Creator?4.2集成開(kāi)發(fā)環(huán)境(IDE),使設(shè)計(jì)人員能夠利用PSoC
PSoC? 6 CY8CPROTO-062-4343W如何配置GPIO和ADC引腳?
嗨,我正在使用 PSoC? 6 CY8CPROTO-062-4343W,我正在嘗試測(cè)量 4 線電阻式觸摸屏。由于 4 線電阻式觸摸屏的工作原理,與某些引腳的連接會(huì)根據(jù)您是要讀取 x 軸還是 y 軸上
發(fā)表于 01-18 09:23
在PSoc4上控制GPIO時(shí),怎樣才能用modustoolBox為GPIO設(shè)置驅(qū)動(dòng)模式?
在 PSoc4 上控制 GPIO 時(shí),我想為 GPIO 設(shè)置驅(qū)動(dòng)模式。
在 PSoC Creator 中,可以在 “元器件目錄” 中選擇并放
發(fā)表于 01-22 07:29
PSOC6 GPIO無(wú)法觸發(fā)中斷的原因?怎么解決?
Hi all:
我們現(xiàn)在的項(xiàng)目用PSOC6的GPIOp10.6 管腳連接其他芯片的INT管腳,通過(guò)示波器可以抓到該管腳上已經(jīng)產(chǎn)生了500us左右的脈沖(INT腳一直高,脈沖來(lái)了會(huì)拉低500us
發(fā)表于 02-02 08:01
PSoC3_5 GPIO應(yīng)用筆記
PSoC3_5 GPIO應(yīng)用筆記,在這里向讀者介紹PSoC 3和PSoC5個(gè)GPIO基礎(chǔ),并展示他們?nèi)绾卧谠O(shè)計(jì)中有效地使用技術(shù)圖文并茂,挺容
發(fā)表于 11-22 16:21
按時(shí)如何在PSoC6中復(fù)用?
你好,現(xiàn)在我用PSoC6通過(guò)UART連接其他的板。董事會(huì)只有四條線,即VCC,GND,RX(GPIO)和Tx(GPIO)。該板使用TX作為GPIO喚醒
發(fā)表于 08-19 00:26
PSOC5 GPIO奇怪行為
在我的項(xiàng)目中,我使用PSoC5FTK。GPIO奇怪的行為已經(jīng)被檢測(cè)到。兩個(gè)子系統(tǒng),兩個(gè)問(wèn)題。第一個(gè)紅外接收器,連接到P5〔1〕。在接收周期(RC6協(xié)議)中存在雪崩中斷Req,1000和更多。G
發(fā)表于 03-14 13:25
PSOC 4怎么在固件中控制GPIO?
根據(jù)PSoC 4“使用GPIO引腳”,文檔端口4和更高(P4、P5、P6、P7等)不能用于通過(guò)DSI路由。要使用它們,必須直接控制在固件中。GPION固件我不清楚如何做到這一點(diǎn),如果我
發(fā)表于 10-08 13:50
PSoC 1 使用外部微控制器對(duì) PSoC? 1 器件編程 (HSSP)-AN44168
PSoC 1 使用外部微控制器對(duì) PSoC? 1 器件編程 (HSSP)-AN44168
發(fā)表于 10-10 16:10
?7次下載
PSOC6-GPIO的控制
評(píng)論