STC8A8K64D4-SOFTWARE-LIB库函数没有引出引脚切换功能
引脚切换功能在单片机外设使用过程中是非常重要的,特别在引脚数量有限,功能引脚切换是非常重要的。
- STC8A8K64D4-SOFTWARE-LIB库函数版本信息:2021.06.10
- 15 位的增强型PWM驱动源文件:STC8A_PWM15bit.c
在STC8A_PWM15bit.c驱动源文件中没有包含引脚切换功能的相关配置代码,默认的就是:00
//========================================================================
// 函数: u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
// 描述: PWM通道控制寄存器设置.
// 参数: PWM_id: PWM通道序号. 取值 0~7
// pwm_eno: pwm输出使能, 0设为GPIO, 1设为PWM输出.
// pwm_ini: pwm输出端的初始电平, 0为低电平, 1为高电平.
// pwm_eni: pwm通道中断使能控制, 0为关闭PWM中断, 1为使能PWM中断.
// pwm_ent2i: pwm通道第二个触发点中断使能控制, 0为关闭PWM第二个触发点中断, 1为使能PWM第二个触发点中断.
// pwm_ent1i: pwm通道第一个触发点中断使能控制, 0为关闭PWM第一个触发点中断, 1为使能PWM第一个触发点中断.
// 返回: 成功返回 SUCCESS, 错误返回 FAIL.
// 版本: V1.0, 2020-09-22
//========================================================================
u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
{
u8 xdata *pPWMxCR;
if(PWM_id > PWM15_7) return FAIL; //id错误
if(pwm_eno > 1) return FAIL; //输出使能错误
if(pwm_ini > 1) return FAIL; //输出端的初始电平错误
if(pwm_eni > 1) return FAIL; //中断使能控制错误
if(pwm_ent2i > 1) return FAIL; //第二个触发点中断使能控制错误
if(pwm_ent1i > 1) return FAIL; //第一个触发点中断使能控制错误
EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
pPWMxCR = (u8 *)PWMxCR;
*pPWMxCR = (pwm_eno << 7) | (pwm_ini << 6) | (pwm_eni << 2)| (pwm_ent2i << 1)| pwm_ent1i;
EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
return SUCCESS;
}手册上明明有PWM引脚切换寄存器,在该封装库函数中就没有涉及进来。
- 如下调整:
//========================================================================
// 函数: u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
// 描述: PWM通道控制寄存器设置.
// 参数: PWM_id: PWM通道序号. 取值 0~7
// pwm_eno: pwm输出使能, 0设为GPIO, 1设为PWM输出.BIT.7
// pwm_ini: pwm输出端的初始电平, 0为低电平, 1为高电平..BIT.6
// pwm_eni: pwm通道中断使能控制, 0为关闭PWM中断, 1为使能PWM中断..BIT.2
// pwm_ent2i: pwm通道第二个触发点中断使能控制, 0为关闭PWM第二个触发点中断, 1为使能PWM第二个触发点中断..BIT.1
// pwm_ent1i: pwm通道第一个触发点中断使能控制, 0为关闭PWM第一个触发点中断, 1为使能PWM第一个触发点中断..BIT.0
// 返回: 成功返回 SUCCESS, 错误返回 FAIL.
// 版本: V1.0, 2020-09-22
//========================================================================
u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
{
u8 xdata *pPWMxCR;
if(PWM_id > PWM15_7) return FAIL; //id错误
if(pwm_eno > 1) return FAIL; //输出使能错误
if(pwm_ini > 1) return FAIL; //输出端的初始电平错误
if(pwm_eni > 1) return FAIL; //中断使能控制错误
if(pwm_ent2i > 1) return FAIL; //第二个触发点中断使能控制错误
if(pwm_ent1i > 1) return FAIL; //第一个触发点中断使能控制错误
EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
pPWMxCR = (u8 *)PWMxCR;
*pPWMxCR = (pwm_eno << 7) | (pwm_ini << 6) |(pwm_eni << 2)| (pwm_ent2i << 1)| pwm_ent1i;
*pPWMxCR |= (1<<3);//引脚组切换:(1<<3)->P1端口;(0<<3)->P2端口;(1<<4)->P6端口
EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
return SUCCESS;
}或者在main主函数初始化配置完成PWM15_config();后另外单独配置,在main.c中添加相应的寄存器地址宏:
<blockquote>#define PWM0CR (*(unsigned char volatile xdata *)0xff14)<span style="white-space:pre"> </span>/* PWM0CR */
#define PWM0CR (*(unsigned char volatile xdata *)0xff14) /* PWM0CR */
#define PWM1CR (*(unsigned char volatile xdata *)0xff1c) /* PWM1CR */
#define PWM2CR (*(unsigned char volatile xdata *)0xff24) /* PWM2CR */
#define PWM3CR (*(unsigned char volatile xdata *)0xff2c) /* PWM3CR */
#define PWM4CR (*(unsigned char volatile xdata *)0xff34) /* PWM4CR */
#define PWM5CR (*(unsigned char volatile xdata *)0xff3c) /* PWM5CR */
#define PWM6CR (*(unsigned char volatile xdata *)0xff44) /* PWM6CR */
#define PWM7CR (*(unsigned char volatile xdata *)0xff4c) /* PWM7CR */
PWM15_config();
P_SW2 = 0x80;
// PWM0CR |= 0x00; //PWM0/P2.0
PWM0CR |= 0x08; //PWM0_2/P1.0
//PWM0CR |= 0x10; //PWM0_3/P6.0
// PWM1CR |= 0x00; //PWM1/P2.1
PWM1CR |= 0x08; //PWM1_2/P1.1
//PWM1CR = 0x10; //PWM1_3/P6.1
// PWM2CR |= 0x00; //PWM2/P2.2
PWM2CR |= 0x08; //PWM2_2/P1.2
//PWM2CR |= 0x10; //PWM2_3/P6.2
// PWM3CR |= 0x00; //PWM3/P2.3
PWM3CR |= 0x08; //PWM3_2/P1.3
//PWM3CR = 0x10; //PWM3_3/P6.3
PWM4CR |= 0x00; //PWM4/P2.4
//PWM4CR |= 0x08; //PWM4_2/P1.4
//PWM4CR |= 0x10; //PWM4_3/P6.4
PWM5CR |= 0x00; //PWM5/P2.5
//PWM5CR = 0x08; //PWM5_2/P1.5
//PWM5CR = 0x10; //PWM5_3/P6.5
PWM6CR |= 0x00; //PWM6/P2.6
//PWM6CR |= 0x08; //PWM6_2/P1.6
//PWM6CR |= 0x10; //PWM6_3/P6.6
PWM7CR |= 0x00; //PWM7/P2.7
//PWM7CR |= 0x08; //PWM7_2/P1.7
//PWM7CR |= 0x10; //PWM7_3/P6.7
P_SW2 = 0x00;
参考一下,STC8A8K64D4-45I-LQFP64的函数库例程 库函数中独立分开了,一个独立单独的头文件定义了全部切换功能的宏。#include "STC8A_Switch.h"
//========================================================================
// 功能脚切换设置
//========================================================================
#defineUART1_SW(Pin) P_SW1 = (P_SW1 & 0x3F) | (Pin << 6)
#definePCA_SW(Pin) P_SW1 = (P_SW1 & 0xCF) | (Pin << 4)
#defineSPI_SW(Pin) P_SW1 = (P_SW1 & 0xF3) | (Pin << 2)
#defineI2C_SW(Pin) P_SW2 = (P_SW2 & 0xCF) | (Pin << 4)
#defineCOMP_SW(Pin) P_SW2 = (P_SW2 & 0xF7) | (Pin << 3)
#defineUART4_SW(Pin) P_SW2 = (P_SW2 & 0xFB) | (Pin << 2)
#defineUART3_SW(Pin) P_SW2 = (P_SW2 & 0xFD) | (Pin << 1)
#defineUART2_SW(Pin) P_SW2 = (P_SW2 & 0xFE) | (Pin)
#definePWM15_PWM0_SW(Pin) {EAXSFR(); PWM0CR = (PWM0CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM1_SW(Pin) {EAXSFR(); PWM1CR = (PWM1CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM2_SW(Pin) {EAXSFR(); PWM2CR = (PWM2CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM3_SW(Pin) {EAXSFR(); PWM3CR = (PWM3CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM4_SW(Pin) {EAXSFR(); PWM4CR = (PWM4CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM5_SW(Pin) {EAXSFR(); PWM5CR = (PWM5CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM6_SW(Pin) {EAXSFR(); PWM6CR = (PWM6CR & ~0x18) | (Pin << 3); EAXRAM();}
#definePWM15_PWM7_SW(Pin) {EAXSFR(); PWM7CR = (PWM7CR & ~0x18) | (Pin << 3); EAXRAM();}
#defineMCLKO_SW(Pin) {EAXSFR(); MCLKOCR = (MCLKOCR & 0x7F) | (Pin << 7); EAXRAM();}
#defineT3T4SEL_SW(Pin) {EAXSFR(); T3T4PIN = (T3T4PIN & 0xFE) | (Pin); EAXRAM();}
#defineLCM_CTRL_SW(Pin) {EAXSFR(); LCMIFCFG2 = (LCMIFCFG2 & ~0x60) | (Pin << 5); EAXRAM();}
#defineLCM_DATA_SW(Pin) {EAXSFR(); LCMIFCFG = (LCMIFCFG & ~0x0C) | (Pin << 2); EAXRAM();}
STC爱好者 发表于 2023-5-15 11:34
参考一下,STC8A8K64D4-45I-LQFP64的函数库例程
好的,谢谢!
页:
[1]