GPIO的一些特性,翻译自ST的参考手册
1、16组IO可用
2、推挽/开漏+上拉/下拉
3、可从ODR输出数据,也可从外设输出数据
4、每个IO速度可独立设置
5、浮空输入,上下拉输入,模拟输入
6、输入数据到IDR或者外设
7、ODR中数据可通过GPIOx_BSRR单独设置某一位。
8、IO锁定装置,可冻结IO配置。(知道下次reset)
9、模拟公呢
10、复用输入输出选择及存取
11、IO快速反转,两个时钟周期可反转一次。
12、易配置的复用功能,可使一个IO有多个功能。
本实验值用到了数字输出,控制IO反转时间以形成一组PWM波形驱动接在IO口上的LED。
【代码实现】
LED的定义:
typedef enum
{
LED1 = 0,
LED2 = 1,
LED3 = 2,
LED4 = 3
} Led_Def;static GPIO_TypeDef* LED_PORT[4]={GPIOD, GPIOD, GPIOD, GPIOD};
static const u16 LED_PIN[4]={GPIO_Pin_12, GPIO_Pin_13, GPIO_Pin_14,GPIO_Pin_15};
LED的初始化函数
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}void LEDOn(Led_Def Led)//LED亮
{
LED_PORT[Led]->BSRRL=LED_PIN[Led];
}void LEDOff(Led_Def Led)//LED灭
{
LED_PORT[Led]->BSRRH=LED_PIN[Led];
}void LEDTog(Led_Def Led)//LED状态翻转
{
LED_PORT[Led]->ODR^=LED_PIN[Led];
}
初始化完成后,在主函数中控制LED的通断。当PWM占空比大于一个值时候,LED亮度变化不明显,所以调整PWM的变化率使得整个过程中亮度变化均匀。当占空比太小时,LED完全没亮度,我将这段占空比取消掉了,主函数的实现如下:
没有用while(1)这个循环,照样是无休止的反复亮灭。
for(i = 100;(i<2000)&(i>=0);i=i+j)
{
LEDOn(LED2);
delay_us(i);
LEDOff(LED2);
delay_us(2000-i);
if( i == 1990)
j =-5;
if(i == 10)
j = 1;
if(i>=1000)
j = 5;
if((j == 5)&(i <= 1000))
j = -1;
}