//*****************************************************************************
// 基础练习1.2: 软件延时实现LED灯亮度控制
//
// 硬件描述:
// LED2(蓝色) --PF0
// LED3(绿色) --PA4
// LED4(红色) --PD6
//
// 注意事项:
// 引脚PF0和PD7比较特殊,默认是保护的。要重新编程操作的话,需要先解锁
// 小技巧:
// 通过SysConfig工具进行引脚的初始配置,就不用考虑这些因素了.
// SysConfig的使用可参考链接: https://www.bilibili.com/read/cv6258251
//
// 过程描述:
// 把引脚配置成GPIO,输出。 通过输出高电平和低电平来控制LED的亮和灭。
// 亮/灭的速度如果很快,人眼就识别不出来.此时改变亮/灭的时间比,就可以改变亮度.
//
// 思考:
// 1. 怎么用宏定义来实现延时?方便修改
//
//*****************************************************************************
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_gpio.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
void main(void)
{
//0-2的32次方-1, 4294967295
uint32_t ui32_delay;
//使能PA外设的时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//等待外设Ready
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA))
{
}
//将PA4配置成GPIO,方向为输出
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_4);
//PF0,蓝色LED引脚也初始化
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF))
{
}
HWREG(GPIO_PORTF_BASE+GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(GPIO_PORTF_BASE+GPIO_O_CR) |= GPIO_PIN_0;
HWREG(GPIO_PORTF_BASE+GPIO_O_LOCK) = 0x0;
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0xFF);
//可能出现的错误:
//(1) 要在两个地方加软件延时,点亮LED后延时,熄灭LED后也要加延时;
// LED亮的时间长,亮度就大;
// +-----+ +------+
// | | | |
// ---+ +------+ +---------
// 重点在于延时参数的调整, 间隔太久, 会出现闪烁的效果.
// 先按照50%张开空比,调整时间, 到看不出闪烁的效果; 然后再调整高低电平的占比;
while(1)
{
//PA4输出低电平,LED亮
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0x00);
//此处要加延时,延时越长,表示亮的时间越久.亮度高
//例如,此处的延时分别为 30,300,3000, 下载代码,可以看到亮度有明显区别;
for(ui32_delay=0;ui32_delay<3000;ui32_delay++);
//PA4输出高电平,LED灭
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0xFF);
//此处要加延时,延时越长,表示灭的时间越久,亮度低
for(ui32_delay=0;ui32_delay<5000;ui32_delay++);
}
}