當(dāng)前位置:中美貿(mào)易網(wǎng) > 技術(shù)中心 > 所有分類
程控直流電源體系單片機(jī),內(nèi)部有 16K Bytes FLASH 程序存儲(chǔ)器,256 Bytes IRAM 和 256 Bytes XRAM,18 個(gè)雙向 I/O 口,5 個(gè) 16 位定時(shí)器/計(jì)數(shù)器,3 組 12 位帶死區(qū)操控互補(bǔ) PWM,1 個(gè) 8 位 PWM,2 個(gè) UART,1 個(gè) SPI,16 個(gè)外部中止,8+2 路 12 位ADC,四種體系作業(yè)形式(正常、低頻、掉電和空閑)和 16 個(gè)中止源。
在程控直流電源體系單片機(jī)上用到許多的中止。在這一款芯片上滿意滿意絕大部分的產(chǎn)品規(guī)劃。
Hc89f003具有:
? 16個(gè)中止源
? 4級(jí)中止優(yōu)先級(jí)
? 16個(gè)外部中止
要點(diǎn)來了:一般我們的程控直流電源體系單片機(jī),比方像51,比較少重映射功用的,比方stm32,他們的重映射功用對(duì)應(yīng)的引腳根本都有固定的引腳??墒?,hc89f003不一樣了,他絕大部分引腳都能夠重映射,比方P00能夠作為io口,能夠重映射為usart_tx、usart_rx、iic、spi等等等等。也就是說,規(guī)劃板子的時(shí)分不必懼怕硬件銜接過錯(cuò),只需銜接上了,根本能夠完結(jié)重映射功用。
Datasheet給出的闡明:絕大多數(shù)復(fù)用端口能夠映射到恣意 I/O 口,但 PWM 故障檢測腳、ADC 輸入、INT0-15 功用口等在外。
留意的是:多個(gè)輸出映射到一個(gè)端口上時(shí),只能有一個(gè)輸出有用。端口重映射類似中止一樣還有優(yōu)先級(jí)的。
*下面是默許的優(yōu)先級(jí):
比方:
CLKO_MAP 裝備為 0x01 挑選 P0.1 口作為 CLKO 的輸出口,T4_MAP 也裝備為 0x01,這個(gè)時(shí)分硬件會(huì)按上面的優(yōu)先級(jí),P0.1 將裝備為 CLKO 的輸出口,而 T4_MAP 的裝備無效。
當(dāng)一切的端口映射操控寄存器都不等于0x01時(shí),即一切的功用口都不挑選P0.1作為輸入輸出口,此刻這個(gè)端口的輸出就是 P0 端口數(shù)據(jù)寄存器的第 1 位。
輸入能夠裝備為多個(gè)功用從一個(gè) PAD 引腳進(jìn)入,比方:
T0_MAP 裝備為 0x23,則挑選 P2.3 作為 T0 的輸進(jìn)口,T5_MAP 也裝備為 0x23,這樣從 P2.3 端口進(jìn)入的信號(hào)一起作用于 T3 和 T5。
將 TXD 和 RXD 都裝備到一個(gè)端口上時(shí),并且此端口設(shè)置為輸出,則 TXD 和 RXD 將內(nèi)部銜接起來。
在輸入時(shí),不論端口是什么功用,讀端口數(shù)據(jù)寄存器都讀芯片引腳上值。
關(guān)于重映射功用有疑問的請(qǐng)仔細(xì)閱覽datasheet。/uploadfiles/release/preview/HC89F003_003P_SPEC_Ver1.03.pdf(畢竟是中國芯圣產(chǎn)的,datasheet閱覽起來毫無壓力,曾經(jīng)看英文的,讓我這種四級(jí)都沒過的孩子頭都大了)
HC89F003 運(yùn)用留意事項(xiàng) :(datasheet的重要闡明,運(yùn)用芯片時(shí)一定要仔細(xì)看datasheet)
1、 為確保體系的穩(wěn)定性,有必要在 VDD 和 GND 之直接一電容(容值須等于或大于 0.1μF)。(關(guān)于這點(diǎn),一般我們用芯片的時(shí)分都會(huì)這姿態(tài)做,加個(gè)電容)
2、 為確保體系的上電穩(wěn)定性,主張客戶程序在體系發(fā)生 POR 復(fù)位后進(jìn)行一次重讀代碼選項(xiàng)的軟復(fù)位操作。闡明這項(xiàng)現(xiàn)已改善(我覺得仍是很OK的能夠去下載新版的datasheet)
3、 當(dāng)運(yùn)用 ADC 模塊時(shí),不論參閱電壓挑選的是什么,體系作業(yè)電壓 VDD 有必要高于 2.7V。(參閱電壓一般為GND,這個(gè)vdd一般為3.3v)
4、 外部中止在運(yùn)用查詢方法時(shí),無法正常鏟除中止標(biāo)志位。能夠經(jīng)過先制止中止使能位再鏟除中止標(biāo)志,在完結(jié)鏟除中止標(biāo)志位后再使能外部中止來進(jìn)行正常的外部中止發(fā)生查詢。運(yùn)用中止方法時(shí),無該問題。
5、 當(dāng)用戶運(yùn)用 T3 計(jì)數(shù)時(shí)鐘源挑選端口輸入外部時(shí)鐘,應(yīng)使 TR3 和 T3CLKS[1:0]的裝備一起進(jìn)行(即用一條指令完結(jié)裝備)。(個(gè)人感覺比較奇怪,可是仍是能夠依照他的做的。他說一條指令就一條指令吧。)
介紹了那么多,是時(shí)分上點(diǎn)開箱圖了。
國慶回家前接到板子,小的讓我出人意料啊,感謝21ic小喇叭,開心。
翻開之后可見一個(gè)開發(fā)板,一個(gè)51link以及一根數(shù)據(jù)線。
初度見到51—link,有點(diǎn)小小的驚奇。哈哈哈,怪我才智不夠。。。。得好好盡力了。
翻開看看51link里邊是什么東西,一看,嚇一跳,原來是stm32f1系列芯片。
這個(gè)小板子做的仍是挺精美的,按鍵,一些必要的電路都搭載在這一小塊上面。
20pin的io口一切現(xiàn)已引出了。板載ch340驅(qū)動(dòng)電路
然后下載回來一堆材料,開干,不就是51內(nèi)核的芯片嗎,不難吧。(這是我剛開始的主意。。。我發(fā)現(xiàn)我錯(cuò)了,做智能車的時(shí)分,我就說過,當(dāng)你一開始就小看了它,你就現(xiàn)已輸了一半了。。。不過還好,我仍是能夠把它搞定的哈哈)
到芯圣電子的下載回來一堆材料,漸漸看,裝驅(qū)動(dòng),裝hc-link,然后翻開例程代碼,翻開datasheet,漸漸搞。。。
我也是先下載回來的,然后先裝hc-51link,這個(gè)比較簡單,那里也有用戶手冊(cè)。
對(duì)其他體系解說的很具體,本人是64位 win7的,比較簡單。
請(qǐng)留意:裝置在keil文件夾下。
請(qǐng)留意:裝置在keil文件夾下。
請(qǐng)留意:裝置在keil文件夾下。
重要的工作說3遍。
然后一向next就行了,主張把360啊什么殺毒的軟件退出再裝置。
然后翻開flash技術(shù)材料> F003 Library Example V1.01
這是庫函數(shù)版別的例程,很像stm32。入門玩起來不難。
F003 Register ExampleV1.01>這是寄存器版別的。我沒看。
隨意翻開一個(gè)gpio的工程:
我初度一看,哎呀,怎樣這么熟悉啊,,,,,哈哈哈
進(jìn)入體系初始化看一下,中心部分就是挑選體系時(shí)鐘
/**
* @闡明 設(shè)定體系時(shí)鐘OSC頻率,即外設(shè)時(shí)鐘(Timer UART SPI等)
* @參數(shù) OscClock :OSC時(shí)鐘設(shè)定值
* CLK_OSC_32MHZ //體系時(shí)鐘32M
* CLK_OSC_16MHZ //體系時(shí)鐘16M
* CLK_OSC_8MHZ //體系時(shí)鐘8M
* CLK_OSC_4MHZ //體系時(shí)鐘4M
* CLK_OSC_44KHZ //體系時(shí)鐘44KHZ
* @返回值 ErrorStatus :表明OSC裝備狀態(tài)
* 參閱 ErrorStatus 枚舉類.
* @注 無
*/
ErrorStatus CLK_OscClockConfig(CLK_OscClock_Typedef OscClock)
{
u8 OscClkBuf;
if(OscClock == CLK_OSC_44KHZ)
{//運(yùn)用低頻作為體系時(shí)鐘
CLKSWR = (CLKSWR&(~CLK_SYS_SEL))|CLK_OSC_44KHZ; //開低頻晶振
while((CLKSWR&CLK_SYS_STA)!=CLK_RC44KHZ_FLAG);//等候晶振起振
return SUCCESS;
}
else
{//運(yùn)用高頻作為體系時(shí)鐘
if((OscClock == CLK_OSC_32MHZ)&&(CLKDIV < CLK_CLKDIV_RESET_VALUE))return ERROR;//如果終究CPU時(shí)鐘高于20M,則裝備失利
CLKSWR = (CLKSWR&(~CLK_SYS_SEL))|CLK_RC32MHZ; //發(fā)動(dòng)內(nèi)部高頻
while((CLKSWR&CLK_SYS_STA)!=CLK_RC32MHZ_FLAG); //等候高頻晶振起振
OscClkBuf = CLKDIV;
CLKDIV = 2; //確保CPU作業(yè)在20M以下,
CLKSWR = OscClock|(CLKSWR&(~CLK_RC32M_DIV)); //設(shè)置RC32M分頻系數(shù)
CLKDIV = OscClkBuf; //恢復(fù)CPU分頻系數(shù)
return SUCCESS;
}
}
HC89F003 程控直流電源體系單片機(jī)體系時(shí)鐘有 2 種時(shí)鐘源可選:內(nèi)部高頻 RC 時(shí)鐘(32 MHz)和內(nèi)部低頻 RC 時(shí)鐘(44KHz)。其中,內(nèi)部高頻 RC 在-40°C ~+85°C 規(guī)模差錯(cuò)不超越 1%。挑選后的體系時(shí)鐘(如果挑選的是內(nèi)部高頻 RC,則經(jīng) RC32M_DIV[1:0]分頻后的時(shí)鐘)記做 osc_clk,其頻率為 F osc ,周期為 T osc ,
首要用于外設(shè)模塊,osc_clk 能夠進(jìn)行 1-255 之間恣意值的分頻,分頻后的時(shí)鐘記做 CPU 時(shí)鐘,其頻率為 F cpu ,周期為 T cpu 。
CPU 能夠運(yùn)行在 20MHz 頻率下,如果所選時(shí)鐘源頻率高于 20MHz,需求對(duì)其進(jìn)行分頻,使CPU 時(shí)鐘頻率等于或低于 20MHz。
內(nèi)部低頻 RC(RC44K)輸出的時(shí)鐘記做 wdt_clk,用于看門狗定時(shí)器的計(jì)數(shù),也能夠用于體系時(shí)鐘;內(nèi)部高頻 RC(RC32M)輸出的時(shí)鐘記做 rc32m_clk,能夠進(jìn)行 1/2/4/8 分頻。
體系初始化完結(jié)就能對(duì)芯片的引腳進(jìn)行操作了。。。。
然后就是GPIO的初始化函數(shù)了,芯圣對(duì)我們?nèi)允呛芎玫?,現(xiàn)已集成庫函數(shù)了,直接調(diào)用就OK。
一句代碼的工作:
GPIO_Init(GPIOT0,GPIO_PIN_2,GPIO_MODE_IN_PU); //將P02端口設(shè)置為上拉電阻形式
庫函數(shù)的運(yùn)用方法很簡單啊,假如我想讓P00設(shè)置為推挽輸出形式。。。
直接將 GPIO_PIN_2變?yōu)镚PIO_PIN_0。
GPIO_MODE_IN_PU變?yōu)镚PIO_MODE_OUT_PP
GPIO_Init(GPIOT0,GPIO_PIN_0, GPIO_MODE_OUT_PP); //P00設(shè)置為推挽輸出形式
/**
* @闡明 對(duì)一組端口中的一個(gè)或多個(gè)IO設(shè)置形式
* @參數(shù) GPIOx : 初始化的端口組(x:0-2)
* GPIOT0 //端口0組
* GPIOT1 //端口1組
* GPIOT2 //端口2組
* @參數(shù) GPIO_PIN : 初始化的端口號(hào)
* 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ù)。。
有愛好的能夠跳進(jìn)去看一下。不看也能夠。
翻開HC89F_GPIO.H
拉倒最下面。有g(shù)pio的函數(shù),能夠直接調(diào)用。
比方我們需求點(diǎn)亮一個(gè)led燈,調(diào)用這個(gè)函數(shù)就能夠了:
void GPIO_Write(GPIO_TypeDef GPIOx,u8 Value); //對(duì)一組端口賦值
看板子的原理圖:
LED1連在HC89F003的P11腳,那我們點(diǎn)亮他就是讓P11腳為低電平就行了。
void main(void)
{
System_init(); //體系初始化
GPIO_Init(GPIOT1,GPIO_PIN_1, GPIO_MODE_OUT_PP); //P00設(shè)置為推挽輸出形式
GPIO_Write(GPIOT1,0xFD); //設(shè)置P11腳為低電平
while(1);
}
然后下載到程控直流電源體系單片機(jī)就行了,下載設(shè)置的那里,在HC-51LINK用戶手冊(cè)那里寫的很具體。
各種裝備都寫出來了。盡管說有點(diǎn)費(fèi)事,可是,教程很具體,請(qǐng)耐心看完,并且裝備完。芯圣是一個(gè)用心做產(chǎn)品的廠家。。。
還有我發(fā)現(xiàn)一個(gè)很特別的當(dāng)?shù)兀@是曾經(jīng)我玩32/51都沒有的,那就是上拉電阻阻值巨細(xì)是能夠挑選的,可編程挑選,芯圣的產(chǎn)品又一次讓我驚奇
/**
* @闡明 設(shè)置P02端口上拉電阻阻值
* @參數(shù) Res_Value : 電阻值
* R050K //上拉電阻50K
* R100K //上拉電阻100K
* R150K //上拉電阻150K
* R300K //上拉電阻300K
* @返回值 無
* @注 無
*/
調(diào)用這個(gè)函數(shù)就能夠了:
void GPIO_P02ExternalPullConfig(GPIO_PullResValve Res_Value)
{
P0LPU = (P0LPU&(~GPIO_P02PU))|(Res_Value&GPIO_P02PU);
}
Ex:
void main(void)
{
System_init(); //體系初始化
GPIO_Init(GPIOT0,GPIO_PIN_2,GPIO_MODE_IN_PU); //將P02端口設(shè)置為上拉電阻形式
GPIO_P02ExternalPullConfig(R100K); //將P02端口上拉電阻設(shè)置為100K
while(1);
}
就能夠?qū)02端口上拉電阻設(shè)置為100K
然后介紹一下HC89f003的重映射功用:
Datasheet介紹:
讓我們看看怎樣重映射吧,我盡量簡單明了講一下。
什么是重映射:
一般的程控直流電源體系單片機(jī)上有許多I/O口,也有許多的內(nèi)置外設(shè)如I2C、ADC、ISP、USART等,為了節(jié)約引出管腳,這些內(nèi)置外設(shè)根本上是與I/O口共用管腳的,也就是I/O管腳的復(fù)用功用。許多復(fù)用內(nèi)置的外設(shè)的I/O引腳能夠經(jīng)過重映射功用,從不同的I/O管腳引出,即復(fù)用功用的引腳是可經(jīng)過程序改動(dòng)的。讀到這里信任我們都應(yīng)該了解了端口重映射的一些概念了。原理上的東西不細(xì)說了。我們能夠看手冊(cè)或許網(wǎng)上查,這方面的材料仍是許多的。
從芯圣的datasheet我們能夠知道,根本上一切的io口,都是能夠完結(jié)重映射的,那我們看看pwm輸出能映射到哪個(gè)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隨時(shí)在任何一個(gè)io口輸出。這就是一個(gè)重映射,不論你板子規(guī)劃怎樣接線,只需銜接到io口,那么就能經(jīng)過引腳重映射功用,完結(jié)你需求的功用,給規(guī)劃電路帶來方便。
void main(void)
{
System_Init(); //體系初始化
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見體系時(shí)鐘裝備的部分)
PWM3_Init(PWM3_HIGH_VALID,PWMCK_8); //PWM3高有用,時(shí)鐘為OSC時(shí)鐘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)用就能夠了。
彌補(bǔ)一點(diǎn):
一路pwm重映射只能有一個(gè)引腳輸出pwm,我們不可能完結(jié)一切的io都輸出相同的pwm波,那豈不是逆天了嘛!!還有就是重映射也有優(yōu)先級(jí)的,這是要留意 的一點(diǎn)??墒俏矣幸粋€(gè)主意,就是分時(shí)復(fù)用。這個(gè)時(shí)間段P00口做usart_tx功用,等發(fā)送完,我又能夠輸出pwm,這樣不知道行不行,僅為筆者個(gè)人主意而已。