HC32F120F6TA模拟PWM实现呼吸灯

HC32F120F6TA模拟PWM实现呼吸灯

定时器TIMERB1配置

void timerb2_Config(void)
{
	//中断结构体定义
	stc_irq_regi_config_t stcIrqRegiConf;
	//timerb结构体定义
   stc_timerb_init_t stcTimerbInit;
	//初始化系统时钟
	SystemClockConfig2();
	//使能TIME1时钟
	CLK_FcgPeriphClockCmd(CLK_FCG_TIMB2 ,Enable);
	
	//用默认值填充定时器结构体
	TIMERB_StructInit(&stcTimerbInit);
	
	//TimerB计数时钟分频选择
	stcTimerbInit.u16ClkDiv =TIMERB_CLKDIV_DIV512;
	//TimerB计数方向    向上计数
	stcTimerbInit.u16CntDir =TIMERB_CNT_UP;
	//TimerB计数模式  锯齿波计数模式 
	stcTimerbInit.u16CntMode =TIMERB_SAWTOOTH_WAVE;
	//TIMERB硬件触发清除计数条件  硬件清除无效
	stcTimerbInit.u16HwClearCondition =TIMERB_HWCLEAR_INVALID;
	//TIMERB硬件触发倒计时条件 硬件倒计时无效
	stcTimerbInit.u16HwDownCondition =TIMERB_HWDOWN_INVALID;
	//TIMERB硬件触发启动计数条件  硬件启动无效
	stcTimerbInit.u16HwStartCondition =TIMERB_HWSTART_INVALID;
	//TIMERB硬件触发计数条件   硬件计数无效
	stcTimerbInit.u16HwUpCondition =TIMERB_HWUP_INVALID;
	//TimerB计数溢出时停止/继续计数
	stcTimerbInit.u16OverflowAction =TIMERB_OVERFLOW_COUNT;
	//TimerB周期值
	stcTimerbInit.u16PeriodVal =20000000/5120000;   //20000000/512一秒   20000000/5120000 一百纳秒 
	//启用/禁用同步启动功能    禁用同步功能
	stcTimerbInit.u16SynStartState =TIMERB_SYNC_START_DISABLE;
	
	//初始化TimerB基本功能
	TIMERB_Init(M0P_TMRB2, &stcTimerbInit);
	//启用指定的TimerB溢出中断
    TIMERB_IntCmd(M0P_TMRB2, TIMERB_IT_OVF, Enable);
	
	//外围中断号
	stcIrqRegiConf.enIntSrc =INT_TMRB_2_OVF;
	//外围设备的IRQ类型
	stcIrqRegiConf.enIRQn =Int022_IRQn;
	//对应外设IRQ的回调功能
	stcIrqRegiConf.pfnCallback =&Timerb2ddUnitOvfIrqCallback;
	//IRQ注册功能函数
	INTC_IrqRegistration(&stcIrqRegiConf);
	//清除待处理中断
    NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
	//设置中断优先级
    NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_02);
	//启用中断
    NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
	//启动M0P_TMRB1
	TIMERB_Start(M0P_TMRB2);
}

中断函数

static void TimerbOddUnitOvfIrqCallback(void)
{
	static int k = 0, flag = 0,PWM=0;
	
	k ++;
	if(t == 100)
		t = 0;
	
	if(n == 100)//呼吸周期两秒
	{
		n = 0;
		if (flag == 0)
		{
			PWM ++;
			if(PWM == 100)
				flag = 1;
		}
		else if (flag == 1)
		{
			PWM --;
			if(PWM == 0)
				flag = 0;
		}
	}

	if(t < PWM)
	{
		GPIO_ResetPins(GPIO_PORT_2,GPIO_PIN_5);
	  GPIO_ResetPins(GPIO_PORT_2,GPIO_PIN_6);
	  GPIO_ResetPins(GPIO_PORT_2,GPIO_PIN_7);
	}
	else
	{
		GPIO_SetPins(GPIO_PORT_2,GPIO_PIN_5);
	  GPIO_SetPins(GPIO_PORT_2,GPIO_PIN_6);
	  GPIO_SetPins(GPIO_PORT_2,GPIO_PIN_7);
	}

  //清除TimerB溢出标志
  TIMERB_ClearFlag(M0P_TMRB1, TIMERB_FLAG_OVF);
}

LED初始化

void LED_Config(void)
{
	//定义GPIO的结构体 
	stc_gpio_init_t stcGpioInit;
	//用默认值填充每stcGpioInit
	//GPIO_StructInit(&stcGpioInit);
	//设置GPIO引脚为输出模式
	stcGpioInit.u16PinMode =PIN_MODE_OUT ;
	//设置GPIO输出为低电平
	stcGpioInit.u16PinState =PIN_STATE_RESET ;
	//关闭引脚外部中断
	stcGpioInit.u16ExInt =PIN_EXINT_ON ;
	//关闭引脚反向
	stcGpioInit.u16Invert =PIN_INVERT_OFF ;
	//不选择引脚输出锁存器
	stcGpioInit.u16Latch =PIN_LATCH_OFF ;
	//引脚驱动能力选择为正常
	stcGpioInit.u16PinDrv =PIN_NORMAL_DRV;
	//引脚输入类型选择
	stcGpioInit.u16PinIType =PIN_ITYPE_SMT;
	//引脚输出类型选择
	stcGpioInit.u16PinOType =PIN_OTYPE_CMOS;
	//关闭上拉电阻
	stcGpioInit.u16PullUp =PIN_PU_OFF ;
	//初始化GPIO结构体 及选定引脚
	GPIO_Init(GPIO_PORT_2,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,&stcGpioInit);
	//指定引脚输出使能/禁用  
	//GPIO_OE(GPIO_PORT_2,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,Enable); 
}

系统时钟初始化

static void SystemClockConfig2(void)
{
	
  stc_clk_xtal_init_t stcXTALInit;

  /* Configure XTAL */
	//XTAL的新状态
  stcXTALInit.u8XtalState = CLK_XTAL_ON;
	//模式选择
  stcXTALInit.u8XtalMode = CLK_XTALMODE_OSC;
	//XTAL驱动能力
  stcXTALInit.u8XtalDrv = CLK_XTALDRV_HIGH;
	//XTAL超级驱动器打开或关闭
  stcXTALInit.u8XtalSupDrv = CLK_XTAL_SUPDRV_OFF;
	//XTAL稳定时间选择
  stcXTALInit.u8XtalStb = CLK_XTALSTB_8;

  //初始化XTAL时钟
  CLK_XTALInit(&stcXTALInit);

//  //设置时钟分频
  //CLK_SetSysclkDiv(CLK_SYSCLK_DIV2);
  //将系统时钟从HRC(默认)切换到XTAL
  CLK_SetSysclkSrc(CLK_SYSCLKSOURCE_XTAL);
}

主函数

int32_t main(void)
{
	LED_Config();
	timerb1_Config();
    while (1)
    {
    
    }

原理图

在这里插入图片描述在这里插入图片描述
参考文档

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值