原理圖
通用設(shè)計(jì)
使用PIC和AVR器件時(shí),您通常需要獲取該特定器件的數(shù)據(jù)表,并了解如何使用外設(shè)。有時(shí),一個(gè)PIC上的外設(shè)可能與另一個(gè)PIC上的外設(shè)不同,因此不能簡(jiǎn)單地將代碼從一個(gè)PIC復(fù)制并粘貼到另一個(gè)PIC。但是,STM8完全不同,因?yàn)樗蠸TM8設(shè)備都使用通用布局而不是具有唯一配置。這意味著為一個(gè)STM8設(shè)計(jì)的代碼可以直接復(fù)制并粘貼到不同的控制器,它仍然可以工作(假設(shè)新設(shè)備具有所需的外設(shè))。
一個(gè)典型的例子是UART外設(shè)。 STM8器件最多可以有三個(gè)UART端口(1,2和3),一個(gè)STM8器件上的UART1與另一個(gè)STM8器件上的UART1相同。但是,各個(gè)STM8器件的數(shù)據(jù)表中沒(méi)有太多關(guān)于如何使用外設(shè)的信息,因此在使用任何STM8器件時(shí),您需要使用數(shù)據(jù)表;包含引腳分布的器件專(zhuān)用數(shù)據(jù)表,以及包含器件系列細(xì)節(jié)的另一個(gè)數(shù)據(jù)表。
對(duì)于我們的STM8項(xiàng)目,我們將利用這兩個(gè)數(shù)據(jù)表中的信息:
STM8S103F3器件數(shù)據(jù)表(PDF) - 包含基本細(xì)節(jié)和引腳信息
STM8系列器件概述(PDF) - 包含詳細(xì)的外設(shè)和CPU信息
如果您想知道設(shè)備上的引腳位置,請(qǐng)使用設(shè)備數(shù)據(jù)表,如果您想了解如何使用外圍設(shè)備,請(qǐng)使用系列設(shè)備概述表。
GPIO
雖然開(kāi)發(fā)板允許我們對(duì)STM8進(jìn)行編程微控制器和CPU功能,除非我們可以將微型連接到其他設(shè)備和外部電路,否則它是毫無(wú)意義的。為了能夠執(zhí)行此類(lèi)任務(wù),使用通用輸入輸出或GPIO。 GPIO是器件上的引腳,可以電連接到外部電路,以控制它們或從中讀取信息。雖然可以讀取模擬數(shù)據(jù),但本教程僅關(guān)注數(shù)字值(打開(kāi)或關(guān)閉的數(shù)字值)。
說(shuō)到GPIO,有四個(gè)主要寄存器:
DDR - 數(shù)據(jù)方向寄存器
ODR - 輸出數(shù)據(jù)寄存器
IDR - 輸入數(shù)據(jù)寄存器
CR1和CR2 - 控制寄存器
圖片由RM0016參考手冊(cè)提供。
訪問(wèn)寄存器和位
訪問(wèn)STM8上的GPIO有點(diǎn)類(lèi)似于AVR ,除了STM8S.h使用結(jié)構(gòu)。例如,STM8S上的PORT B有自己的結(jié)構(gòu),稱(chēng)為GPIOB,內(nèi)部是控制它的所有寄存器(如DDR,ODR,IDR等)。訪問(wèn)這些寄存器可以如下所示:
GPIOB→xxx其中xxx是有問(wèn)題的寄存器
數(shù)據(jù)方向寄存器(DDR)
與PIC和AVR器件一樣,STM8使用數(shù)據(jù)方向寄存器來(lái)確定引腳是輸入還是輸出。這些寄存器為8位寬,直接對(duì)應(yīng)I/O端口上的引腳。例如,PORT B最多可以有8個(gè)引腳,B0對(duì)應(yīng)端口B DDR寄存器中的第0位,而B(niǎo)7對(duì)應(yīng)端口B DDR寄存器中的第7位。
將引腳配置為輸入時(shí),需要清零相應(yīng)的DDR位(0),對(duì)于輸出,需要設(shè)置該位(1)。因此,比方說(shuō),我們只想將B0和B1配置為輸入,同時(shí)將其余部分保持為輸出。我們可以執(zhí)行以下操作:
GPIOB→DDR = 0xFC;
或
GPIOB→DDR = 0b11111100;
控制寄存器CR1和CR2
CR1和CR2是控制寄存器,可配置為提供不同的I/O功能。例如,它們可以配置為允許在各個(gè)引腳上產(chǎn)生中斷,并可用于創(chuàng)建具有推/拉功能的輸出驅(qū)動(dòng)器。與其他寄存器一樣,CR1和CR2寄存器中的每個(gè)位對(duì)應(yīng)一個(gè)特定的引腳。因此,例如,CR1和CR2中的位0用于端口的引腳0。下表(摘自數(shù)據(jù)表)演示了CR1和CR2寄存器的用途。
輸出數(shù)據(jù)寄存器( ODR)
輸出數(shù)據(jù)寄存器用于輸出數(shù)字值(1和0)到一個(gè)端口。可以寫(xiě)入各個(gè)位(使用位掩碼),也可以更改整個(gè)寄存器。將1位寫(xiě)入ODR位將使相應(yīng)的引腳導(dǎo)通,寫(xiě)入0將使相應(yīng)的引腳關(guān)閉。下面的第一個(gè)示例用于打開(kāi)端口上的所有引腳,第二個(gè)示例關(guān)閉所有引腳。
GPIOB→ODR = 0xFF;或GPIOB→ODR = 0b11111111;//打開(kāi)所有引腳
GPIOB→ODR = 0x00;或GPIOB→ODR = 0b00000000;//關(guān)閉所有引腳
輸入數(shù)據(jù)寄存器(IDR)
IDR寄存器可用于讀取端口引腳上的數(shù)字值。這些值可以是(1)或關(guān)閉(0),IDR寄存器的第0位對(duì)應(yīng)引腳0,而第7位對(duì)應(yīng)引腳7.
pinRead = GPIOB→IDR;
有用的位操作
因?yàn)槲?O端口由各個(gè)引腳組成,與整個(gè)寄存器相比,訪問(wèn)個(gè)別位更有幫助。但是,個(gè)別位不可用(類(lèi)似于AVR設(shè)備),因此我們需要使用一些位操作。由于這已經(jīng)在AVR系列中進(jìn)行了解釋?zhuān)覀冎粫?huì)看一些非常有用的宏。
這些非常有用的宏有助于擺脫不可讀的位掩碼:
#define setBit(reg,bit)(reg = reg |(1 《
#define clearBit(reg,bit)(reg = reg&?(1 《
#define toggleBit(reg,bit)(reg = reg ^(1 《
將此代碼復(fù)制并粘貼到代碼頂部,然后,您可以像函數(shù)一樣使用它們,而不必編寫(xiě)位操作代碼。那么讓我們看一些如何在代碼中使用它們的示例!
setBit(GPIOB→DDR,3);//將端口B上的第3位設(shè)置為輸出
clearBit(GPIOA→ODR,4);//關(guān)閉端口a上的輸出位4
toggleBit(GPIOC→ODR) ,5);//在端口c上切換第5位
然而,讀取引腳使用一個(gè)簡(jiǎn)單的位操作,包括使用AND來(lái)屏蔽我們不需要的所有位,然后測(cè)試查看結(jié)果是否為0。
if( (GPIOB→IDR & 0b00000001) )
{
// Code here executes IF bit 0 is on
}
if( !(GPIOB→IDR & 0b00000001) )
{
// Code here executes IF bit 0 is off
}
基本配置示例
在本例中,我們將引腳A1配置為輸入,B5配置為輸出,每當(dāng)按下開(kāi)關(guān)(連接到A1)時(shí),LED連接到B5將切換。這里我們也利用內(nèi)部上拉,因此我們的按鈕不需要上拉電阻工作(通過(guò)設(shè)置CR1中的位來(lái)完成)。
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include “stm8s.h”
#define setBit(reg, bit) (reg = reg | (1 《《 bit))
#define clearBit(reg, bit) (reg = reg & ~(1 《《 bit))
#define toggleBit(reg, bit) (reg = reg ^ (1 《《 bit))
void simpleDelay(void);
main()
{
GPIOA-》DDR = 0x00; // Make all pins on PORT A inputs
GPIOA-》CR1 = 0xFF; // Ensure that internal pull up is on
GPIOA-》CR2 = 0x00; // Ensure that interrupts are turned off
GPIOB-》DDR = 0xFF;
while (1)
{
// Testing bit 1 (bit 0 would be 1)
if( ?。℅PIOA-》IDR & 0x02) )
{
toggleBit(GPIOB-》ODR, 5);
simpleDelay();
}
}
}
// Simple delay used for debouncing
void simpleDelay(void)
{
unsigned int i, j;
for(i = 0; i 《 1000; i ++)
{
for(j=0; j 《 10; j ++)
{
}
}
}
-
STM8
+關(guān)注
關(guān)注
18文章
392瀏覽量
56832 -
GPIO
+關(guān)注
關(guān)注
16文章
1205瀏覽量
52164
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論