单片机学习练习--使用定时器输出PWM波

本文介绍了如何在TM4C123GH6PM单片机上利用定时器0和定时器1生成两个独立的PWM波形,分别配置为不同占空比,并通过GPIOB的输出引脚B4和B6展示。系统时钟设置为40MHz,详细步骤包括配置GPIO、启用定时器、设置PWM模式、配置定时器参数和中断处理。
摘要由CSDN通过智能技术生成

任务要求:使用定时器输出两路不同占空比的PWM波形。

#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"

int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);//5分频,使用PLL,外部晶振16M,system时钟源选择 main osc。系统时钟40MHZ
    
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//使能GPIOF外设
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    //亮灯检测,判断程序是否正常运行
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
	GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_6|GPIO_PIN_4);
	GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0);
	SysCtlDelay(10000000);
    GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,0x02);  // 开发板红色LED亮   1<<1
    SysCtlDelay(10000000);
	GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,0x00);
	SysCtlDelay(10000000);
	
	SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);//使能TIMER0
	SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);//使能TIMER0
	  
	//配置PWM模式
    TimerConfigure(TIMER0_BASE,TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_PWM);
	TimerConfigure(TIMER1_BASE,TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_PWM);

	GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_6|GPIO_PIN_4);//设置B4和B6为输出
	GPIOPinConfigure(GPIO_PB6_T0CCP0);
	GPIOPinConfigure(GPIO_PB4_T1CCP0);    
    GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_6|GPIO_PIN_4);
	   
	//A定时器,高电平有效
    TimerControlLevel(TIMER0_BASE,TIMER_A,false);
    TimerControlLevel(TIMER1_BASE,TIMER_A,false);
	
    TimerLoadSet(TIMER0_BASE, TIMER_A, 0xC350);//装载值(频率)
    TimerMatchSet(TIMER0_BASE, TIMER_A, 0x1388);//匹配值(占空比)
    TimerLoadSet(TIMER1_BASE, TIMER_A, 0xC350);//装载值
    TimerMatchSet(TIMER1_BASE, TIMER_A, 0x61A8);//匹配值
	
    IntEnable(INT_TIMER0A); //使能TIMER0A
	IntEnable(INT_TIMER1A);
    TimerIntEnable(TIMER0_BASE, TIMER_CAPA_MATCH);//使能TIMER0A的捕获事件触发中断 
	TimerIntEnable(TIMER1_BASE, TIMER_CAPA_MATCH);
	IntMasterEnable();
    TimerEnable(TIMER0_BASE, TIMER_A); //TIMER0A开始计数,当计数值等于TimerLoadSet,触发中断
	TimerEnable(TIMER1_BASE, TIMER_A);

	while(1)
    {
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值