建立LED初始化头文件
建立头文件有点像C++中,头文件中可以添加宏定义以及函数原型,然后在.c文件中写入函数定义
“sys.h”
“sys.h"这个头文件中#include “stm32f10x.h”,所以自己写的文件不需要再引用"stm32f10x.h” 还包括了IO口操作宏定义,IO口地址映射,IO口操作以及其他 stm32 sys文件总结
PBout(5)
PBout(5)就是sys文件中的宏定义内容:#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出 它指向了控制PBn所在的寄存器,对其进行操作。 #define LED0 PBout(5)//LED0 这里的LED0就是指PB5这个IO口
led.h 代码
#ifndef _LED_H
#define _LED_H
#include "sys.h"
#define LED0 PBout(5)
#define LED1 PEout(5)
void LED_Init(void);
#endif
建立LED初始化程序
GPIO
每个IO口都有7个寄存器来控制: 2个32位端口配置寄存器CRL和CRH 2个32位的数据寄存器IDR和ODR 1个32位的置位/复位寄存器BSRR 1个16位的复位寄存器BRR 1个32位的锁存寄存器LCKR 其中,CRL和CRH控制着每个IO口的模式及输出速率
GPIO的八种工作模式
GPIO_Mode_AIN 模拟输入 GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_IPU 上拉输入 GPIO_Mode_Out_OD 开漏输出 GPIO_Mode_Out_PP 推挽输出 GPIO_Mode_AF_OD 复用开漏输出 GPIO_Mode_AF_PP 复用推挽输出
1、上拉输入、下拉输入可以用来检测外部信号,例如,按键等; 2、浮空输入模式,由于输入阻抗较大,一般把这种模式用于标准通信协议的 I2C、 USART 的接收端; 3、普通推挽输出模式一般应用在输出电平为 0 和 3.3V 的场合。而普通开漏输出模 式一般应用在电平不匹配的场合,如需要输出 5V 的高电平,就需要在外部一个上拉电 阻,电源为 5V,把 GPIO 设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输 出 5V 电平。 4、对于相应的复用模式(复用输出来源片上外设),则是根据 GPIO 的复用功能来 选择,如 GPIO 的引脚用作串口的输出(USART/SPI/CAN),则使用复用推挽输出模式。 如果用在 I2C、SMBUS 这些需要线与功能的复用场合,就使用复用开漏模式。 5、在使用任何一种开漏模式时,都需要接上拉电阻。
GPIO_InitTypeDef
GPIO_InitTypeDef是一个结构体类型,具体定义如下
typedef struct
{
uint32_t Pin;
a)GPIO_pins_define 中的所有可选择的值,代表各个引脚。
#define GPIO_PIN_0 ((uint16_t)0x0001)
#define GPIO_PIN_1 ((uint16_t)0x0002)
#define GPIO_PIN_2 ((uint16_t)0x0004)
#define GPIO_PIN_3 ((uint16_t)0x0008)
#define GPIO_PIN_4 ((uint16_t)0x0010)
#define GPIO_PIN_5 ((uint16_t)0x0020)
#define GPIO_PIN_6 ((uint16_t)0x0040)
#define GPIO_PIN_7 ((uint16_t)0x0080)
#define GPIO_PIN_8 ((uint16_t)0x0100)
#define GPIO_PIN_9 ((uint16_t)0x0200)
#define GPIO_PIN_10 ((uint16_t)0x0400)
#define GPIO_PIN_11 ((uint16_t)0x0800)
#define GPIO_PIN_12 ((uint16_t)0x1000)
#define GPIO_PIN_13 ((uint16_t)0x2000)
#define GPIO_PIN_14 ((uint16_t)0x4000)
#define GPIO_PIN_15 ((uint16_t)0x8000)
#define GPIO_PIN_All ((uint16_t)0xFFFF)
#define GPIO_PIN_MASK 0x0000FFFFU
b)GPIO_mode_define 中的所有可选择的值,代表可选的GPIO配置模式。
#define GPIO_MODE_INPUT 0x00000000U
#define GPIO_MODE_OUTPUT_PP 0x00000001U
#define GPIO_MODE_OUTPUT_OD 0x00000011U
#define GPIO_MODE_AF_PP 0x00000002U
#define GPIO_MODE_AF_OD 0x00000012U
#define GPIO_MODE_ANALOG 0x00000003U
#define GPIO_MODE_IT_RISING 0x10110000U
#define GPIO_MODE_IT_FALLING 0x10210000U
#define GPIO_MODE_IT_RISING_FALLING 0x10310000U
#define GPIO_MODE_EVT_RISING 0x10120000U
#define GPIO_MODE_EVT_FALLING 0x10220000U
#define GPIO_MODE_EVT_RISING_FALLING 0x10320000U
c)GPIO_pull_define 中的所有可选择的值,配置激活状态。通过设置GPIO中的PUPDR寄存器的值。
#define GPIO_NOPULL 0x00000000U
#define GPIO_PULLUP 0x00000001U
#define GPIO_PULLDOWN 0x00000002U
d)GPIO_speed_define 中的所有可选择的值,配置输出最大功率。通过设置GPIO中的OSPEEDR寄存器的值。
#define GPIO_SPEED_FREQ_LOW 0x00000000U
#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U
#define GPIO_SPEED_FREQ_HIGH 0x00000002U
#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U
嵌入式开发(学习笔记:跑马灯)GPIO_InitTypeDef+SysTick_Type
HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
其实就是将对应的字节输入到对应的寄存器中来配置IO口 HAL库-STM32F4 HAL_GPIO_Init() stm32库函数之GPIO_Init()详细解析
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinSate)
通过设置ODR寄存器的值来控制IO口的输出状态。ODR是一个端口输出数据寄存器,该寄存器可读写,从该寄存器读出来的数据可以用于判断当前IO口的输出状态。而向该寄存器写数据,则可以控制某个IO口的输出电平。
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
读取某个IO口的状态。读的是IDR寄存器,该寄存器是端口输入数据寄存器,该寄存器是只读寄存器。
__HAL_RCC_GPIOB_CLK_ENABLE()
在配置STM32外设时,任何时候都要先使能该外设的时钟。 用多少功能就使能多少功能,对每个外设的时钟都设置了开关,让用户可以精确地控制,关闭不需要的设备,达到节省供电的目的。如果不用的就完全关闭,尽可能降低芯片功耗。 使能就是打开该功能。 STM32时钟使能及应用总结
led.c 代码
#include"led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_5;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_5;
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);
}
main代码
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
int main(void)
{
HAL_Init();
Stm32_Clock_Init(RCC_PLL_MUL9);
delay_init(72);
LED_Init();
while(1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);
delay_ms(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);
delay_ms(500);
}
}
|