IO引腳初始化
即開展某項活動之前所做的準備工作,對于一個IO引腳來說,在使用它之前必須要做一些參數配置(例如:選擇工作模式、速率)的工作(即IO引腳的初始化)。
IO引腳初始化流程
1、使能IO引腳端口的時鐘。(以PC13為例,需要先使能GPIOC這個端口的時鐘)
2、選擇模式和其他參數。(通過庫函數GPIO_Init(...)實現)
為什么要使能時鐘
對于時序電路來說,只有在外部時鐘(即使能時鐘)的激勵下才能工作。對于STM32來說,其芯片內部片上外設基本為時序電路,因此要想片上外設工作,就得給片上外設提供時鐘。
且在默認情況下,片上外設的時鐘都是關閉的。只有當我們要用到某個片上外設時,才會由編程者去開啟對應時鐘,這樣可以最大程度的省電。
以PC13為例,通過如下所示庫函數開啟時鐘:
程序代碼
閃燈
#include "stm32f10x.h" // Device header
#include "Delay.h"int main()
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //開啟GPIOA的時鐘//使用各個外設前必須開啟時鐘,否則對外設的操作無效/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,賦值為推挽輸出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引腳,賦值為第0號引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,賦值為50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //將賦值后的構體變量傳遞給GPIO_Init函數//函數內部會自動根據結構體的參數配置相應寄存器//實現GPIOA的初始化 while(1){/*GPIO_ResetBits設置低電平,GPIO_SetBits設置高電平*/GPIO_ResetBits(GPIOA, GPIO_Pin_0); //將PA0引腳設置為低電平Delay_ms(500); //延時500msGPIO_SetBits(GPIOA, GPIO_Pin_0); //將PA0引腳設置為高電平Delay_ms(500); //延時500ms}
}
流水燈
#include "stm32f10x.h" // Device header
#include "Delay.h"int main(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //開啟GPIOA的時鐘//使用各個外設前必須開啟時鐘,否則對外設的操作無效/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,賦值為推挽輸出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //GPIO引腳,賦值為所有引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,賦值為50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //將賦值后的構體變量傳遞給GPIO_Init函數//函數內部會自動根據結構體的參數配置相應寄存器//實現GPIOA的初始化/*主循環,循環體內的代碼會一直循環執行*/while (1){/*使用GPIO_Write,同時設置GPIOA所有引腳的高低電平,實現LED流水燈*/GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001,PA0引腳為低電平,其他引腳均為高電平,注意數據有按位取反Delay_ms(100); //延時100msGPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010,PA1引腳為低電平,其他引腳均為高電平Delay_ms(100); //延時100msGPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100,PA2引腳為低電平,其他引腳均為高電平Delay_ms(100); //延時100msGPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000,PA3引腳為低電平,其他引腳均為高電平Delay_ms(100); //延時100msGPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000,PA4引腳為低電平,其他引腳均為高電平Delay_ms(100); //延時100msGPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000,PA5引腳為低電平,其他引腳均為高電平Delay_ms(100); //延時100msGPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000,PA6引腳為低電平,其他引腳均為高電平Delay_ms(100); //延時100msGPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000,PA7引腳為低電平,其他引腳均為高電平Delay_ms(100); //延時100ms}
}
蜂鳴器
#include "stm32f10x.h" // Device header
#include "Delay.h"int main(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //開啟GPIOB的時鐘//使用各個外設前必須開啟時鐘,否則對外設的操作無效/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,賦值為推挽輸出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //GPIO引腳,賦值為第12號引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,賦值為50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); //將賦值后的構體變量傳遞給GPIO_Init函數//函數內部會自動根據結構體的參數配置相應寄存器//實現GPIOB的初始化/*主循環,循環體內的代碼會一直循環執行*/while (1){GPIO_ResetBits(GPIOB, GPIO_Pin_12); //將PB12引腳設置為低電平,蜂鳴器鳴叫Delay_ms(100); //延時100msGPIO_SetBits(GPIOB, GPIO_Pin_12); //將PB12引腳設置為高電平,蜂鳴器停止Delay_ms(100); //延時100msGPIO_ResetBits(GPIOB, GPIO_Pin_12); //將PB12引腳設置為低電平,蜂鳴器鳴叫Delay_ms(100); //延時100msGPIO_SetBits(GPIOB, GPIO_Pin_12); //將PB12引腳設置為高電平,蜂鳴器停止Delay_ms(700); //延時700ms}
}