程控直流电源体系单片机,内部有 16K Bytes FLASH 程序存储器,256 Bytes IRAM 和 256 Bytes XRAM,18 个双向 I/O 口,5 个 16 位定时器/计数器,3 组 12 位带死区操控互补 PWM,1 个 8 位 PWM,2 个 UART,1 个 SPI,16 个外部中止,8+2 路 12 位ADC,四种体系作业形式(正常、低频、掉电和空闲)和 16 个中止源。
在程控直流电源体系单片机上用到许多的中止。在这一款芯片上满意满意绝大部分的产品规划。
Hc89f003具有:
16个中止源
4级中止优先级
16个外部中止
要点来了:一般我们的程控直流电源体系单片机,比方像51,比较少重映射功用的,比方stm32,他们的重映射功用对应的引脚根本都有固定的引脚。可是,hc89f003不一样了,他绝大部分引脚都能够重映射,比方P00能够作为io口,能够重映射为usart_tx、usart_rx、iic、spi等等等等。也就是说,规划板子的时分不必惧怕硬件衔接过错,只需衔接上了,根本能够完结重映射功用。
Datasheet给出的阐明:绝大多数复用端口能够映射到恣意 I/O 口,但 PWM 故障检测脚、ADC 输入、INT0-15 功用口等在外。
留意的是:多个输出映射到一个端口上时,只能有一个输出有用。端口重映射类似中止一样还有优先级的。
*下面是默许的优先级:
比方:
CLKO_MAP 装备为 0x01 挑选 P0.1 口作为 CLKO 的输出口,T4_MAP 也装备为 0x01,这个时分硬件会按上面的优先级,P0.1 将装备为 CLKO 的输出口,而 T4_MAP 的装备无效。
当一切的端口映射操控寄存器都不等于0x01时,即一切的功用口都不挑选P0.1作为输入输出口,此刻这个端口的输出就是 P0 端口数据寄存器的第 1 位。
输入能够装备为多个功用从一个 PAD 引脚进入,比方:
T0_MAP 装备为 0x23,则挑选 P2.3 作为 T0 的输进口,T5_MAP 也装备为 0x23,这样从 P2.3 端口进入的信号一起作用于 T3 和 T5。
将 TXD 和 RXD 都装备到一个端口上时,并且此端口设置为输出,则 TXD 和 RXD 将内部衔接起来。
在输入时,不论端口是什么功用,读端口数据寄存器都读芯片引脚上值。
关于重映射功用有疑问的请仔细阅览官方datasheet。http://www.holychip.cn/uploadfiles/release/preview/HC89F003_003P_SPEC_Ver1.03.pdf(毕竟是中国芯圣产的,datasheet阅览起来毫无压力,曾经看英文的,让我这种四级都没过的孩子头都大了)
HC89F003 运用留意事项 :(官方datasheet的重要阐明,运用芯片时一定要仔细看datasheet)
1、 为确保体系的稳定性,有必要在 VDD 和 GND 之直接一电容(容值须等于或大于 0.1μF)。(关于这点,一般我们用芯片的时分都会这姿态做,加个电容)
2、 为确保体系的上电稳定性,主张客户程序在体系发生 POR 复位后进行一次重读代码选项的软复位操作。官方阐明这项现已改善(我觉得仍是很OK的能够去官网下载新版的datasheet)
3、 当运用 ADC 模块时,不论参阅电压挑选的是什么,体系作业电压 VDD 有必要高于 2.7V。(参阅电压一般为GND,这个vdd一般为3.3v)
4、 外部中止在运用查询方法时,无法正常铲除中止标志位。能够经过先制止中止使能位再铲除中止标志,在完结铲除中止标志位后再使能外部中止来进行正常的外部中止发生查询。运用中止方法时,无该问题。
5、 当用户运用 T3 计数时钟源挑选端口输入外部时钟,应使 TR3 和 T3CLKS[1:0]的装备一起进行(即用一条指令完结装备)。(个人感觉比较奇怪,可是仍是能够依照他的做的。他说一条指令就一条指令吧。)
介绍了那么多,是时分上点开箱图了。
国庆回家前接到板子,小的让我出人意料啊,感谢21ic小喇叭,开心。
翻开之后可见一个开发板,一个51link以及一根数据线。
初度见到51—link,有点小小的惊奇。哈哈哈,怪我才智不够。。。。得好好尽力了。
翻开看看51link里边是什么东西,一看,吓一跳,原来是stm32f1系列芯片。
这个小板子做的仍是挺精美的,按键,一些必要的电路都搭载在这一小块上面。
20pin的io口一切现已引出了。板载ch340驱动电路
然后下载回来一堆材料,开干,不就是51内核的芯片吗,不难吧。(这是我刚开始的主意。。。我发现我错了,做智能车的时分,我就说过,当你一开始就小看了它,你就现已输了一半了。。。不过还好,我仍是能够把它搞定的哈哈)
到芯圣电子的官网下载回来一堆材料,渐渐看,装驱动,装hc-link,然后翻开例程代码,翻开datasheet,渐渐搞。。。
我也是先下载回来的,然后先装hc-51link,这个比较简单,那里也有用户手册。
对其他体系解说的很具体,本人是64位 win7的,比较简单。
请留意:装置在keil文件夹下。
请留意:装置在keil文件夹下。
请留意:装置在keil文件夹下。
重要的工作说3遍。
然后一向next就行了,主张把360啊什么杀毒的软件退出再装置。
然后翻开flash技术材料> F003 Library Example V1.01
这是库函数版别的例程,很像stm32。入门玩起来不难。
F003 Register ExampleV1.01>这是寄存器版别的。我没看。
随意翻开一个gpio的工程:
我初度一看,哎呀,怎样这么熟悉啊,,,,,哈哈哈
进入体系初始化看一下,中心部分就是挑选体系时钟
/**
* @阐明 设定体系时钟OSC频率,即外设时钟(Timer UART SPI等)
* @参数 OscClock :OSC时钟设定值
* CLK_OSC_32MHZ //体系时钟32M
* CLK_OSC_16MHZ //体系时钟16M
* CLK_OSC_8MHZ //体系时钟8M
* CLK_OSC_4MHZ //体系时钟4M
* CLK_OSC_44KHZ //体系时钟44KHZ
* @返回值 ErrorStatus :表明OSC装备状态
* 参阅 ErrorStatus 枚举类.
* @注 无
*/
ErrorStatus CLK_OscClockConfig(CLK_OscClock_Typedef OscClock)
{
u8 OscClkBuf;
if(OscClock == CLK_OSC_44KHZ)
{//运用低频作为体系时钟
CLKSWR = (CLKSWR&(~CLK_SYS_SEL))|CLK_OSC_44KHZ; //开低频晶振
while((CLKSWR&CLK_SYS_STA)!=CLK_RC44KHZ_FLAG);//等候晶振起振
return SUCCESS;
}
else
{//运用高频作为体系时钟
if((OscClock == CLK_OSC_32MHZ)&&(CLKDIV < CLK_CLKDIV_RESET_VALUE))return ERROR;//如果终究CPU时钟高于20M,则装备失利
CLKSWR = (CLKSWR&(~CLK_SYS_SEL))|CLK_RC32MHZ; //发动内部高频
while((CLKSWR&CLK_SYS_STA)!=CLK_RC32MHZ_FLAG); //等候高频晶振起振
OscClkBuf = CLKDIV;
CLKDIV = 2; //确保CPU作业在20M以下,
CLKSWR = OscClock|(CLKSWR&(~CLK_RC32M_DIV)); //设置RC32M分频系数
CLKDIV = OscClkBuf; //恢复CPU分频系数
return SUCCESS;
}
}
HC89F003 程控直流电源体系单片机体系时钟有 2 种时钟源可选:内部高频 RC 时钟(32 MHz)和内部低频 RC 时钟(44KHz)。其中,内部高频 RC 在-40°C ~+85°C 规模差错不超越 1%。挑选后的体系时钟(如果挑选的是内部高频 RC,则经 RC32M_DIV[1:0]分频后的时钟)记做 osc_clk,其频率为 F osc ,周期为 T osc ,
首要用于外设模块,osc_clk 能够进行 1-255 之间恣意值的分频,分频后的时钟记做 CPU 时钟,其频率为 F cpu ,周期为 T cpu 。
CPU 最高能够运行在 20MHz 频率下,如果所选时钟源频率高于 20MHz,需求对其进行分频,使CPU 时钟频率等于或低于 20MHz。
内部低频 RC(RC44K)输出的时钟记做 wdt_clk,用于看门狗定时器的计数,也能够用于体系时钟;内部高频 RC(RC32M)输出的时钟记做 rc32m_clk,能够进行 1/2/4/8 分频。
体系初始化完结就能对芯片的引脚进行操作了。。。。
然后就是GPIO的初始化函数了,芯圣对我们仍是很好的,现已集成库函数了,直接调用就OK。
一句代码的工作:
GPIO_Init(GPIOT0,GPIO_PIN_2,GPIO_MODE_IN_PU); //将P02端口设置为上拉电阻形式
库函数的运用方法很简单啊,假如我想让P00设置为推挽输出形式。。。
直接将 GPIO_PIN_2变为GPIO_PIN_0。
GPIO_MODE_IN_PU变为GPIO_MODE_OUT_PP
GPIO_Init(GPIOT0,GPIO_PIN_0, GPIO_MODE_OUT_PP); //P00设置为推挽输出形式
/**
* @阐明 对一组端口中的一个或多个IO设置形式
* @参数 GPIOx : 初始化的端口组(x:0-2)
* GPIOT0 //端口0组
* GPIOT1 //端口1组
* GPIOT2 //端口2组
* @参数 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
* @参数 GPIO_Mode : 初始化形式
* GPIO_MODE_IN //数字输入
* GPIO_MODE_IN_PD //带下拉输入
* GPIO_MODE_IN_PU //带上拉输入
* GPIO_MODE_IN_AN //模仿输入
* GPIO_MODE_IN_SMT //数字输入 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)的原函数。。
有爱好的能够跳进去看一下。不看也能够。
翻开HC89F_GPIO.H
拉倒最下面。有gpio的函数,能够直接调用。
比方我们需求点亮一个led灯,调用这个函数就能够了:
void GPIO_Write(GPIO_TypeDef GPIOx,u8 Value); //对一组端口赋值
看板子的原理图:
LED1连在HC89F003的P11脚,那我们点亮他就是让P11脚为低电平就行了。
void main(void)
{
System_init(); //体系初始化
GPIO_Init(GPIOT1,GPIO_PIN_1, GPIO_MODE_OUT_PP); //P00设置为推挽输出形式
GPIO_Write(GPIOT1,0xFD); //设置P11脚为低电平
while(1);
}
然后下载到程控直流电源体系单片机就行了,下载设置的那里,在HC-51LINK用户手册那里写的很具体。
各种装备都写出来了。尽管说有点费事,可是,教程很具体,请耐心看完,并且装备完。芯圣是一个用心做产品的厂家。。。
还有我发现一个很特别的当地,这是曾经我玩32/51都没有的,那就是上拉电阻阻值巨细是能够挑选的,可编程挑选,芯圣的产品又一次让我惊奇
/**
* @阐明 设置P02端口上拉电阻阻值
* @参数 Res_Value : 电阻值
* R050K //上拉电阻50K
* R100K //上拉电阻100K
* R150K //上拉电阻150K
* R300K //上拉电阻300K
* @返回值 无
* @注 无
*/
调用这个函数就能够了:
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端口设置为上拉电阻形式
GPIO_P02ExternalPullConfig(R100K); //将P02端口上拉电阻设置为100K
while(1);
}
就能够将P02端口上拉电阻设置为100K
然后介绍一下HC89f003的重映射功用:
Datasheet介绍:
让我们看看怎样重映射吧,我尽量简单明了讲一下。
什么是重映射:
一般的程控直流电源体系单片机上有许多I/O口,也有许多的内置外设如I2C、ADC、ISP、USART等,为了节约引出管脚,这些内置外设根本上是与I/O口共用管脚的,也就是I/O管脚的复用功用。许多复用内置的外设的I/O引脚能够经过重映射功用,从不同的I/O管脚引出,即复用功用的引脚是可经过程序改动的。读到这里信任我们都应该了解了端口重映射的一些概念了。原理上的东西不细说了。我们能够看手册或许网上查,这方面的材料仍是许多的。
从芯圣的datasheet我们能够知道,根本上一切的io口,都是能够完结重映射的,那我们看看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
这是从芯圣例程找出来的,我数了一下,一路pwm随时在任何一个io口输出。这就是一个重映射,不论你板子规划怎样接线,只需衔接到io口,那么就能经过引脚重映射功用,完结你需求的功用,给规划电路带来方便。
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分频系数) (Fosc见体系时钟装备的部分)
PWM3_Init(PWM3_HIGH_VALID,PWMCK_8); //PWM3高有用,时钟为OSC时钟8分频
PWM3_PeriodConfig(0xff); //PWM3周期为0xFF
PWM3_DutyCycleConfig(0x55); //PWM3的占空比设置
PWM3_Cmd(ENABLE); //PWM3使能
while(1);
}
中心函数:PWM3_PinRemapConfig(PWM3_OutPin_TypeDef OutPin); //PWM3输出管脚映射
直接调用就能够了。
弥补一点:
一路pwm重映射只能有一个引脚输出pwm,我们不可能完结一切的io都输出相同的pwm波,那岂不是逆天了嘛!!还有就是重映射也有优先级的,这是要留意 的一点。可是我有一个主意,就是分时复用。这个时间段P00口做usart_tx功用,等发送完,我又能够输出pwm,这样不知道行不行,仅为笔者个人主意而已。