Keil MDK STM32系列

概述

从前面介绍的STM32开发可以感受到, 虽然SPL对于纯寄存器方式开发已经是很大的进步, SPL将大部分寄存器配置做了很好的封装, 配置项简单易读, 但是外设与输出脚的映射关系, 配置项的数量, 配置之间的关联都使得配置难度并未降低, 在项目启动阶段依然要通过不断查阅MCU的用户手册去修改方案, 各种情况下的代码例程直接借鉴容易出错, 需要反复尝试, 往往在调通外设这一步就已经耗费了开发人员的大量时间.

所以ST将开发库的重心迁移到了HAL上, 配合HAL的就是STM32CubeMX这个图形化配置工具. 通过图形化界面, 通过预设的逻辑辅助生成代码模板. 这样可以将底层寄存器和外设的复杂定义和逻辑包装在工具界面之下, 避免开发人员进行重复的学习和试错, 节约开发人员的时间精力. 这也是市场上其他主流MCU的技术配套发展方向.

下面介绍STM32CubeMX的安装和使用

下载安装STM32CubeMX

官网地址 https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html

安装后, Alt+U 打开Embedded Software Package Manager, 在里面找到STM32F4, 勾选最高的那个版本, 当前是1.26.2, 点击下面的Install Now. 这个需要比较长时间.

对于1.26.2这个版本, 不要去尝试From Local, 因为这个版本的zip文件有两个, 一个1.26.0, 一个1.26.2的patch, 这两个包都下载到本地后, 尝试了无数次, From Local都会报错. 最后还是点Install Now, 让它从网络下载安装的.

配置项目

使用STM32CubeMX快速创建项目代码, 主要就是以下几步:

  • MCU选择
  • System Core -> SYS 配置A13, A14 (必须)
  • System Core -> RCC 配置时钟源 (必须)
  • Clock Configuration -> 配置系统时钟 (必须)
  • 配置各种外设

1. 选择MCU型号

点击主界面的ACCESS TO MCU SELECTOR, 会打开型号选择, 在左边勾选Arm Cortex-M4, 在右边选对应的型号, 然后点右上角的Start Project

2. PIN脚设置

上一步点击后, 就会进入Pinout & Configuration界面, 在左侧的列表中, 默认有改动的是System Core下的NVIC, 默认勾选的是旁边的SYS.

  1. System Core -> SYS, Debug 选择 Serial Wire, 这时候会看到图上的PA13和PA14被高亮, GPIO也会产生相应的配置. 这一步比较重要, 如果不配置, 编译好的固件写入MCU后, 再启动就连不上STLink了.
  2. System Core -> RCC, HSE和LSE, 都选择Crystal/Ceramic Resonator, 启用外部的高速和低速振荡源, 这时候GPIO中, PC14, PC15, PH0, PH1 会自动产生对应的配置
  3. Timers -> RTC 如果要启用外部时钟源, 勾选 Activate Clock Source, 这样在下一步的时钟配置中就可以选择内部或者外部时钟源
  4. Connectivity -> USART1, Mode 选择 Asynchronous, 其他默认, 在 System Core -> GPIO 下可以看到又增加了对应USART1的配置, PA9和PA10. 如果要选择PB6和PB7, 需要在右侧的Pinout图上取消PA9和PA10后, 在PB6, PB7上设置, 再到左侧菜单中选择
  5. 看项目需要, 可以继续选择SPI, ADC等

3. 时钟设置

点击上方的导航进入 Clock Configuration界面. 这里很直观地展示了HSE, LSE, HSI, LSI 这些时钟源与系统和外设的关联.

  • 如果使用默认的HSI, 时钟就是16MHz
  • 如果使用外部的HSE, 时钟就是25MHz(看具体的板子), 可以直接连到SYSCLK, 也可以通过PLL, 在HCLK处填入84MHz后回车, 软件会自动计算出前面部分正确的分频和倍频数字. SYSCLK的频率需要配置到MDK项目配置中的Xtal

4. 配置项目名称和路径

Toolchain/IDE 要选择 MDK-ARM, 版本选V5

5. 生成项目代码

点击右上角的GENERATE CODE就会生成代码, 代码可以直接用Keil MDK打开

外设配置步骤

配置定时器

