1 產(chǎn)品簡介
HC89F003是一顆采用高頻低功耗 CMOS 工藝設(shè)計開發(fā)的增強型 8 位單片機,內(nèi)部有 16K Bytes FLASH 程序存儲器,256 Bytes IRAM 和 256 Bytes XRAM,18 個雙向 I/O 口,5 個 16 位定時器/計數(shù)器,3 組 12 位帶死區(qū)控制互補 PWM,1 個 8 位 PWM,2 個 UART,1 個 SPI,16 個外部中斷,8+2 路 12 位ADC,四種系統(tǒng)工作模式(正常、低頻、掉電和空閑)和 16 個中斷源。

在單片機上用到很多的中斷。在這一款芯片上足夠滿足絕大部分的產(chǎn)品設(shè)計。
Hc89f003具有:
? 16個中斷源
? 4級中斷優(yōu)先級
? 16個外部中斷
重點來了:一般我們的單片機,比如像51,比較少重映射功能的,比如stm32,他們的重映射功能對應(yīng)的引腳基本都有固定的引腳。但是,hc89f003不一樣了,他絕大部分引腳都可以重映射,比如P00可以作為io口,可以重映射為usart_tx、usart_rx、iic、spi等等等等。也就是說,設(shè)計板子的時候不用害怕硬件連接錯誤,只要連接上了,基本可以實現(xiàn)重映射功能。
Datasheet給出的說明:絕大多數(shù)復(fù)用端口可以映射到任意 I/O 口,但 PWM 故障檢測腳、ADC 輸入、INT0-15 功能口等除外。
注意的是:多個輸出映射到一個端口上時,只能有一個輸出有效。端口重映射類似中斷一樣還有優(yōu)先級的。
*下面是默認的優(yōu)先級:

比如:
CLKO_MAP 配置為 0x01 選擇 P0.1 口作為 CLKO 的輸出口,T4_MAP 也配置為 0x01,這個時候硬件會按上面的優(yōu)先級,P0.1 將配置為 CLKO 的輸出口,而 T4_MAP 的配置無效。
當(dāng)所有的端口映射控制寄存器都不等于0x01時,即所有的功能口都不選擇P0.1作為輸入輸出口,此時這個端口的輸出就是 P0 端口數(shù)據(jù)寄存器的第 1 位。
輸入可以配置為多個功能從一個 PAD 引腳進入,比如:
T0_MAP 配置為 0x23,則選擇 P2.3 作為 T0 的輸入口,T5_MAP 也配置為 0x23,這樣從 P2.3 端口進入的信號同時作用于 T3 和 T5。
將 TXD 和 RXD 都配置到一個端口上時,并且此端口設(shè)置為輸出,則 TXD 和 RXD 將內(nèi)部連接起來。
在輸入時,無論端口是什么功能,讀端口數(shù)據(jù)寄存器都讀芯片引腳上值。
對于重映射功能有疑問的請仔細閱讀官方datasheet。http://www.holychip.cn/uploadfiles/release/preview/HC89F003_003P_SPEC_Ver1.03.pdf(畢竟是中國芯圣產(chǎn)的,datasheet閱讀起來毫無壓力,以前看英文的,讓我這種四級都沒過的孩子頭都大了)
HC89F003 使用注意事項 :(官方datasheet的重要說明,使用芯片時一定要認真看datasheet)
1、 為保證系統(tǒng)的穩(wěn)定性,必須在 VDD 和 GND 之間接一電容(容值須等于或大于 0.1μF)。(對于這點,一般我們用芯片的時候都會這樣子做,加個電容)
2、為保證系統(tǒng)的上電穩(wěn)定性,建議客戶程序在系統(tǒng)產(chǎn)生 POR 復(fù)位后進行一次重讀代碼選項的軟復(fù)位操作。官方說明這項已經(jīng)改進(我覺得還是很OK的可以去官網(wǎng)下載新版的datasheet)
3、 當(dāng)使用 ADC 模塊時,不論參考電壓選擇的是什么,系統(tǒng)工作電壓 VDD 必須高于 2.7V。(參考電壓一般為GND,這個vdd一般為3.3v)
4、 外部中斷在使用查詢方式時,無法正常清除中斷標(biāo)志位。可以通過先禁止中斷使能位再清除中斷標(biāo)志,在完成清除中斷標(biāo)志位后再使能外部中斷來進行正常的外部中斷產(chǎn)生查詢。使用中斷方式時,無該問題。
5、 當(dāng)用戶使用 T3 計數(shù)時鐘源選擇端口輸入外部時鐘,應(yīng)使 TR3 和 T3CLKS[1:0]的配置同時進行(即用一條指令完成配置)。(個人感覺比較奇怪,但是還是可以按照他的做的。他說一條指令就一條指令吧。)
介紹了那么多,是時候上點開箱圖了。
國慶回家前接到板子,小的讓我出乎意料啊,感謝21ic小喇叭,開心。
打開之后可見一個開發(fā)板,一個51link以及一根數(shù)據(jù)線。
初次見到51—link,有點小小的驚訝。哈哈哈,怪我見識不夠。。。。得好好努力了。
打開看看51link里面是什么東西,一看,嚇一跳,原來是stm32f1系列芯片。
這個小板子做的還是挺精致的,按鍵,一些必要的電路都搭載在這一小塊上面。
20pin的io口所有已經(jīng)引出了。板載ch340驅(qū)動電路
然后下載回來一堆資料,開干,不就是51內(nèi)核的芯片嗎,不難吧。(這是我剛開始的想法。。。我發(fā)現(xiàn)我錯了,做智能車的時候,我就說過,當(dāng)你一開始就輕視了它,你就已經(jīng)輸了一半了。。。不過還好,我還是可以把它搞定的哈哈)
到芯圣電子的官網(wǎng)下載回來一堆資料,慢慢看,裝驅(qū)動,裝hc-link,然后打開例程代碼,打開datasheet,慢慢搞。。。

