GPIO口的 LED 点亮(以STM32F407IGTb芯片为例 )
-
1、掌握的GPIO口的使用方法
-
2、熟悉Keil uVision5工具软件的使用
原理:
只要是对硬件操作,就要首先查看原理图。
查看外设是给模块的MCU的哪个引脚相连。
FS-STM32F407开发平台上的LED的亮灭状态,与芯片上的引脚I/O输出电平有关。
FS-STM32F407开发平台上LED的I/O扩展:
IO操作重要结构体:GPIO_InitTypeDef
typedef struct
{
uint32_t Pin; 操作的管脚
uint32_t Mode; 模式选择
uint32_t Pull; 上拉下拉,或者都不加
uint32_t Speed; 速度选择
uint32_t Alternate; 管脚复用模式
} GPIO_InitTypeDef;
1、Mode
- 输入(复位状态)/input(reset state)
- 通用输出模式 / general purpose output mode
- 复用功能模式 / alternate function mode
- 模拟模式 / analog mode
#define GPIO_MODE_INPUT ((uint32_t)0x00000000) /*!< Input Floating Mode */
#define GPIO_MODE_OUTPUT_PP ((uint32_t)0x00000001) /*!< Output Push Pull Mode*/
#define GPIO_MODE_OUTPUT_OD ((uint32_t)0x00000011) /*!< Output Open Drain Mode*/
#define GPIO_MODE_AF_PP ((uint32_t)0x00000002) /*!< Alternate Function Push Pull Mode*/
#define GPIO_MODE_AF_OD ((uint32_t)0x00000012) /*!< Alternate Function Open Drain Mode*/
2、Speed
为了降低STM32处理器的功耗,可以依据实际的需求,选择合适的时钟速率,GPIO口支持的最大时钟速率越低,它产生的功耗也越低。
#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW
#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM
#define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH
#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH
3、初始化GPIO的代码
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOF_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9 |GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
}
调用的HAL函数解析: void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin, GPIO_PinState PinState);
该函数其实是对BSRR 寄存器进行操作,第一个参数传的是GPIO所在的组,第二个是操作第几个管脚,第三个是对管脚进行置位。
利用STM32CubeMX来架构程序
1、打开STM32CubeMX选择芯片
2、对管脚进行配置
3、点击CONFIGURATION
4、点击生成工程按钮
源代码:
(仅需要用户添加的代码)
/* USER CODE BEGIN 0 */
#define led1_port GPIOF
#define led1_pin GPIO_PIN_7
#define led2_port GPIOF
#define led2_pin GPIO_PIN_8
#define led3_port GPIOF
#define led3_pin GPIO_PIN_9
#define led4_port GPIOF
#define led4_pin GPIO_PIN_10
#define set_high(p,i) {p->BSRR = i;} //给高电平 熄灭
#define set_low(p,i) {p->BSRR = (uint32_t)i << 16U;} //给低电平 点亮
#define led1_off set_high(led1_port,led1_pin)
#define led1_no set_low(led1_port,led1_pin)
#define led2_off set_high(led2_port,led2_pin)
#define led2_no set_low(led2_port,led2_pin)
#define led3_off set_high(led3_port,led3_pin)
#define led3_no set_low(led3_port,led3_pin)
#define led4_off set_high(led4_port,led4_pin)
#define led4_no set_low(led4_port,led4_pin)
void led_1234(void);
/* USER CODE END 0 */
.
.
.
/* USER CODE BEGIN 3 */
led_1234();--------------------main函数中调用
/* USER CODE END 3 */
.
.
.
/* USER CODE BEGIN 4 */
void led_1234(void)
{
led1_no; //led1打开
HAL_Delay(1000); //延时1秒
led1_off; //led1关闭
HAL_Delay(1000); //延时1秒
led2_no; //led2打开
HAL_Delay(1000); //延时1秒
led2_off; //led2关闭
HAL_Delay(1000); //延时1秒
led3_no; //led3打开
HAL_Delay(1000); //延时1秒
led3_off; //led3关闭
HAL_Delay(1000); //延时1秒
led4_no; //led4打开
HAL_Delay(1000); //延时1秒
led4_off; //led4关闭
HAL_Delay(1000); //延时1秒
}
/* USER CODE END 4 */
编程要点:
1.使能GPIO端口时钟
2.初始化GPIO目标引脚为推挽输出
3.控制GPIO引脚输出高低电平