STM32F1筆記(一)GPIO輸出

聲明:本文所用函數庫爲標準庫,而非HAL庫!

 

GPIO最經典應用:LED燈。

先看電路。聲明:參考正點原子戰艦開發板。

與LED串聯的電阻稱爲限流電阻。

限流電阻計算公式:R=(U-LED壓降)/20ma。

U爲LED工作電壓,LED一般最大電流爲20ma。

在此R=(3.3-0.7)/0.02=130Ω。

因此本次示例中限流電阻阻值大於130Ω,纔不會燒壞LED。

 

再看代碼。

GPIO初始化。

void LED_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
 	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);
	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB, GPIO_Pin_5);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_5); 
}

LED應用

void HW_Led0_Off(void)
{
    GPIO_SetBits(GPIOB, GPIO_Pin_5);    //設置GPIO輸出1
}

void HW_Led0_on(void)
{
    GPIO_ResetBits(GPIOB, GPIO_Pin_5);  //設置GPIO輸出0
}

void HW_Led1_Off(void)
{
    GPIO_SetBits(GPIOE, GPIO_Pin_5);    //設置GPIO輸出1
}

void HW_Led1_on(void)
{
    GPIO_ResetBits(GPIOE, GPIO_Pin_5);  //設置GPIO輸出0
}

思考:爲什麼IO輸出低電平時LED亮,而不是輸出高電平?

思路:

    1、由於單片機的I/O口的結構決定了它灌電流能力較強,而拉電流能力比較弱(即IO口的低平驅動能力較強而高電平驅動能力較差);

    2、爲了簡化單片機接口的設計。高電平驅動和低電平驅動是同樣的效果,另外,低電平驅動也簡化了控制代碼,避免了單片機上電覆位時端口置高電平後對led的影響;

 

從STM32中文參考手冊內得知,STM32的GPIO可配置爲八種模式。

    1、浮空輸入(Input floating)

    2、上拉輸入(Input pull-up)

    3、下拉輸入(Input pull-down)

    4、模擬輸入(Analog)

    5、開漏輸出(Output open-drain)

    6、推輓式輸出(Output push-pull)

    7、推輓式複用功能(Alternate function push-pull)

    8、開漏複用功能(Alternate function open-drain)

typedef enum
{ 
    GPIO_Mode_AIN = 0x0,
    GPIO_Mode_IN_FLOATING = 0x04,
    GPIO_Mode_IPD = 0x28,
    GPIO_Mode_IPU = 0x48,
    GPIO_Mode_Out_OD = 0x14,
    GPIO_Mode_Out_PP = 0x10,
    GPIO_Mode_AF_OD = 0x1C,
    GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

驅動LED使用的是推輓輸出。推輓電路(push-pull)就是兩個不同極性晶體管間連接的輸出電路。

簡單理解推輓和開漏的區別:驅動能力不同。推輓驅動能力強。

複用意思是GPIO不作爲普通IO,而是特殊功能使用,比如ADC、USART等。

更深層次的研究可參考鏈接博客:https://blog.csdn.net/techexchangeischeap/article/details/72569999

 

引腳輸出速度有3種:

typedef enum
{ 
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

GPIO的速度應該與應用匹配。速度配置越高,噪聲越大,功耗越大。

比如配置爲串口應用,波特率爲115200,此時GPIO的速度配置爲10MHz就夠了,既省電也噪聲小。

 

 

輸入模式的講解在下一篇筆記。

特殊應用重映射I/O在後續如有項目需要再添加入筆記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章