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. ciscn_2019_s_6

    例行检查 没有开启nx保护,考虑用shellcode来做这道题 程序放入ida查看 我们可以输入48个字符覆盖0使printf打印出bp的值 继续看这里,buf的大小实际上只有0x38的大小,但是re ...

  2. 【web】docker复现环境踩坑

    在先知看到有师傅发了个学习 P 牛的代码审计的文章,在 github 上下下来复现环境,结果 docker 各种问题,气死 安装 docker-compose:pip install -i https ...

  3. python selenium 多账户自动登入163邮箱

    pycharm一些快捷键: ' ctrl ' +' / ' :注释 ' Tab ' :同时缩进 ' shift ' +' Tab ' :左移 一次缩进 本文webinfo.txt路径:C:\Pytho ...

  4. ArcGIS中重采样栅格像元对齐问题

    转发自我的知乎文章 我们通常要进行基于像元的运算,往往我们的研究中涉及到多源数据,因此就需要对数据进行地理配准.空间配准.重采样等操作. 一开始,我认为相同的地理椭球与投影坐标系下,不同来源,不同分辨 ...

  5. THUSC 2021 游记

    想了想不往博客园放不行,还是放上来了. 原文 \[\texttt{Brief Introduction} \] 众所周知,THUSC2021 5 月 15-16 日在杭州市 XJ 中学举办,然而由于 ...

  6. CF1092B Teams Forming 题解

    Content 有 \(n\) 个学生,每个学生有一个能力值 \(a_i\).现在想把学生两两分成一组,但是不能让每个组里面的学生能力值不相同,因此可以通过刷题来提升自己的能力值,每次解出一道题,能力 ...

  7. mkdir创建目录时,如果上级目录没有是创建不成功的

    mkdir创建目录时,如果上级目录没有是创建不成功的 ,此时必须用 mkdirs()方法方可.

  8. mysql数据库,当数据类型是float时,查询居然查询不出数据来

    mysql数据库,当数据类型是float时,查询居然查询不出数据来,类似如下: 以后mysql数据库不用float类型,而double类型可以查得出来.

  9. Json解析案例-teachers数据集

    背景: 通过平台执行接口时,接口往往返回的JSON串,所以平台要能提供方便快捷的JSON解析函数. 一.Json字符串: 1 { 2 "lemon": { 3 "teac ...

  10. SpringBoot统一日志打印

    统一日志打印 @Slf4j @Aspect @Component public class ControllerLog { private static final ThreadLocal<Lo ...