单片机交流
直播中

王健

7年用户 849经验值
私信 关注
[问答]

如何利用TM4C123G单片机点亮LED灯?

如何利用TM4C123G单片机点亮LED灯?

回帖(1)

张怡

2021-10-20 11:16:46
#include
#include
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"


void Timer0A_init(uint32_t fre);
void Timer0IntHandler(void);
void RGB_GPIO_Init(void);

uint16_t Timer0A_cnt = 0;


int main(void)
{
    //5分频,使用PLL,外部晶振16M,system时钟源选择 main osc。系统时钟200/5 = 40 MHZ
    SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

    RGB_GPIO_Init();
    Timer0A_init(1000);

    //让RGB led循环闪烁,1s转换一次
    while(1)
    {
        if(Timer0A_cnt == 1000-1)
        {
            GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_1);
        }
        if(Timer0A_cnt == 2000-1)
        {
            GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_2);
        }
        if(Timer0A_cnt == 3000-1)
        {
            GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_3);
        }
    }
}


void RGB_GPIO_Init(void)
{
    //使能GPIOF外设
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    //设置为输出
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
}

void Timer0A_init(uint32_t fre)
{
    //使能TIMER0外设
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

    //TimerConfigure(TIMER0_BASE, TIMER_CFG_ONE_SHOT);  //单次计数模式
    //TimerConfigure(TIMER0_BASE, TIMER_CFG_A_PERIODIC);//单周期计数模式
    TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);  //周期性计数模式


     //一般来说定时器加载值为SysCtlClockGet()/N-1,定时时间为1/N秒。
    TimerLoadSet(TIMER0_BASE, TIMER_A,(SysCtlClockGet() / fre) - 1);

    //使能Timer0A的中断
    IntEnable(INT_TIMER0A);

    //配置中断源,配置为超时时产生中断
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

    //使能对处理器的中断
    IntMasterEnable();

    //为Timer0A注册中断处理函数
    TimerIntRegister(TIMER0_BASE,TIMER_A,Timer0IntHandler);

    //使能TIMER0A
    TimerEnable(TIMER0_BASE, TIMER_A);
}


void Timer0IntHandler(void)
{
    //清除标志位
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

    Timer0A_cnt ++;

    if(Timer0A_cnt == 3000)
    {
        Timer0A_cnt = 0;
    }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分