接線
注意:LED燈長一點的引腳是正極。
配置GPIO
1.使用RCC開啟GPIO時鐘
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
作用:外設時鐘控制(根據外設連接的總線選擇要開啟的時鐘)
這里我用的是PA0到PA7的引腳,根據上圖可以看出應該使用RCC_APB2PeriphClockCmd去開啟GPIOA外設。
RCC_AHBPeriph/RCC_APB2Periph/RCC_APB1Periph:選擇外設
NewState:使能/使能
2.使用GPIO_Init初始化GPIO
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
作用:用結構體的參數初始化GPIO。
用法:先定義一個結構體變量,再給變量賦值,最后調用這個函數即可(這個函數就會自動讀取結構體的值,然后自動把外設的各個參數配置好)。
3.使用輸出或輸入的函數控制GPIO口(本篇我們講到的是GPIO輸出部分)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:把指定的端口設置為高電平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:把指定的端口設置為低電平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
作用:根據第三個參數的值來設置指定端口
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
作用:可以對16個端口進行寫入操作
例題:LED流水燈
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//選中所有引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);while (1){GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001Delay_ms(100);GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010Delay_ms(100);GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100Delay_ms(100);GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000Delay_ms(100);GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000Delay_ms(100);}
}
Delay.c
#include "stm32f10x.h"/*** @brief 微秒級延時* @param xus 延時時長,范圍:0~233015* @retval 無*/
void Delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus; //設置定時器重裝值SysTick->VAL = 0x00; //清空當前計數值SysTick->CTRL = 0x00000005; //設置時鐘源為HCLK,啟動定時器while(!(SysTick->CTRL & 0x00010000)); //等待計數到0SysTick->CTRL = 0x00000004; //關閉定時器
}/*** @brief 毫秒級延時* @param xms 延時時長,范圍:0~4294967295* @retval 無*/
void Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}/*** @brief 秒級延時* @param xs 延時時長,范圍:0~4294967295* @retval 無*/
void Delay_s(uint32_t xs)
{while(xs--){Delay_ms(1000);}
}
Delay.h
#ifndef __DELAY_H
#define __DELAY_Hvoid Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);#endif
下面補充一下GPIO其他比較重要的庫函數部分。
GPIO其他重要庫函數
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
作用:復位所有的GPIO外設。
void GPIO_AFIODeInit(void);
作用:復位所有AFIO外設。
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
作用:把結構體變量賦一個默認值。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
作用:GPIO的讀取函數(GPIO的輸入函數)
輸入部分我們下一篇會寫到。
代碼有什么疑問可以評論區里提問哦!