文章目录

  • 1.前言
  • 2.开发工具
  • 3.简述开发工具生成的代码结构
    • 3.1 main.c简析
    • 3.2 代码运行流程以及HAL库的调用结构
      • 3.2.1 HAL_Init()
      • 3.2.2 SystemClock_Config()
  • 4. 话说在前面系列

1.前言

一直没有正经从完全无知开始去接触了解一款新的stm型号芯片。趁着这次11月份的新项目的开端需要用到stm32L0系列的单片机,搭载lora模块进行项目开发。这里开个系列博客记录下学习过程和调试过程。

2.开发工具

以前做stm32的开发都是基本用的stm32F系列,代码结构也是套用的公司以前的模板。
本次L0系列采用了st公司提供的一个新的(对笔者来说是新的,之前没用过,其实以前出来比较久了)开发代码生成工具-STMCubeMx。
下载地址,通常都是直奔官网-ST官网

这个就是安装完后的工具图标。具体安装下载过程这里不做赘述,不了解的朋友可自行百度。

3.简述开发工具生成的代码结构

Stm32CubeMx自动用户所选的IC型号以及需要用到的mcu资源,外设等自动生成相应的代码,生成的代码使用HAL库。其代码结构基本不需要进行什么修改(用户所选所设置皆正确的情况下),仅仅需要对一些HAL中的回调进行重写(如果你需要)。

如图,代码编译工具还是使用keil软件,根据图中代码结构可以很清晰的看到整个代码分为
Application和Drivers(附加CMSIS)
Application里分为MDK-ARM和User。
MDK-ARM是代码工程的一个目录(基于编译,比如编译生成文件,中间文件.o之类的)
User是用户程序的主入口,如main.c等。
需要注意的是User中还包含除main.c之外的两个文件,其中一个msp文件是工具自动生成的,后面分析。ic文件则是和中断回调相关的,这个相比都比较清楚。

在Drivers中包含HAL_Driver和CMSIS.
CMSIS则是和内核相关的,如M0,M3等之类的内核。
HAL_Driver则是st给用户提供一些接口,如flash,rtc等的操作接口。

3.1 main.c简析

最简单main.c里面的代码至少包括三部分:HAL_Init,SystemClock_Config,while(1);

int main(void)
{HAL_Init(); //HAL库的初始化SystemClock_Config();//系统时钟配置初始化while(1)//主程序的运行{}
}

3.2 代码运行流程以及HAL库的调用结构

3.2.1 HAL_Init()

/*** @brief This function configures the Flash prefetch, Flash preread and Buffer cache,*        Configures time base source, NVIC and Low level hardware* @note This function is called at the beginning of program after reset and before*       the clock configuration* @note The time base configuration is based on MSI clock when exiting from Reset.*       Once done, time base tick start incrementing.*        In the default implementation,Systick is used as source of time base.*        the tick variable is incremented each 1ms in its ISR.* @retval HAL status*/
HAL_StatusTypeDef HAL_Init(void)
{HAL_StatusTypeDef  status = HAL_OK;/* Configure Buffer cache, Flash prefetch,  Flash preread */
#if (BUFFER_CACHE_DISABLE != 0)__HAL_FLASH_BUFFER_CACHE_DISABLE();
#endif /* BUFFER_CACHE_DISABLE */#if (PREREAD_ENABLE != 0)__HAL_FLASH_PREREAD_BUFFER_ENABLE();
#endif /* PREREAD_ENABLE */#if (PREFETCH_ENABLE != 0)__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif /* PREFETCH_ENABLE *//* Use SysTick as time base source and configure 1ms tick (default clock after Reset is MSI) */if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK){status = HAL_ERROR;}else{/* Init the low level hardware */HAL_MspInit();}/* Return function status */return status;
}

这里抽出2个关键函数:
HAL_InitTick,HAL_MspInit
可以看到mcu一启动则调用HAL_InitTick,它的功能是使用SysTick作为时基源并配置1ms刻度(复位后的默认时钟为MSI)
如果该函数出错,则调用HAL_MspInit。
这里提下该函数HAL_MspInit是被__weak修饰,叫做弱函数。被这种修饰的函数,通常需要用户自己去实现。实现的位置在哪里?还记得前面提到msp文件吗,就在那里面,当然你也可以写到你想写的地方,msp这个文件只是为了方面管理整个代码工程中的需要重写的函数。

3.2.2 SystemClock_Config()

/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage */__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;RCC_OscInitStruct.MSIState = RCC_MSI_ON;RCC_OscInitStruct.MSICalibrationValue = 0;RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}
}

这里可以看到对于mcu的时钟选择配置,完全对上刚开始创建工程时的选择。先简单将这个函数分隔下:
第一步:配置内部主稳压器的输出电压
第二步:初始化RCC振荡器。HAL_RCC_OscConfig,这里选择了MSI时钟,频率是4.194Mhz
第三步:初始化CPU,AHB和APB总线时钟,HAL_RCC_ClockConfig
如图;

ps:关于STM32l0的时钟相关,可以参考datasheet。也可以往官网下载(英文版)