我也是先下載回來的,然后先裝hc-51link,這個比較簡單,那里也有用戶手冊。
對其他系統(tǒng)講解的很詳細,本人是64位 win7的,比較簡單。



請注意:安裝在keil文件夾下。
請注意:安裝在keil文件夾下。
請注意:安裝在keil文件夾下。
重要的事情說3遍。

然后一直next就行了,建議把360啊什么殺毒的軟件退出再安裝。
然后打開flash技術(shù)資料> F003 Library Example V1.01
這是庫函數(shù)版本的例程,很像stm32。入門玩起來不難。
F003 Register ExampleV1.01>這是寄存器版本的。我沒看。

隨便打開一個gpio的工程:

我初次一看,哎呀,怎么這么熟悉啊,,,,,哈哈哈
進入系統(tǒng)初始化看一下,核心部分就是選擇系統(tǒng)時鐘
/**
* @說明 設(shè)定系統(tǒng)時鐘OSC頻率,即外設(shè)時鐘(Timer UART SPI等)
* @參數(shù) OscClock :OSC時鐘設(shè)定值
* CLK_OSC_32MHZ //系統(tǒng)時鐘32M
* CLK_OSC_16MHZ //系統(tǒng)時鐘16M
* CLK_OSC_8MHZ //系統(tǒng)時鐘8M
* CLK_OSC_4MHZ //系統(tǒng)時鐘4M
* CLK_OSC_44KHZ //系統(tǒng)時鐘44KHZ
* @返回值 ErrorStatus :表明OSC配置狀態(tài)
* 參考 ErrorStatus 枚舉類.
* @注 無
*/
ErrorStatus CLK_OscClockConfig(CLK_OscClock_Typedef OscClock)
{
u8 OscClkBuf;
if(OscClock == CLK_OSC_44KHZ)
{//使用低頻作為系統(tǒng)時鐘
CLKSWR = (CLKSWR&(~CLK_SYS_SEL))|CLK_OSC_44KHZ; //開低頻晶振
while((CLKSWR&CLK_SYS_STA)!=CLK_RC44KHZ_FLAG);//等待晶振起振return SUCCESS;
}
else
{//使用高頻作為系統(tǒng)時鐘
if((OscClock == CLK_OSC_32MHZ)&&(CLKDIV < CLK_CLKDIV_RESET_VALUE))return ERROR;//如果最終CPU時鐘高于20M,則配置失敗
CLKSWR = (CLKSWR&(~CLK_SYS_SEL))|CLK_RC32MHZ; //啟動內(nèi)部高頻
while((CLKSWR&CLK_SYS_STA)!=CLK_RC32MHZ_FLAG); //等待高頻晶振起振
OscClkBuf = CLKDIV;
CLKDIV = 2; //保證CPU工作在20M以下,
CLKSWR = OscClock|(CLKSWR&(~CLK_RC32M_DIV)); //設(shè)置RC32M分頻系數(shù)
CLKDIV = OscClkBuf; //恢復(fù)CPU分頻系數(shù)
return SUCCESS;
}
}
HC89F003 單片機系統(tǒng)時鐘有 2 種時鐘源可選:內(nèi)部高頻 RC 時鐘(32 MHz)和內(nèi)部低頻 RC 時鐘(44KHz)。其中,內(nèi)部高頻 RC 在-40°C ~+85°C 范圍誤差不超過 1%。選擇后的系統(tǒng)時鐘(如果選擇的是內(nèi)部高頻 RC,則經(jīng) RC32M_DIV[1:0]分頻后的時鐘)記做 osc_clk,其頻率為 F osc ,周期為 T osc ,
主要用于外設(shè)模塊,osc_clk 可以進行 1-255 之間任意值的分頻,分頻后的時鐘記做 CPU 時鐘,其頻率為 F cpu ,周期為 T cpu 。
CPU 最高可以運行在 20MHz 頻率下,如果所選時鐘源頻率高于 20MHz,需要對其進行分頻,使CPU 時鐘頻率等于或低于 20MHz。
內(nèi)部低頻 RC(RC44K)輸出的時鐘記做 wdt_clk,用于看門狗定時器的計數(shù),也可以用于系統(tǒng)時鐘;內(nèi)部高頻 RC(RC32M)輸出的時鐘記做 rc32m_clk,可以進行 1/2/4/8 分頻。

