嵌入式开发(学习笔记:跑马灯)GPIO_InitTypeDef+SysTick_Type

更新时间:2023-07-18 22:24:10 阅读: 评论:0

阿拉丁神灯读后感嵌⼊式开发(学习笔记:跑马
灯)GPIO_InitTypeDef+SysTick_Type
⼀、GPIO是什么?
百度查的资料复制⽅便阅读
1、GPIO(英语:General-purpo input/output),通⽤型之输⼊输出的简称,功能类似8051的P0—P3,其接脚可以供由程控⾃由使⽤,PIN脚依现实考量可作为通⽤输⼊(GPI)或通⽤输出(GPO)或通⽤输⼊与输出(GPIO),如当clk generator, chip lect等。
既然⼀个可以⽤于输⼊、输出或其他特殊功能,那么⼀定有⽤来选择这些功能。对于输⼊,⼀定可以通过读取某个寄存器来确定引脚电位的⾼低;对于输出,⼀定可以通过写⼊某个寄存器来让这个引脚输出⾼电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。壮阳方法
1. GPxCON 寄存器
gpio
⽤于配置功能。 Configure
PORT A 与 PORT B~PORT H/J 在功能选择上有所不同,GPACON 中每⼀位对应⼀根引脚,共 23 个引脚。当某位被设为 0 时候,相应引脚为 输出引脚。此时我们可以在GPADAT 中相应的写⼊ 1或者 0 来让此输出⾼电平或者低电平;当某位被设为1时,相应引脚为地址线或⽤于地址控制,此时GPADATA⽆⽤。
⼀般⽽⾔ GPACON 通常被设为 1 ,以便访问外部器件。
PORT B~PORT H/J
在操作⽅⾯完全相同,GPxCON 中每两位控制⼀根引脚,
00 输⼊                  01 输出
10 特殊功能          11 保留不⽤
2. GPxDAT 寄存器游沙湖翻译
GPxDAT⽤于读写引脚,当引脚被设为输⼊时候,读此寄存器可知道相应引脚的电平状态⾼还是低,当引脚被设为输出时候,写此寄存器的位,可令引脚输出⾼电平还是低电平。
3. GPxUP
GPxUP寄存器某位为1时,相应管脚没有内部上拉电阻;为 0 时候 相应管脚有内部上拉电阻。
上拉电阻作⽤在于,当GPIO 处于第三种状态时候,既不是输出⾼电平,也不是输出低电平。⽽是呈现⾼阻态,相当于没有接芯⽚。它的电平状态由上下拉电阻决定
⼆、了解GPIO_InitTypeDef(芯⽚是STM32F407ZGT6)
1、GPIO_InitTypeDef 中包含参数。
typedef struct
{
uint32_t Pin;      /*!< 指定要配置的GPIO引脚。
此参数可以是的任何值 @ref GPIO_pins_define */
uint32_t Mode;      /*!< 指定选定接点的操作模式。
此参数的值可以是 @ref GPIO_mode_define */
uint32_t Pull;      /*!< 指定选定接点的上拉或下拉激活。
此参数的值可以是 @ref GPIO_pull_define */
uint32_t Speed;    /*!< 指定选定接点的速度。
此参数的值可以是 @ref GPIO_speed_define */
uint32_t Alternate;  /*!< 要连接到所选引脚的外围设备。
此参数的值可以是 @ref GPIO_Alternate_function_lection */
}GPIO_InitTypeDef;
2、查看每个参数中可以赋的值
a)GPIO_pins_define 中的所有可选择的值,代表各个引脚。
/** @defgroup GPIO_pins_define GPIO pins define
* @{
*/
#define GPIO_PIN_0                ((uint16_t)0x0001)  /* Pin 0 lected    */
#define GPIO_PIN_1                ((uint16_t)0x0002)  /* Pin 1 lected    */
#define GPIO_PIN_2                ((uint16_t)0x0004)  /* Pin 2 lected    */
#define GPIO_PIN_3                ((uint16_t)0x0008)  /* Pin 3 lected    */
#define GPIO_PIN_4                ((uint16_t)0x0010)  /* Pin 4 lected    */
#define GPIO_PIN_5                ((uint16_t)0x0020)  /* Pin 5 lected    */
#define GPIO_PIN_6                ((uint16_t)0x0040)  /* Pin 6 lected    */
#define GPIO_PIN_7                ((uint16_t)0x0080)  /* Pin 7 lected    */
#define GPIO_PIN_8                ((uint16_t)0x0100)  /* Pin 8 lected    */
#define GPIO_PIN_9                ((uint16_t)0x0200)  /* Pin 9 lected    */
#define GPIO_PIN_10                ((uint16_t)0x0400)  /* Pin 10 lected  */
#define GPIO_PIN_11                ((uint16_t)0x0800)  /* Pin 11 lected  */
#define GPIO_PIN_12                ((uint16_t)0x1000)  /* Pin 12 lected  */
#define GPIO_PIN_13                ((uint16_t)0x2000)  /* Pin 13 lected  */
#define GPIO_PIN_14                ((uint16_t)0x4000)  /* Pin 14 lected  */
#define GPIO_PIN_15                ((uint16_t)0x8000)  /* Pin 15 lected  */
#define GPIO_PIN_All              ((uint16_t)0xFFFF)  /* All pins lected */
#define GPIO_PIN_MASK              0x0000FFFFU /* PIN mask for asrt test */
/**
* @}
*/
b)GPIO_mode_define 中的所有可选择的值,代表可选的GPIO配置模式。
/
** @defgroup GPIO_mode_define GPIO模式定义
* @简要GPIO配置模式
*        元素值惯例: 0xX0yz00YZ
*          - X  : GPIO模式或EXTI模式
*          - y  : 外部IT或事件触发器检测
声音的产生和传播
*          - z  : 外部IT或事件的IO配置
*          - Y  : 输出类型(推拉或开漏)
*          - Z  : IO⽅向模式(输⼊、输出、交替或模拟)
* @{
*/
#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  中的所有可选择的值,配置激活状态。
/** @defgroup GPIO_pull_define GPIO pull define
* @brief GPIO Pull-Up or Pull-Down 激活
* @{
*/
#define  GPIO_NOPULL        0x00000000U  /*!< ⽆上拉或下拉激活  */
#define  GPIO_PULLUP        0x00000001U  /*!< 上拉激活        */
#define  GPIO_PULLDOWN      0x00000002U  /*!< 下拉激活        */
/**
* @}
*/
d)GPIO_speed_define 中的所有可选择的值,配置输出最⼤功率。
/** @defgroup GPIO_speed_define  GPIO 速度定义
* @brief GPIO 输出最⼤频率
* @{
*/
#define  GPIO_SPEED_FREQ_LOW        0x00000000U  /*!< IO⼯作频率为2 MHz,请参阅产品数据表 */
边框大全#define  GPIO_SPEED_FREQ_MEDIUM      0x00000001U  /*!< 范围12.5 MHz⾄50 MHz */
#define  GPIO_SPEED_FREQ_HIGH        0x00000002U  /*!< 范围为25兆赫⾄100兆赫 */
#define  GPIO_SPEED_FREQ_VERY_HIGH  0x00000003U  /*!< 范围50兆赫⾄200兆赫 */
/**
* @}
*/
e)GPIO_Alternate_function_lection 暂时不知道是⼲嘛的,以后知道了记得补上。
三、简单写个demo
红花泡酒1、准备做个跑马灯效果,这⾥⽤的是GPIO_PIN_3 和GPIO_PIN_4引脚连接的LED。
a)写个main函数
int main(void){包村
__HAL_RCC_GPIOE_CLK_ENABLE();  // 开启GPIOE时钟 RCC外围时钟启⽤后的延迟
// 定义对象
GPIO_InitTypeDef typeDef;
//设置引脚3 和 4(在芯⽚对应的引脚标记是PE3和PE4,⽬前不知道是⼲嘛的)
typeDef.Pin=GPIO_PIN_3|GPIO_PIN_4;
//设置模式为输出推拉模式
typeDef.Mode=GPIO_MODE_OUTPUT_PP;
//设置激活属性为上拉激活
其远而无所至极邪
typeDef.Pull=GPIO_PULLUP;
/**
* @brief  根据GPIO_Init中指定的参数初始化GPIOx外围设备。
* @param  GPIOx其中x可以是(A..K)为STM32F429X设备选择GPIO外围设备,或者x可以是(A..I)为STM32F40XX和STM32F427X设备选择GPIO外围设备。  * @param  指向包含指定GPIO外围设备配置信息的GPIO_InitTypeDef结构的GPIO_Init指针。
* @retval 没有
*/
HAL_GPIO_Init(GPIOE,&typeDef);//初始化操作
/**
* @brief  设置或清除选定的数据端⼝位。
*
* @note  此函数使⽤GPIOx_BSRR寄存器来允许原⼦读取/修改访问。这样,在读取和修改访问之间就没有发⽣IRQ的风险。
*
* @param  GPIOx其中x可以是(A..K)为STM32F429X设备选择GPIO外围设备,或者x可以是(A..I)为STM32F40XX和STM32F427X设备选择GPIO外围设备。  * @param  GPIO_Pin 指定要写⼊的端⼝位。此参数可以是GPIO_PIN_x之⼀,其中x可以是(0..15)。
* @param  PinState指定要写⼊选定位的值。此参数可以是GPIO_PinState枚举值之⼀:
*            @arg GPIO_PIN_RESET: 清除端⼝引脚
*            @arg GPIO_PIN_SET: 设置端⼝引脚
* @retval 没有
*/
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET); //到这⾥还没有LED灯还是没有亮
}
b)这个时候出现了⼀个GPIO_TypeDef的指针 GPIOE,看⼀下代码
在stm32f407xx.h中是这么写的(应该是指向了⼀个地址,暂时没了解)
#define PERIPH_BASE          0x40000000UL /*!< 别名区域中的外设基址 */
#define AHB1PERIPH_BASE      (PERIPH_BASE + 0x00020000UL)
#define GPIOE_BASE            (AHB1PERIPH_BASE + 0x1000UL)
#define GPIOE              ((GPIO_TypeDef *) GPIOE_BASE)
GPIO_TypeDef 中包含的参数。
/**
* @brief 通⽤I/O
*/
typedef struct
{
__IO uint32_t MODER;    /*!< GPIO 端⼝模式寄存器,            地址偏移量: 0x00      */
__IO uint32_t OTYPER;  /*!< GPIO 端⼝输出类型寄存器,        地址偏移量: 0x04      */
__IO uint32_t OSPEEDR;  /*!< GPIO 端⼝输出速度寄存器,        地址偏移量: 0x08      */
__IO uint32_t PUPDR;    /*!< GPIO 端⼝上拉/下拉寄存器,        地址偏移量: 0x0C      */
__IO uint32_t IDR;      /*!< GPIO 端⼝输⼊数据寄存器,        地址偏移量: 0x10      */
__IO uint32_t ODR;      /*!< GPIO 端⼝输出数据寄存器,        地址偏移量: 0x14      */
__IO uint32_t BSRR;    /*!< GPIO 端⼝位设置/重置寄存器,      地址偏移量: 0x18      */
__IO uint32_t LCKR;    /*!< GPIO 端⼝配置锁寄存器,          地址偏移量: 0x1C      */
__IO uint32_t AFR[2];  /*!< GPIO 备⽤功能寄存器,            地址偏移量: 0x20-0x24 */
} GPIO_TypeDef;
c)看完了代码后,⼜参考买板⼦的时候商家送的demo发现只要操作ODR这个输出数据的参数就可以了。然后接着a)的代码继续写。
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET); //到这⾥还没有LED灯还是没有亮
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET); //到这⾥还没有LED灯还是没有亮
//GPIOE是⼀个GPIO_TypeDef的指针
//测试结果,跟16进制有关系.
//------ 1111 1111 1111 1111 (全不亮)
//------ 1111 1111 1110 0111 (全亮)
//------ 1111 1111 1111 0111 (PE3亮,PE4灭)
//------ 1111 1111 1110 1111 (PE3灭,PE4亮)
// 引脚的顺序是倒叙排的,PE15 >> .... >> PE0
// 所以只要保证PE3和PE4的位置对应上就可以了
// PE3亮 PE4灭的⼗进制数为:16
// PE3灭 PE4亮的⼗进制数为:8
/
/ PE3亮 PE4亮的⼗进制数为:0
// PE3灭 PE4灭的⼗进制数为:24
//GPIOE->ODR=16;
GPIOE->ODR=8;
//GPIOE->ODR=0;
//GPIOE->ODR=24;
好了!现在能亮能灭了,在来个定时器就可以了
2、怎么写定时器呢?看了⼀篇⽂章《》后尝试⾃⼰试试。
a)⾸先使⽤SysTick这个,类型为SysTick_Type的指针来操作,SysTick在core_cm4.h的头⽂件下。
/*!< 系统控制空间基址 */
#define SCS_BASE            (0xE000E000UL)
/
*!< SysTick 基址 */
#define SysTick_BASE        (SCS_BASE +  0x0010UL)
/*!< SysTick 配置结构 */
#define SysTick            ((SysTick_Type  *)    SysTick_BASE  )
就看SysTick_Type是怎么定义的就可以了。

本文发布于:2023-07-18 22:24:10,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1086920.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:引脚   输出   模式   寄存器   时候   检测
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图