2、STM32 HAL库初始化函数功能

1、int main(void); 主函数

int main(void)
{  
  HAL_Init(); //初始化HAL库
  SystemClock_Config(); //系统时钟配置
  MX_GPIO_Init();  //GPIO初始化
  while (1)
  {
  
  }  
}

2、HAL_Init(); HAL初始化

这个是主函数中首要处理的函数:主要用来初始化HAL库,即用来初始化所有的外围设备,Flash接口和系统定时器,系统中断组,初始化低级别硬件。return HAL_OK向函数返回一个值,代表函数编译成功。

HAL_StatusTypeDef HAL_Init(void)
{
  /* 配置Flash预取使能,指令缓存使能,数据缓存使能
    使能FLASH指令缓冲器,用于当CPU主频提升后缓存多条指令已避免CPU等待FLASH
 传数据导致的时间浪费
*/ 
#if (INSTRUCTION_CACHE_ENABLE != 0U)
  __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
#endif /* Flash预取使能*/

#if (DATA_CACHE_ENABLE != 0U)
  __HAL_FLASH_DATA_CACHE_ENABLE();
#endif /* 数据缓存使能*/

#if (PREFETCH_ENABLE != 0U)
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif /* 指令缓存使能 */

  /* 设置中断组优先级 
  STM32F429 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器
  的 bit10~8 来定义 。中断优先级分组为4,表示4位抢占优先级,0位响应优先级
 */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* 设置Systick中断优先级,TICK_INT_PRIORITY参数在“stm32f4xx_hal_conf.h”
 文件中定义,默认值为0x0F,优先级最低,使用SYSTICK作为时钟源,并配置为1ms
 (复位后默认时钟为HSI) 
*/
  HAL_InitTick(TICK_INT_PRIORITY);

  /* 初始化底层硬件  参考资料
  https://strongerhuang.blog.csdn.net/article/details/99826801
  https://www.cnblogs.com/schips/p/8973766.html
	  void HAL_MspInit(void)
	{
	  __HAL_RCC_SYSCFG_CLK_ENABLE();  
	  __HAL_RCC_PWR_CLK_ENABLE(); 
	}
 
*/
  HAL_MspInit();  
  return HAL_OK;
}

3、SystemClock_Config(); //系统时钟配置

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct ; //定义结构体变量RCC_OscInitStruct
  RCC_ClkInitTypeDef RCC_ClkInitStruct ;//定义结构体变量RCC_ClkInitStruct 

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();//PWR时钟大概是控制低功耗的,具体不确定
  /*
  下面这个设置用来设置调压器输出电压级别,以便在器件未以最大频率工作
  时使性能与功耗实现平衡,此功能只有STM32F42xx和STM32F43xx器件有
*/
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  // //时钟源为外部高速时钟
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  
  RCC_OscInitStruct.HSEState = RCC_HSE_ON; //打开外部高速时钟
  
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; //打开PLL
  
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE
  
  RCC_OscInitStruct.PLL.PLLM = 8;//主PLL分频系数(PLL之前的分频),取值范围:2~63.
  
  RCC_OscInitStruct.PLL.PLLN = 336;//主PLL倍频系数(PLL倍频),取值范围:64~432.
  
  //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; //得到系统时钟168MHZ
  
  //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
  RCC_OscInitStruct.PLL.PLLQ = 4;
  
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  
  
   //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  //设置系统时钟时钟源为PLL                            
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  //AHB分频系数为1
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  //APB1分频系数为4
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  //APB2分频系数为2
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
 //同时设置FLASH延时周期为5WS,也就是6个CPU周期。
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
  /*则当HSE时钟启用失败时,系统会自动切换到HSI作为时钟源,并产生一个NMI不可屏蔽中断。
  */
  HAL_RCC_EnableCSS();
}

4、MX_GPIO_Init(); //GPIO初始化

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0}; //定义结构体变量GPIO_InitStruct 

  /* GPIO端口时钟打开 */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*配置GPIO初始输出电平 */
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOH, GPIO_PIN_9, GPIO_PIN_SET);

  /*配置GPIO引脚*/
  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;  //引脚号 5 6 
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//引脚输出模式  PP推挽输出
  GPIO_InitStruct.Pull = GPIO_PULLUP;//     引脚上拉模式
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;// 输出速度为低速
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);//  配置端口引脚

  /*Configure GPIO pin : PH9 */
  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

}

4、main函数while(1)中的编程应用

while(1)
{
 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET); //引脚置位
 
 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_RESET);//引脚复位
}
  • 11
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
硬石YS-F1Pro 开发板开发手册(HAL 库) STM32 入门系列教程 STM32 Cube 是一个全面的软件平台,包括 ST 产品的每个系列, ( 如 STM32Cube_F1 是针对 STM32F1 系列)。平台包括了 STM32Cube 硬件抽象层(HAL) 和一套中间组件(RTOS,USB,FS,TCP 等等)。 STM32Cube 是由 ST 公司原创倡议,旨在减少开发负担、时间和费用,为开 发者提供轻松的开发体验。 STMCube 覆盖了 STM32 全系列。 其中 STM32CubeMX 是上位机配置软件,可以根据使用者的选择生成底层初始化代码。 硬件抽象层 (HAL), 便是 CubeMX 配套的库, HAL 库屏蔽了复杂的硬件寄存器操作, 统一了 外设的接口函数( 包含 USB/以太网等复杂外设),代码结构强壮, 已通过 CodeSonar 认证。 同时, HAL 还集成了广泛的例程,可以运行在不同意法半导体 的开发板上。 YS-F1Pro 开发板是硬石团队研发的针对 STM32F103 芯片的综合性实验测试 平台,开发板几乎囊括了芯片所有的外设,这对新手入门是非常好的学习平台, 开发板几乎所有芯片采购来着嘉立创平台,芯片质量有保证, 这与同行还是有很 大区别的。 YS-F1Pro 开发板是一款性价比极高的 STM32 开发板, 接口齐全,我们 特意添加了电机控制部分接口,包括舵机、步进电机、有刷电机、无刷电机控制 接口。 本文档的一个最重要目标是让完全小白都可以轻松愉快的入门学习STM32, 最终掌握 STM32 的基本编程方法,学会将 STM32CubeMX 应用到自己 DIY 应用 中去

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值