系統(tǒng)初始化完成就能對芯片的引腳進行操作了。。。。
然后就是GPIO的初始化函數(shù)了,芯圣對我們還是很好的,已經(jīng)集成庫函數(shù)了,直接調(diào)用就OK。
一句代碼的事情:
GPIO_Init(GPIOT0,GPIO_PIN_2,GPIO_MODE_IN_PU); //將P02端口設(shè)置為上拉電阻模式
庫函數(shù)的使用方法很簡單啊,假如我想讓P00設(shè)置為推挽輸出模式。。。
直接將 GPIO_PIN_2變?yōu)?/span>GPIO_PIN_0。
GPIO_MODE_IN_PU變?yōu)?/span>GPIO_MODE_OUT_PP
GPIO_Init(GPIOT0,GPIO_PIN_0, GPIO_MODE_OUT_PP); //P00設(shè)置為推挽輸出模式
/**
* @說明 對一組端口中的一個或多個IO設(shè)置模式
* @參數(shù) GPIOx : 初始化的端口組(x:0-2)
* GPIOT0 //端口0組
* GPIOT1 //端口1組
* GPIOT2 //端口2組
* @參數(shù) GPIO_PIN : 初始化的端口號
* GPIO_PIN_0 //選擇端口0
* GPIO_PIN_1 //選擇端口1
* GPIO_PIN_2 //選擇端口2
* GPIO_PIN_3 //選擇端口3
* GPIO_PIN_4 //選擇端口4* GPIO_PIN_5 //選擇端口5
* GPIO_PIN_6 //選擇端口6
* GPIO_PIN_7 //選擇端口7
* @參數(shù) GPIO_Mode : 初始化模式
* GPIO_MODE_IN //數(shù)字輸入
* GPIO_MODE_IN_PD //帶下拉輸入
* GPIO_MODE_IN_PU //帶上拉輸入
* GPIO_MODE_IN_AN //模擬輸入
* GPIO_MODE_IN_SMT //數(shù)字輸入 SMT
* GPIO_MODE_IN_PD_SMT //帶下拉輸入 SMT
* GPIO_MODE_IN_PU_SMT //帶上拉輸入 SMT
* GPIO_MODE_IN_AN_PU_PD //模擬輸入上下拉同時打開,B版以后芯片支持
* GPIO_MODE_OUT_PP //推挽輸出
* GPIO_MODE_OUT_OD //開漏輸出
* GPIO_MODE_OUT_OD_PU //開漏帶上拉輸出
* @返回值 無
* @注 無
*/
void GPIO_Init(GPIO_TypeDef GPIOx,GPIO_Pin_TypeDef GPIO_PIN,GPIO_Mode_TypeDef GPIO_Mode)
{
u8 i;
u8 xdata *gpioset;
gpioset = 0xFF00 | ((GPIOx - 1)<<3);
for(i=0;i<8;i++){
if((GPIOx == GPIOT1)&&(i>1))break;
if(GPIO_PIN&0x01){
*(gpioset+i/2) = ((*(gpioset+i/2)) & (0xF0 >> ((i%2)*0x04))) | (GPIO_Mode << ((i%2)*0x04));
}
GPIO_PIN >>= 1;
}
}
上面是void GPIO_Init(GPIO_TypeDef GPIOx,GPIO_Pin_TypeDef GPIO_PIN,GPIO_Mode_TypeDef GPIO_Mode)的原函數(shù)。。
有興趣的可以跳進去看一下。不看也可以。
打開HC89F_GPIO.H
拉倒最下面。有g(shù)pio的函數(shù),可以直接調(diào)用。