4. 话说在前面系列

在使用St’m32CubeMx生成代码的时候,后期单独修改代码的时候,需要注意:
1.stm32l0xx_hal_conf.h 头文件指定了哪些文件是否参与编译,文件内是按模块声明的。
2.第一次调试测试单独功能的时候,可以使用工具生成单独模块的代码进行单独测试。

#下一章传送门:STM32L0系列之【LED点灯,看门狗IWDG】

STM32L0系列之【工程开始】相关推荐

  1. STM32L0 系列 EEPROM 读写,程序卡死?

    STM32L0 系列EEPROM读写,使用过程必须注意到的问题,踩坑史 = =!......by 矜辰所致 目录 前言 一.写入地址问题 二.写入时候容易死机问题 2.1 问题的原因 2.2 问题的解 ...

  2. STM32L0系列串口重定义的方法

    STM32L0系列串口重定义的方法 芯片型号:STM32L071RBT6 本篇重点:将printf( ) 函数重定义到USART1 集成开发工具(IDE):IAR 在uart已经配置好情况下,重定义f ...

  3. 基于Cortex M0+的STM32L0系列简介

    L0系列是意法半导体于2014年新推出的超低功耗的MCU,基于ARM Cortex M0+内核.目前有STM32L0x1,STM32L0x2,STM32L0x3三个子系列,默认主频为32M,RAM都是 ...

  4. STM32L0系列之【LPTIM定时器】

    上一章:STM32L0系列之[串口收发] 文章目录 1.LPTIM介绍 2.配置时钟源并且启动 3.初始化配置LPTIM 4.LPTIM中断处理函数 5.启用LPTIM,中断触发回调函数 6.main ...

  5. STM32L0系列之【串口收发】

    上一章:STM32L0系列之[TIM通用定时器] 文章目录 1.串口1 USART1初始化 [注意使能接收中断] 2.串口接收中断 3.串口接收中断完成回调函数 4.重定向输入输出,将输出重定向至pr ...

  6. STM32L0系列之【EEPROM读写】

    上一章:STM32L0系列之[LED点灯,看门狗IWDG] /*------------------------------------------------------------ Func: E ...

  7. 前端系列——Electron工程构建(普通工程,Vue集成)

    前端系列--Electron工程构建(普通工程,Vue集成) Electron 前言 创建Electron工程(npm) 1.创建项目文件夹 2.初始化 3.安装Electron环境 遇到的错误 完成 ...

  8. 基于stm32L0系列的AD7682驱动程序

    基于stm32L0系列的AD7682驱动程序 //调用u16 AD7682(u8 adINx),即可切换通道,得到返回的ADC值.实测程序可用,ADC值为0-65535 //CFG_COM=[13:0 ...

  9. STM32L0系列之ADC采集

    STM32L0开发系列--01 ADC采集 前言 使用芯片:STM32L051C8T6 软件平台:KEIL V5.STM32CubeL0 库函数:HAL 一.原理图 本文介绍在STM32上使用ADC1 ...

最新文章

  1. 【Jekyll搭建GITHUB个人博客】安装Ruby 环境、包管理器 RubyGems、Jekyll与错误解决...
  2. Window环境下配置MySQL 5.6的主从复制、备份恢复
  3. PMP之工具与技术---假设条件和制约因素
  4. 第23天:js-数据类型转换
  5. 数据库备份checksum选项你会用么?
  6. iOS 给测试人员测试手机APP的四种方法:真机运行(略),打ipa包,(testFlighe)邮件,蒲公英(一)打ipa包
  7. 数学建模——论文排版
  8. 智慧交通管理和服务平台系统集成解决方案
  9. 区块链底层架构概览:第一原则框架
  10. PhotoShop(2)ps常用工具和操作,ps 切图,cutterman下载使用
  11. linux下find命令的详细说明
  12. Laravel 之搜索引擎elasticsearch扩展Scout
  13. OracleDataAdapter.Fill()处于无限等待中 【已解决】
  14. CSS预处理器——Sass、LESS和Stylus区别及联系
  15. 指定JDK运行Jar包
  16. windows 2003 下SERVU:无法开始服务器.服务器执行缺少
  17. 教会AI认识麻将牌之实践篇
  18. C#之Sokect通讯实例
  19. python实现键盘监听
  20. 中国移动,联通,电信

热门文章

  1. 180701 icon文件查找与转换网站
  2. html5+canvas+九宫格,javascript+canvas制作九宫格小程序
  3. OSI七层协议和Tcp/IP五层协议,路由器交换机和HUB的区别
  4. Android ndk 编译出现'Build Project' has encountered a problem.Errors occurred during the build
  5. dnw下载文件时can not open /dev/secbulk0的解决方法
  6. PageOffice国产版(统信UOS操作系统)与Window版的区别
  7. 洛谷 P1456 Monkey King 题解
  8. 嵌入式硬件开发工程师涉及哪些工作内容?
  9. 使用Ajax传用户信息数据到后端
  10. XCP学习笔记 ———— CTOs