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. 关于input单选框的radio属性

    最近在做前端页面的时候遇到一个问题(后端php猴子前端不怎么写) 我写了一段代码: <form action="">        <label for=&quo ...

  2. bcloud_bctf_2016

    目录 bcloud_bctf_2016 总结 题目分析 checksec 函数分析 main welcome get_name get_org_host menu new_note show_note ...

  3. CVE 2021-44228 Log4j-2命令执行复现及分析

    12月11日:Apache Log4j2官方发布了2.15.0 版本,以修复CVE-2021-44228.虽然 2.15.0 版本解决了Message Lookups功能和JNDI 访问方式的问题,但 ...

  4. LuoguP7859 [COCI2015-2016#2] GEPPETTO 题解

    Content 有 \(n\) 个数 \(1\sim n\).你需要在其中选若干个数.但是还有 \(m\) 个限制,第 \(i\) 个限制格式为 \(a_i\) 不能和 \(b_i\) 一起选.问你一 ...

  5. CF1443A Kids Seating 题解

    Content 有 \(t\) 组询问,每组询问给定一个数 \(n\),试构造出一个长度为 \(n\) 的数列 \(\{a_i\}_{i=1}^n\),使得: \(\forall i\in[1,n], ...

  6. java 常用类库:Object类和Objects类

    1,Object类: Object类是所有的类,数组,枚举的父类,也就是说,JAVA中允许把任何的对象赋值给Object类(包括基础数据类型),当定义一个类的时候,没有使用extends关键字显示指定 ...

  7. python进程管理工具Supervisor

    一.Supervisor简单介绍 supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序.supervisor与lau ...

  8. host-manager does not exist or is not a readable directory

    当tomcat启动出现这个错误时,按照如下步骤可以解决: 1.删掉F:\tomcat20111101\apache-tomcat-6.0.26\conf\Catalina目录下的localhost文件 ...

  9. Windows系统安装ActiveMQ

    1.下载安装包:https://activemq.apache.org/components/classic/download/ 选择自己的版本进行下载 2.安装JDK 3.把下载的ActiveMQ压 ...

  10. 【LeetCode】211. Add and Search Word - Data structure design 添加与搜索单词 - 数据结构设计

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,211,搜索单词,前缀树,字典树 ...