比如我們需要點亮一個led燈,調(diào)用這個函數(shù)就可以了:
void GPIO_Write(GPIO_TypeDef GPIOx,u8 Value); //對一組端口賦值
看板子的原理圖:


LED1連在HC89F003的P11腳,那我們點亮他就是讓P11腳為低電平就行了。
void main(void)
{
System_init(); //系統(tǒng)初始化
GPIO_Init(GPIOT1,GPIO_PIN_1, GPIO_MODE_OUT_PP); //P00設(shè)置為推挽輸出模式
GPIO_Write(GPIOT1,0xFD); //設(shè)置P11腳為低電平
while(1);
}

然后下載到單片機就行了,下載設(shè)置的那里,在HC-51LINK用戶手冊那里寫的很詳細。

各種配置都寫出來了。雖然說有點麻煩,但是,教程很詳細,請耐心看完,并且配置完。芯圣是一個用心做產(chǎn)品的廠家。。。
還有我發(fā)現(xiàn)一個很特別的地方,這是以前我玩32/51都沒有的,那就是上拉電阻阻值大小是可以選擇的,可編程選擇,芯圣的產(chǎn)品又一次讓我驚訝
/**
* @說明 設(shè)置P02端口上拉電阻阻值
* @參數(shù) Res_Value : 電阻值
* R050K //上拉電阻50K
* R100K //上拉電阻100K
* R150K //上拉電阻150K
* R300K //上拉電阻300K
* @返回值 無
* @注 無
*/
調(diào)用這個函數(shù)就可以了:
void GPIO_P02ExternalPullConfig(GPIO_PullResValve Res_Value)
{
P0LPU = (P0LPU&(~GPIO_P02PU))|(Res_Value&GPIO_P02PU);
}
Ex:
void main(void)
{
System_init(); //系統(tǒng)初始化
GPIO_Init(GPIOT0,GPIO_PIN_2,GPIO_MODE_IN_PU); //將P02端口設(shè)置為上拉電阻模式
GPIO_P02ExternalPullConfig(R100K); //將P02端口上拉電阻設(shè)置為100K
while(1);
}
就可以將P02端口上拉電阻設(shè)置為100K
然后介紹一下HC89f003的重映射功能:
Datasheet介紹:
讓我們看看怎么重映射吧,我盡量簡單明了講一下。
什么是重映射:
一般的單片機上有很多I/O口,也有很多的內(nèi)置外設(shè)如I2C、ADC、ISP、USART等,為了節(jié)省引出管腳,這些內(nèi)置外設(shè)基本上是與I/O口共用管腳的,也就是I/O管腳的復(fù)用功能。很多復(fù)用內(nèi)置的外設(shè)的I/O引腳可以通過重映射功能,從不同的I/O管腳引出,即復(fù)用功能的引腳是可通過程序改變的。讀到這里相信大家都應(yīng)該了解了端口重映射的一些概念了。原理上的東西不細說了。大家可以看手冊或者網(wǎng)上查,這方面的資料還是很多的。
從芯圣的datasheet我們可以知道,基本上所有的io口,都是可以實現(xiàn)重映射的,那我們看看pwm輸出能映射到哪個io口呢,
PWM3_OUTPin_P00 = (u8)0x00, //PWM3輸出端口為P00
PWM3_OUTPin_P01 = (u8)0x01, //PWM3輸出端口為P01
PWM3_OUTPin_P02 = (u8)0x02, //PWM3輸出端口為P02
PWM3_OUTPin_P03 = (u8)0x03, //PWM3輸出端口為P03
PWM3_OUTPin_P04 = (u8)0x04, //PWM3輸出端口為P04
PWM3_OUTPin_P05 = (u8)0x05, //PWM3輸出端口為P05
PWM3_OUTPin_P06 = (u8)0x06, //PWM3輸出端口為P06
PWM3_OUTPin_P07 = (u8)0x07, //PWM3輸出端口為P07
PWM3_OUTPin_P10 = (u8)0x10, //PWM3輸出端口為P10
PWM3_OUTPin_P11 = (u8)0x11, //PWM3輸出端口為P11
PWM3_OUTPin_P20 = (u8)0x20, //PWM3輸出端口為P20
PWM3_OUTPin_P21 = (u8)0x21, //PWM3輸出端口為P21
PWM3_OUTPin_P22 = (u8)0x22, //PWM3輸出端口為P22
PWM3_OUTPin_P23 = (u8)0x23, //PWM3輸出端口為P23
PWM3_OUTPin_P24 = (u8)0x24, //PWM3輸出端口為P24
PWM3_OUTPin_P25 = (u8)0x25, //PWM3輸出端口為P25
PWM3_OUTPin_P26 = (u8)0x26, //PWM3輸出端口為P26
PWM3_OUTPin_P27 = (u8)0x27, //PWM3輸出端口為P27
這是從芯圣例程找出來的,我數(shù)了一下,一路pwm隨時在任何一個io口輸出。這就是一個重映射,不管你板子設(shè)計怎么接線,只要連接到io口,那么就能通過引腳重映射功能,實現(xiàn)你需要的功能,給設(shè)計電路帶來方便。
void main(void)
{
System_Init(); //系統(tǒng)初始化
GPIO_Init(GPIOT0,GPIO_PIN_1,GPIO_MODE_OUT_PP); //P01推挽輸出
PWM3_PinRemapConfig(PWM3_OUTPin_P01); //PWM3輸出映射P01口
PWM3_OutPutCmd(ENABLE); //輸出使能
//周期計算 = 0xff / (Fosc / PWM分頻系數(shù)) (Fosc見系統(tǒng)時鐘配置的部分)
PWM3_Init(PWM3_HIGH_VALID,PWMCK_8); //PWM3高有效,時鐘為OSC時鐘8分頻
PWM3_PeriodConfig(0xff); //PWM3周期為0xFF
PWM3_DutyCycleConfig(0x55); //PWM3的占空比設(shè)置
PWM3_Cmd(ENABLE); //PWM3使能
while(1);
}
核心函數(shù):PWM3_PinRemapConfig(PWM3_OutPin_TypeDef OutPin); //PWM3輸出管腳映射
直接調(diào)用就可以了。
原文標(biāo)題:單片機引腳連錯了?沒關(guān)系重映射一下就好了
文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
STM32單片機常用的引腳及功能
MCS-51單片機引腳功能
單片機中volatile定義的作用詳解
8051單片機各種引腳的用法及功能解析
stm32單片機引腳介紹及功能
詳解51系列單片機引腳及功能
單片機引腳的定義與功能詳解
評論