GPIO初始化函數
GPIO_Ini:初始化GPIO引腳的模式,速度和引腳號
GPIO_Init(GPIOA, &GPIO_InitStruct);? // 初始化GPIOA的引腳0
GPIO輸出控制函數
GPIO_SetBits:將指定的GPIO引腳設置為高電平
GPIO_SetBits(GPIOA, GPIO_Pin_0); ?// 將GPIOA的引腳0設置為高電平
GPIO_ResetBits:將指定的GPIO引腳設置為低電平
GPIO_ResetBits(GPIOA, GPIO_Pin_0); ?// 將GPIOA的引腳0設置為低電平
GPIO_WriteBit:寫入指定的電平狀態到GPIO引腳
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); ?// 將GPIOA的引腳0設置為高電平
GPIO_Write:寫入一個16位值到GPIO端口
GPIO_Write(GPIOA, 0x0001); ?// 將GPIOA的引腳0設置為高電平,其他引腳為低電平
GPIO輸入讀取函數
GPIO_ReadInputDataBit:讀取指定GPIO引腳的電平狀態
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) {
? ? // 引腳0為高電平
}
GPIO_ReadInputData:讀取整個GPIO端口的輸入狀態
uint16_t portValue = GPIO_ReadInputData(GPIOA); ?// 讀取GPIOA的輸入狀態
GPIO時鐘使能函數
RCC_APB2PeriphClockCmd:使能GPIO端口的時鐘。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); ?// 使能GPIOA的時鐘
時鐘使能是指為某個外設(如GPIO、USART、SPI等)提供時鐘信號,使其能夠正常工作。
GPIO復用功能配置
GPIO_PinAFConfig:配置GPIO引腳的復用功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); ?// 配置GPIOA的引腳9為USART1功能
GPIO引腳的復用功能是指將GPIO引腳用于除普通輸入輸出之外的其他功能。STM32的GPIO引腳不僅可以作為普通的數字輸入或輸出,還可以配置為其他外設功能(如USART、SPI、I2C、定時器等)的引腳。
點亮LED
#include "stm32f10x.h" // 包含STM32F10x系列的頭文件int main(void) {// 使能GPIOA的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 定義并初始化GPIO結構體GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 修正拼寫錯誤:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 選擇引腳0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 設置輸出速度為50MHz// 初始化GPIOA的引腳GPIO_Init(GPIOA, &GPIO_InitStructure);// 將GPIOA的引腳0設置為低電平GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 修正拼寫錯誤:GPIO_ResetLBits -> GPIO_ResetBits// 主循環while (1) {// 可以在這里添加其他邏輯}
}
LED閃爍
#include "stm32f10x.h" // 包含STM32F10x系列的頭文件
#include "Delay.h"
int main(void) {// 使能GPIOA的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 定義并初始化GPIO結構體GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 修正拼寫錯誤:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 選擇引腳0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 設置輸出速度為50MHz// 初始化GPIOA的引腳GPIO_Init(GPIOA, &GPIO_InitStructure);// 主循環while (1) {GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);Delay_ms(500);}
}
流水燈
#include "stm32f10x.h" // 包含STM32F10x系列的頭文件
#include "Delay.h"
int main(void) {// 使能GPIOA的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 定義并初始化GPIO結構體GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 修正拼寫錯誤:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_2; // 選擇引腳0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 設置輸出速度為50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);// 主循環while (1) {GPIO_Write(GPIOA,~0x0001);Delay_ms(500);GPIO_Write(GPIOA,~0x0002);Delay_ms(500);GPIO_Write(GPIOA,~0x0004);Delay_ms(500);GPIO_Write(GPIOA,~0x0008);Delay_ms(500);GPIO_Write(GPIOA,~0x00010);Delay_ms(500);GPIO_Write(GPIOA,~0x00020);Delay_ms(500);GPIO_Write(GPIOA,~0x00040);Delay_ms(500);GPIO_Write(GPIOA,~0x00080);Delay_ms(500);}
}
蜂鳴器
#include "stm32f10x.h" // 包含STM32F10x系列的頭文件
#include "Delay.h"
int main(void) {// 使能GPIOA的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 定義并初始化GPIO結構體GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 修正拼寫錯誤:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 選擇引腳0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 設置輸出速度為50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);// 主循環while (1) {GPIO_Write(GPIOB,GPIO_Pin_12);Delay_ms(500);GPIO_Write(GPIOB,GPIO_Pin_12);Delay_ms(500);}
}
GPIO使用步驟:初始化時鐘,然后定義結構體,賦值結構體
GPIO_Mode選擇輸入輸出模式
GPIO_Pin選擇引腳
GPIO_Speed選擇速度?
OLED:有機發光二極管
OLED驅動函數
STM32中斷系統
外部中斷
定時器
輸出比較功能
輸出比較(Output Compare,OC)?是定時器(Timer)的一種功能,用于生成精確的時間信號或控制外部設備(如PWM信號、脈沖生成等)。輸出比較功能通過比較定時器的計數器值(CNT)和捕獲/比較寄存器(CCR)的值,來觸發特定的事件(如翻轉輸出、產生中斷等)。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"uint8_t i; //定義在定時器中斷里自增的變量int main(void)
{/*模塊初始化*/OLED_Init(); //OLED初始化PWM_Init(); //定時中斷初始化while (1){for(i=0;i<=100;i++){PWM_SetComparel(i);Delay_ms(10);}for(i=0;i<=100;i++){PWM_SetComparel(100-i);Delay_ms(10);}
}