通过TIMx配置

  • 勾选 Internal Clock
  • 配置下方参数
  • Counter Settings
    • Prescaler: 0
    • Counter Mode: Up
    • Counter Period: 1999 这里和Perscaler组合, 实现(0+1)(1999+1)个时钟的周期
    • Internal Clock Division (CKD): No division
    • auto-reload preload: Disable
  • Trigger Output (TRGO) Parameters
    • Master/Slave Mode (MSM bit): Disable
    • Trigger Envent Selection: Reset
  • NVIC Settings
    • TIM3 global interrupt: Enable

对应代码变化

stm32f4xx_hal_conf.h 启用TIM模块

#define HAL_TIM_MODULE_ENABLED

main.c

static void MX_TIM3_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 1999;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}

stm32f4xx_hal_msp.c 这里会一起处理其他的TIM实例

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM2)
{
// ...
}
else if(htim_base->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
} } void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM2)
{
//...
}
else if(htim_base->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_DISABLE();
HAL_NVIC_DisableIRQ(TIM3_IRQn);
} }

stm32f4xx_it.h 增加对应的定时中断处理

void TIM3_IRQHandler(void);

stm32f4xx_it.c

/**
* @brief This function handles TIM3 global interrupt.
*/
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim3);
}

参考

Keil MDK STM32系列(五) 使用STM32CubeMX创建项目基础结构的更多相关文章

  1. Keil MDK STM32系列(九) 基于HAL和FatFs的FAT格式SD卡TF卡读写

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  2. Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  3. Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  4. Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  5. Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  6. Keil MDK STM32系列(六) 基于抽象外设库HAL的ADC模数转换

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  7. Keil MDK STM32系列(七) STM32F4基于HAL的PWM和定时器

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  8. Keil MDK STM32系列(八) STM32F4基于HAL的PWM和定时器输出音频

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  9. stm32+lwip(一):使用STM32CubeMX生成项目

    我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...

随机推荐

  1. 设置项目的开始/完成日期(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 在设定完日程排定方法,或者不作任何设置,依其默认的[项目开始日期]的设置,接下来就要设置项目的开始时间了.依然是在[项目] ...

  2. CF1560D Make a Power of Two 题解

    Content 给定一个整数 \(n\).每次操作你可以做两件事情中的一件: 删去这个数中的一个数位(如果这个数只剩下一位,则可以把它删空). 在这个数的右边添加一个数位. 你可以以任意顺序执行无限次 ...

  3. java 数据类型:集合接口Collection之List~ArrayList:remove移除;replaceAll改变原有值;sort排序;迭代器listIterator();

    什么是List集合: 特点: 元素有序可重复的集合. 集合中每个元素都有其对应的顺序索引. List集合默认按元素的添加顺序设置元素的索引,索引从0开始.   List接口的常用方法: List可以使 ...

  4. 选课系统V1.0

    tree . . ├── bin │   ├── __init__.py │   └── start.py #启动文件 ├── conf │   ├── __init__.py │   └── set ...

  5. 在react项目中实现表格导出为Excel

    需求背景 数据表格有时需要增加导出Excel功能,大多数情况下都是后端出下载接口,前端去调用. 对于数据量少的数据,可以通过前端技术实现,减少后端工作. 实现方式 使用插件--xlsx 根据自己项目情 ...

  6. Mybatis-Plus一键生成代码

    Mybatis-Plus一键生成代码 一.闲言碎语 闲来无事看了看了MP的官网看到一键生成的代码更新了! 整个Ui风格都变了,遂决定瞅一眼新的代码生成器 官网地址~~ 二.引入依赖 新的代码生成只有在 ...

  7. Caused by: redis.clients.jedis.exceptions.JedisDataException: READONLY You can't write against a read only slave.

    Caused by: redis.clients.jedis.exceptions.JedisDataException: READONLY You can't write against a rea ...

  8. vsp配合Qt5开发,解决virtual void * __cdecl PopDialogManger::qt_metacast

    Qt错误提示 virtual void * __cdecl PopDialogManger::qt_metacast(char const*)"(?qt_metacast@PopDialog ...

  9. Python obj与JSON相互转换

    1 # _*_ coding:utf-8 _*_ 2 3 def showJson(self, pipefd): 4 overdict = args.__dict__ 5 # 此时就可以用json.d ...

  10. 【九度OJ】题目1126:打印极值点下标 解题报告

    [九度OJ]题目1126:打印极值点下标 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1126 题目描述: 在 ...