- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2024-03-28 18:39:50
注册会员
- 积分
- 51
|
本帖最后由 qhshen 于 2023-10-25 21:05 编辑
使用STC8A8K64D4芯片,用官方给的库函数和官方的历程,仅仅加入切换输出引脚操作,但是实际无法进行PWM输出引脚的切换,只能在P2口输出,不能切换到P6口
//代码如下
#include "config.h"
#include "STC8A_GPIO.h"
#include "STC8A_Delay.h"
#include "STC8A_PWM15bit.h"
/************* 功能说明 ***************
输出4路PWM信号:
PWM0 输出"呼吸灯"效果PWM.
PWM1 循环输出1秒钟PWM,1秒钟高电平,1秒钟低电平.
PWM2,PWM3 固定PWM.
下载时, 选择时钟 24MHz (用户可在"config.h"修改频率).
******************************************/
/************* 本地常量声明 **************/
#define PWM15_PWM0_SW(Pin) {EAXSFR(); PWM0CR = (PWM0CR & ~0x18) | (Pin << 3); EAXRAM();}
#define PWM15_PWM1_SW(Pin) {EAXSFR(); PWM1CR = (PWM1CR & ~0x18) | (Pin << 3); EAXRAM();}
#define PWM15_PWM2_SW(Pin) {EAXSFR(); PWM2CR = (PWM2CR & ~0x18) | (Pin << 3); EAXRAM();}
#define PWM15_PWM3_SW(Pin) {EAXSFR(); PWM3CR = (PWM3CR & ~0x18) | (Pin << 3); EAXRAM();}
#define PWM15_PWM4_SW(Pin) {EAXSFR(); PWM4CR = (PWM4CR & ~0x18) | (Pin << 3); EAXRAM();}
#define PWM15_PWM5_SW(Pin) {EAXSFR(); PWM5CR = (PWM5CR & ~0x18) | (Pin << 3); EAXRAM();}
#define PWM15_PWM6_SW(Pin) {EAXSFR(); PWM6CR = (PWM6CR & ~0x18) | (Pin << 3); EAXRAM();}
#define PWM15_PWM7_SW(Pin) {EAXSFR(); PWM7CR = (PWM7CR & ~0x18) | (Pin << 3); EAXRAM();}
#define PWM15_SW_P2 0
#define PWM15_SW_P1 1
#define PWM15_SW_P6 2
/************* 本地变量声明 **************/
u16 pwm0,pwm1;
bit B_PWM0_Dir; //方向, 0为+, 1为-.
/************* 本地函数声明 **************/
/************* 外部函数和变量声明 *****************/
/******************** IO口配置 ********************/
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
GPIO_InitStructure.Pin = GPIO_Pin_All; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P6,&GPIO_InitStructure); //初始化 //###经提醒已经改到P6,但是还是不输出###
//加入引脚切换操作,将PWM输出从P2切换到P6
PWM15_PWM0_SW(PWM15_SW_P6);
PWM15_PWM1_SW(PWM15_SW_P6);
PWM15_PWM2_SW(PWM15_SW_P6);
PWM15_PWM3_SW(PWM15_SW_P6);
}
/******************** PWM15配置 ********************/
void PWM15_config(void)
{
PWM15_InitTypeDef PWM15_InitStructure;
PWM15_InitStructure.PWM_Enable = ENABLE; //PWM使能, ENABLE, DISABLE
PWM15_InitStructure.PWM_Period = 0x1000; //PWM周期, 0~0x7fff
PWM15_InitStructure.PWM_Clock_Sel = PWM_CLK_SYS; //时钟源选择, PWM_CLK_SYS, PWM_CLK_TM2
PWM15_InitStructure.PWM_Clock_PS = 0; //系统时钟分频参数(PS+1分频), 0~15
PWM15_InitStructure.PWM_CInt = DISABLE; //计数器归零中断使能, ENABLE, DISABLE
PWM15_InitStructure.PWM_Counter = ENABLE; //计数器使能, ENABLE, DISABLE
PWM15_Init(&PWM15_InitStructure);
PWM15Duty(PWM15_0,0x000,0x200); //PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM15_1,0x200,0xc00); //PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM15_2,0x400,0x800); //PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM15_3,0x800,0xe00); //PWM_ID, 输出低电平位置, 输出高电平位置
PWMChannelCtrl(PWM15_0,ENABLE,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM15_1,ENABLE,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM15_2,ENABLE,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM15_3,ENABLE,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
}
/******************** task A **************************/
void main(void)
{
GPIO_config();
PWM15_config();
while (1)
{
}
}
|
|