HAL库学习(一)

HAL库GPIO初始化

(本文章只是为了方便使用api,写着玩儿的,用的正点原子的开发板,STM32103ZET6)
1、配置IO口

typedef struct
{
  uint32_t Pin;      /*引脚号*/
  uint32_t Mode;     /*模式设置*/
  uint32_t Pull;      /*上拉下拉设置*/
  uint32_t Speed;     /*速度设置*/
} GPIO_InitTypeDef;

(1)Mode

#define  GPIO_MODE_INPUT  					(0x00000000u)   /*输入模式*//*禁止输出*/
#define  GPIO_MODE_OUTPUT_PP                (0x00000001u)    /*推挽输出*//*高电平输出不推荐,设置低电平,接外部电源,可以读取IO口,电流型驱动*/
#define  GPIO_MODE_OUTPUT_OD                (0x00000011u)   /*开漏输出*//*可以读取IO口状态*/
#define  GPIO_MODE_AF_PP                    (0x00000002u)   /*推挽式复用*/
#define  GPIO_MODE_AF_OD                    (0x00000012u)   /*开漏式复用*/
#define  GPIO_MODE_AF_INPUT                 GPIO_MODE_INPUT
#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)  /*外部事件,上升和下降双沿触发检测*/

(2)Pull

#define  GPIO_NOPULL        0x00000000u   /*无上下拉  */
#define  GPIO_PULLUP        0x00000001u   /*上拉*/
#define  GPIO_PULLDOWN      0x00000002u   /*下拉*/

(3)Speed

#define  GPIO_SPEED_FREQ_LOW              (GPIO_CRL_MODE0_1) /*低速 */
#define  GPIO_SPEED_FREQ_MEDIUM           (GPIO_CRL_MODE0_0) /*中速 */
#define  GPIO_SPEED_FREQ_HIGH             (GPIO_CRL_MODE0)   /*高速 */

2、步骤

void key_init(void)
{

    GPIO_InitTypeDef gpio_init_struct;
    
    __HAL_RCC_GPIOE_CLK_ENABLE();                          /* IO口PE时钟使能 */
    gpio_init_struct.Pin=GPIO_PIN_3;
    gpio_init_struct.Mode=GPIO_MODE_INPUT;                 /*输入模式*/
    gpio_init_struct.Pull=GPIO_PULLUP;                 /*上拉电阻*/
    gpio_init_struct.Speed=GPIO_SPEED_FREQ_LOW;
    
    HAL_GPIO_Init(GPIOE, &gpio_init_struct);
    
    //return HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);
}

3、函数
HAL库自带的api,直接使用即可
(1)读回pin脚电平

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
  GPIO_PinState bitstatus;

  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
  {
    bitstatus = GPIO_PIN_SET;
  }
  else
  {
    bitstatus = GPIO_PIN_RESET;
  }
  return bitstatus;
}
/*ex:HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);返回1或者0*/

(2)设置pin脚电平

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if (PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;
  }
}
/*ex:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);*/

(3)翻转电平

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
  uint32_t odr;

  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  /* get current Ouput Data Register value */
  odr = GPIOx->ODR;

  /* Set selected pins that were at low level, and reset ones that were high */
  GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}
<think>好的,我现在需要处理用户关于HAL学习资料的查询。首先,用户明确提到想查找关于HAL的教程、资料、入门指南等。根据用户提供的四个引用内容,我需要从中提取相关信息,并按照用户的要求组织回答。 首先,检查每个引用内容。引用[1]提到了HAL开发的基本操作和外设操作,比如GPIO中断编程。引用[2]是关于HAL的入门指南,包含调试支持和断言机制。引用[3]和[4]展示了具体的代码示例,涉及GPIO初始化和主函数结构。这些引用内容都涉及HAL的不同方面,适合作为学习资料的不同部分。 接下来,用户要求回答结构清晰,分步解决问题,并确保真实可靠。需要将各个引用中的信息整合到不同的学习阶段中,例如入门基础、外设操作、调试优化等。同时,用户希望生成相关问题,这可能需要根据内容提出些常见的HAL学习问题。 需要注意引用标识的添加,每个引用的末尾自然地加上对应的脚注。例如,在提到调试支持时,引用[2]的内容需要标注[^2]。此外,所有的LaTeX格式要正确使用,但根据用户的问题,可能数学表达式较少,但如果有相关部分需要确保正确性。 用户可能的需求不仅仅是资料列表,而是如何系统学习HAL,因此需要分步骤指导,从基础到应用,再到高级功能。同时,提供的资料需要结合引用中的具体内容,比如GPIO配置、中断处理、调试方法等。 还需要检查是否有遗漏的信息,比如是否有其他重要的HAL学习资源在引用中没有提到,但根据用户给出的引用,只能使用这四个来源。因此,需要确保所有建议都基于这四个引用,不引入外部信息。 最后,生成的相关问题需要围绕HAL学习难点、常见错误、项目实践等,帮助用户进步深入学习。例如,如何配置时钟,如何处理中断,调试技巧等。 总结步骤: 1. 分阶段整理学习路径:入门基础、外设操作、调试优化。 2. 每个阶段引用对应的资料,并添加脚注。 3. 提供代码示例(如GPIO初始化和主函数结构)。 4. 生成相关问题,促进用户进步探索。</think>### HAL学习资料整理与学习路径建议 #### 、入门基础阶段 1. **HAL开发框架搭建** HAL的初始化流程包含时钟配置、外设使能和基础函数调用。例如`HAL_Init()`是的核心初始化函数,需在main函数首部调用[^4]。 ```c int main(void) { HAL_Init(); // HAL初始化 GPIO_Init(); // 外设初始化 while (1) { /* 主循环 */ } } ``` 2. **GPIO操作基础** - **引脚配置**:需通过`GPIO_InitTypeDef`结构体定义引脚模式(输入/输出)、上下拉和速度,例如LED初始化代码[^3]: ```c gpio_init_struct.Pin = GPIO_PIN_5; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式 HAL_GPIO_Init(GPIOB, &gpio_init_struct); ``` - **电平控制**:使用`HAL_GPIO_WritePin()`设置引脚状态[^3][^4]。 #### 二、外设操作进阶 1. **中断编程** HAL提供标准化的中断处理流程,例如GPIO中断的配置需设置引脚为中断模式,并实现回调函数`HAL_GPIO_EXTI_Callback()`[^1]。 2. **外设驱动开发** - 学习UART、SPI、I2C等通信协议时,需掌握HAL的`HAL_UART_Transmit()`、`HAL_SPI_TransmitReceive()`等函数。 - 参考代码结构如引用[3]中的时钟使能(`__HAL_RCC_GPIOB_CLK_ENABLE()`)和初始化流程。 #### 三、调试与优化 1. **调试支持** - 通过设置调试级别(如`HAL_DBGMCU_EnableDBGStandbyMode()`)获取运行时信息。 - **断言机制**:使用`assert_param()`检测函数参数合法性,帮助快速定位逻辑错误。 2. **性能优化** - 合理配置时钟树以降低功耗。 - 使用DMA传输减少CPU占用率。 #### 四、推荐学习资料 1. **入门指南** - 《STM32 HAL函数入门指南:从原理到实践》:涵盖结构、调试方法和断言机制。 - 《STM32-HAL开发快速入门》[^1]:重点讲解GPIO、中断等外设操作。 2. **代码实践** - 参考引用[3]的代码片段,实现LED控制、按键检测等基础功能。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值