stm32HAL库学习记录

        在学习stm32之前,有过一点51单片机的基础,因此浅显的认为stm32单片机会和51一样简单。但是在看了B站上不少视频以及查了不少文档后发现,是我肤浅了。stm32又很完善的架构,因此其功能比51单片机更强大,与此同时,它的学习难度也是比51大的。因此在学习之前不要有随便学学就够的心理。

        个人认为学习stm32最难的部分就是入门了。这个入门需要你能够理解明白stm32单片机的各种外设以及他们的功能,运行的原理和不同 场景下的使用情况。我原本以为既然要学习HAL库,那就没必要再看标准库了,但是事实上是我天真了^>^,HAL库的函数之间的封装好,但是初学者很容易觉得各个函数之间没有对应关系,看不懂程序是如何运行的。我刚开始学习的时候,用Cubemax生成的工程文件,连main文件都看不懂,搞得我头皮发麻。因此我建议在学习HAL库之前需要学习一下标准库(强烈建议B站江科协的视频,老师讲的原理非常详细),也不需要学很多,你只需要学会各个外设的作用,如何配置相应的外设,和自己能够抄抄写写主函数运行一些代码即可(此时你已经实现了标准库的入门),这时候你就可以打开cubemax来配置stm32的外设了。

Cubemax

        STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,通过自己对硬件的需要,进行选择,而后可以快速生成代码,减少开发人员的开发难度,时间和花销。STM32 覆盖整个STM32系列。

        这个软件最大的优点我认为就是它能够很方便的为用户配置各种外设,我们只需要拿着鼠标”点点点“就可以实现配置例如GPIO的输入或输出模式,定时器的PWM模式还是计时模式。当我们配置好后点击生成代码,所生成的文件里就会帮我们自动的配置好。我们只需要在主函数中直接调用即可,可谓是非常的方便。

举例配置GPIO

GPIO_x264

        在这个示例中,我在cubemax里仅仅配置了GPIO,在程序中仅仅写了两句话

		HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_12);
		HAL_Delay(1000);

        这里将PA12口每隔一秒改变一次其高低电平状态,从而实现学习单片机的第一步:点灯。如果用标准库的话,就需要配置PA12口的各项数据,比较麻烦,但是这里我们就可以将这个步骤交给软件来替我们操作。

        但是,软件是替我们操作了,并不是没有操作,在工程文件中的gpio.c文件中,同样也有配置GPIO的语句:

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);

  /*Configure GPIO pin : PA12 */
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

        在主函数中,调用了MX_GPIO_Init( )这个函数从而实现GPIO初始化。因此我们在学习HAL库时要明白,标准库中那些配置外设的操作是我们用软件代替操作的,而这也是HAL的优势所在。在刚开始学习时,可以多跳转到函数的定义里看看HAl如何为我们配置外设的,这样有助于我们更加深入理解。

Keil的工程文件

        在CubeMax中生成的文件需要在keil中打开,keil也是目前我们主要写代码的平台,而我们生成的函数通常都包含了很多.c文件例如:

         看到那么多文件确实有点头疼,但是虽然文件多,我们还是都要明白不同文件是干嘛的。有的只用知道了解,不用看,有的需要明白并会操作,有的需要熟练掌握。例如上面两张图片中的Application/MDK-ARM文件下的启动文件,我们只要知道这是stm32启动运行的开始命令即可。

        Application/User/Core文件下的是Cubemax根据我们的需要所生成的文件,我们会根据需要对其进行操作,这些就需要我们能够去操作了。

        Drivers/STM32F4xx_HAL_Driver文件下的是HAl库最主要的各种函数,里面的每一个文件程序几乎都非常的多,都是几百上千行。虽然它很多,但是我们也不能忽视,因为这些文件中就包含了我们做工程时所需要的各种函数。例如上文中我们用到的 HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)函数,我们就可以在stm32f1xx hal_gpio.c文件中找到其定义:

/**
  * @brief  Toggles the specified GPIO pin
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
  * @param  GPIO_Pin: Specifies the pins to be toggled.
  * @retval None
  */
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 Output 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);
}

        在我们学习HAL库过程中,会非常频繁的打开这些文件去查看函数的定义,因此这些文件需要我们能够看懂,有的常用的函数就需要我们记住方便我们自己写代码的时候能够很快调用。

hardware文件下的是我们自己定义的,因为是自己写的,相信大家对其中的每一行代码大概都会了然于胸,可以说这些文件往往是我们工程的核心。例如在上面图片中的Hall.c文件(霍尔编码器PID)中,里面的代码是买电机问店家要的资料,然后再一行一行的添加到自己的Hal库中的(因为市面上店家提供的参考历程大部分都是标准库,所以需要自己去整合到自己的工程中)

例如位置环控制:

int Position_FeedbackControl1(float Circle, int CurrentPosition)
{
		float TargetPosition,Bias, ControlVelocity;     //定义相关变量
		static float Last_bias1, Integral_Bias1;          //静态变量,函数调用结束后其值依然存在
		
	  TargetPosition=Circle*1320*1.34 ; //目标位置=目标圈数*1040
	                              //10ms读取一次编码器(即100HZ),电机减速比为20,霍尔编码器精度13,AB双相组合得到4倍频,
	                              //则转1圈编码器读数为20*13*4=1040,电机转速=Encoder*100/1040r/s 使用定时器2
	                              //1.04是误差系数,电机本身存在误差,可根据实际情况调整该系数以提高控制精度
	
		Bias=TargetPosition-CurrentPosition; //求位置偏差
	  Integral_Bias1+=Bias;
    if(Integral_Bias1> 970) Integral_Bias1= 970;	//积分限幅 防止到达目标位置后过冲
	  if(Integral_Bias1<-970) Integral_Bias1=-970;	//积分限幅 防止到达目标位置后过冲
	
		ControlVelocity=Position_Kp*Bias+Position_Ki*Integral_Bias1+Position_Kd*(Bias-Last_bias1);  //增量式PI控制器
	                                                                                            //Position_Kp*Bias 偏差越大速度越大
	                                                                                            //Position_Ki*Integral_Bias 减小稳态误差
	                                                                                            //Position_Kd*(Bias-Last_bias) 限制速度

		Last_bias1=Bias;	
		return ControlVelocity;    //返回速度控制值 
}

结尾

        如果把上面的步骤都弄明白的话,就基本上入门了,接下来就可以拿单片机做一些复杂的操作,做一些模块的文件以备以后使用。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值