本帖最后由 caijie001 于 2017-10-16 23:54 编辑
库函数的使用方法很简单啊,假如我想让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_TypeDefGPIOx,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_TypeDefGPIO_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_PullResValveRes_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口,那么就能通过引脚重映射功能,实现你需要的功能,给设计电路带来方便。 voidmain(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,这样不知道行不行,哈哈我的想法而已。
补充:资料来源: 1):HC89F003技术资料 (出处: 21ic电子技术论坛) 2):上海芯圣电子股份有限公司http://www.holychip.cn/kfgj/index_14.aspx?lcid=14
|