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;
}