Windows下使用Keil MDK5进行stm32f401cc的开发和编译, 配合ST-LINK工具进行烧录, 使用原生非HAL的方式.

硬件

STM32F4系列基于Cortex M4内核, 于2011年发布, 上市已经十年了. 相对于基于Cortex M3的产品, STM32F4最大的优势是新增了硬件FPU单元以及DSP指令, 同时主频也提高到了168Mhz(可获得210DMIPS的处理能力), 这使得STM32F4适用于需要浮点运算或DSP处理的应用.

STM32F4相对于STM32F1,主要优势如下

  1. 采用Cortex M4内核, 带FPU和DSP指令集, 而STM32F1采用的是Cortex M3内核, 不带FPU和DSP指令集
  2. 更多的资源, STM32F4有 192KB 片内SRAM, 带摄像头接口(DCMI), 加密处理器(CRYP), USB高速OTG, 真随机数发生器, OTP存储器等
  3. 增强的外设功能. 对于相同的外设部分, STM32F4具有更快的模数转换速度、更低的ADC/DAC工作电压, 32位定时器, 带日历功能的实时时钟(RTC), IO复用功能大大增强, 4K字节的电池备份SRAM以及更快的USART和SPI通信速度
  4. 更高的性能. STM32F4最高运行频率可达168Mhz, 而STM32F1只能到72Mhz, STM32F4拥有ART自适应实时加速器, 可以达到相当于FLASH零等待周期的性能, STM32F1则需要等待周期, STM32F4的FSMC采用32位多重AHB总线矩阵, 相比STM32F1总线访问速度明显提高
  5. 更低的功耗, STM32F40x的功耗为 238uA/Mhz, 其中低功耗版本的STM32F401更是低到 140uA/Mhz, 而STM32F1则为 421uA/Mhz

STM32F401CCU6 核心板

参数

  • ARM 32-bit Cortex-M4 with FPU
  • 80 MHz maximum frequency
  • 256k flash
  • 64k ram
  • UFQFPN 封装48pin

STM32F401CCU6与STM32F103C8T6相比, 引脚基本兼容, 但是需要注意一个引脚PB11, PB11引脚不能当GPIO使用, 同时必须外接2.2UF电容, 因此USART3也不复存在, 在STM32F401中换成了USART6. 下面的开发板PB口就没有PB11.

外观

电路图(不完全一致)

使用普通的4线 ST-Link V2, 也可以使用增加了串口的V2.1

ST-Link 与 stm32核心板的连接需要4根线, 连接关系为

G   -- GND
CLK -- SWCLK
IO  -- SWDIO
V3  -- 3.3V

USB2TTL 转接卡

在观察串口输出时需要使用.

安装说明

ST官方库: 前往https://www.st.com/, 点击Tools&Software > Embedded Software > MCU & MPU Embedded Software > STM32 Embedded Software > STM32 Standard Peripheral Libraries(链接), 下载F4, 解压备用.

ST官方库结构说明

STM32F4xx_DSP_StdPeriph_Lib_V1.8.0

目录结构及说明

├─Libraries
│  ├─CMSIS
│  │  ├─Device
│  │  │  └─ST
│  │  │      └─STM32F4xx
│  │  │          ├─Include                # 需要
│  │  │          └─Source
│  │  │              └─Templates
│  │  │                  ├─arm            # startup文件, 需要
│  │  │                  ├─gcc_ride7
│  │  │                  ├─iar
│  │  │                  ├─SW4STM32
│  │  │                  ├─TASKING
│  │  │                  └─TrueSTUDIO
│  │  ├─Documentation
│  │  ├─DSP_Lib
│  │  ├─Include                           # 需要
│  │  ├─Lib
│  │  │  ├─ARM
│  │  │  └─GCC
│  │  └─RTOS
│  │      └─Template
│  └─STM32F4xx_StdPeriph_Driver           # 需要. 注意里面的xx_fmc.c和xx_fsmc.c不要包含, 因为这两个# 用到的变量在F401里面没有, 只在少数几个F4xx型号里有.
│      ├─inc
│      └─src
├─Project
│  ├─STM32F4xx_StdPeriph_Examples         # 官方的代码例子
│  └─STM32F4xx_StdPeriph_Templates        # 需要stm32f4xx_conf.h, stm32f4xx_it.c, stm32f4xx_it.h
│      ├─EWARM
│      ├─MDK-ARM
│      ├─SW4STM32
│      └─TrueSTUDIO
├─Utilities
│  ├─Media
│  ├─ST
│  │  └─STemWin
│  │      └─Software
│  ├─STM32_EVAL
│  │  ├─Common
│  │  ├─STM3240_41_G_EVAL
│  │  ├─STM324x7I_EVAL
│  │  └─STM324x9I_EVAL
│  └─Third_Party
└─_htmresc

开发说明

手工创建项目

创建项目

创建目录并填充文件

对于项目test001, 创建工作目录test001, 在工作目录下创建libraries, mdk-arm, user 这3个目录

  1. 复制Libraries\CMSIS目录下的Device和Include目录到libraries, 其他目录不需要
  2. 复制Libraries\STM32F4xx_StdPeriph_Driver整个目录到libraries
  3. MDK-ARM
    用于放置Keil MDK项目文件, 以及项目开发过程中生成的临时文件
  4. USER
    • 复制 Project\STM32F4xx_StdPeriph_Templates 下面的stm32f4xx_conf.h, stm32f4xx_it.c, stm32f4xx_it.h三个文件到这个目录
    • 用于放置用户编写的代码

在Keil uVision5中创建项目

  1. Project -> New uVision Project, 选择前面的user目录, 使用名称test001, 保存
  2. 选择芯片型号stm32f401cc

配置项目

点击Manage Project Items

  1. 修改project targets名称为test001
  2. 添加groups
    1. CMSIS
    2. StdPeriph_Driver
    3. Startup
    4. User

对每个group, 添加的文件为

  • CMSIS

    • system_stm32f4xx.c
  • StdPeriph_Driver
    • 添加 libraries\STM32F4xx_StdPeriph_Driver\src 下面的所有c文件, 除了 stm32f4xx_fmc.c 和 stm32f4xx_fsmc.c
  • Startup
    • 添加 libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm 下面的 startup_stm32f401xx.s 文件
  • User
    • 添加 user 目录下的 stm32f4xx_it.c 文件
    • 添加 user 目录下的其他文件

点击configure target options , 定位到c/c++

  1. Define: 写入 USE_STDPERIPH_DRIVER,STM32F401xx
  2. Include Paths: 如果是按上面的目录结构组织的项目, 可以直接复制下面的配置
..\libraries\CMSIS\Include;..\libraries\CMSIS\Device\ST\STM32F4xx\Include;..\libraries\STM32F4xx_StdPeriph_Driver\inc;..\user

在c/c++下有完整的 compiler control string

--c99 --gnu -c --cpu Cortex-M4.fp -g -O0 --apcs=interwork --split_sections -I ../libraries/CMSIS/Include -I ../libraries/CMSIS/Device/ST/STM32F4xx/Include -I ../libraries/STM32F4xx_StdPeriph_Driver/inc -I ../user
-I./RTE/_stm32f401esp8366
-IC:/Keil_v5/ARM/PACK/Keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include
-IC:/Keil_v5/ARM/CMSIS/Include
-D__UVISION_VERSION="525" -DSTM32F401xC -DUSE_STDPERIPH_DRIVER -DSTM32F401xx
-o .\Objects\*.o --omf_browse .\Objects\*.crf --depend .\Objects\*.d

示例代码

使用开发板自带的led灯实现间隔1秒的亮灭效果.main.c

#include "main.h"static __IO uint32_t uwTimingDelay;
RCC_ClocksTypeDef RCC_Clocks;static void Delay(__IO uint32_t nTime);void LED_Init(void)
{GPIO_InitTypeDef  aaa;// 使能指定的GPIO模块时钟--默认复位后开机时钟不会全部提供给各个模块 使用时需要自己开启RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);    // 初始化引脚aaa.GPIO_Pin = GPIO_Pin_13;    // 引脚号选择 PC13: RCC_AHB1Periph_GPIOC, GPIOC, GPIO_Pin_13aaa.GPIO_Mode = GPIO_Mode_OUT; // 输出模式aaa.GPIO_OType =  GPIO_OType_PP;  // 推挽输出aaa.GPIO_Speed = GPIO_High_Speed; // 高速GPIO_Init(GPIOC, &aaa);
}void TIM2_init(void)
{TIM_TimeBaseInitTypeDef  aaa;// 使能对应模块的时钟 TIM2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 初始化定时器aaa.TIM_Prescaler = 8400;  // 通过prescaler将84MHz降为10KHzaaa.TIM_Period    = 10000; // 再通过period设置计时器间隔为上面频率的10K个周期, 即1saaa.TIM_CounterMode = TIM_CounterMode_Up; // 选择递增模式aaa.TIM_ClockDivision = TIM_CKD_DIV1;     // 1分频 1  2  4TIM_TimeBaseInit(TIM2, &aaa);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//使能TIM2的更新中断TIM_Cmd(TIM2, ENABLE); // 使能TIM2
}void NVIC_INIT(void)
{NVIC_InitTypeDef  ccc;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组  2分组ccc.NVIC_IRQChannel = TIM2_IRQn;ccc.NVIC_IRQChannelCmd = ENABLE;ccc.NVIC_IRQChannelPreemptionPriority = 0;ccc.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&ccc);
}void TIM2_IRQHandler(void)
{TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除溢出中断标志位GPIO_ToggleBits(GPIOC, GPIO_Pin_13);        // 触发值交替变化
}int main(void)
{LED_Init();//初始化LEDGPIO_WriteBit(GPIOC, GPIO_Pin_13, 0);TIM2_init();NVIC_INIT();while(1)//卡住{}
}/*** @brief  Inserts a delay time.* @param  nTime: specifies the delay time length, in milliseconds.* @retval None*/
void Delay(__IO uint32_t nTime)
{ uwTimingDelay = nTime;while(uwTimingDelay != 0);
}/*** @brief  Decrements the TimingDelay variable.* @param  None* @retval None*/
void TimingDelay_Decrement(void)
{if (uwTimingDelay != 0x00){ uwTimingDelay--;}
}#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{ /* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* Infinite loop */while (1){}
}
#endif

main.h

#ifndef __MAIN_H
#define __MAIN_H#include "stm32f4xx.h"void TimingDelay_Decrement(void);#endif /* __MAIN_H */

学习开发包中的例子

在官方库的压缩包里, 包含着这个版本各个外设功能的代码例子, 可以直接参考.

烧录

在Keil uvision5中

  1. 点击configure target options , 定位到Debug, Use选择ST-Link Debuger, 点击Settings
  2. 如果Debug Adapter里时空白没有显示ST-LINK/V2, 去windows设备管理器看下设备是否正常
  3. 切换到Flash Download标签, 勾选Reset and Run
  4. 点击Download按钮, 或者按F8, 进行烧录

Keil MDK5 STM32F401CCU6开发环境配置相关推荐

  1. [Keil] MDK5 集成开发环境搭建与注册破解

    PC :Win10 Keil:MDK5.23 一.软件包 1. 1 下载 MDK-ARM 1.1.1 打开Keil 官网(http://www.keil.com),进入导航栏[Download],选择 ...

  2. STM32F103C8T6基础开发教程(HAL库)—开发环境配置

    STM32F103C8T6基础开发教程目录 STM32F103C8T6基础开发教程(HAL库)-开发环境配置 STM32F103C8T6基础开发教程(HAL库)-Keil添加注释的快捷键 STM32F ...

  3. 树莓派Raspberry Pico RP2040 开发环境配置完全缝合终极版C-SDK

    树莓派Raspberry Pico RP2040 开发环境配置骨灰版 总览目录 树莓派Raspberry Pico RP2040 开发环境配置骨灰版 前置说明 0.1 关于调试使用的Debugger ...

  4. Win10下Keil5的C51和ARM共存的开发环境配置

    文章目录 概述 正文 1.安装 C51 2.安装 MDK 3.C51 和 MDK 共存 4.注册 5.安装 STM32 PACK 6.更改配色 结语 概述 在学完51单片机就要学习32单片机了,由于二 ...

  5. [物联网] - [STM32/51|JavaWeb|微信小程序] - 2.开发环境配置

    注意 单片机方面首先以STM32F407为主,故在与51对接前将不赘述51开发环境配置部分.又因仅单片机开发部分环境配置最为麻烦,故此处仅介绍单片机部分开发环境配置.本系列默认读者拥有最基础的Java ...

  6. Python开发环境配置

    好久没有写博客了,自从6月份毕业后,进入一家做书法.字画文化宣传的互联网公司(www.manyiaby.com),这段时间一直在进行前端开发,对于后端的使用很少了,整天都是什么html.css.jav ...

  7. vue如何配置服务器端跨域_vue开发环境配置跨域,一步到位

    本文要实现的是:使用vue-cli搭建的项目在开发时配置跨域,上线后不做任何任何修改,接口也可以访问 阅读时间需要三分钟 production:产品 生产环境 development:开发 开发环境 ...

  8. 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

    1.下载和安装OpenCV SDK VS2010不用说,肯定都安装了吧.来说说当前最新的OpenCV版本2.4.8(2014年2月24日),2.4.9 (2014年4月)的下载和安装.与其说是安装,不 ...

  9. ug二次开发环境可以用c语言吗,NX二次开发(1):开发环境配置

    最近小编开始走上NX的二次开发之路,驱动我学习NX二次开发主要是兴趣使然.对NX进行二次开发,首先需要配置好开发环境,下面跟着小编踏上二次开发的道路吧! 本文以NX11.0为例,介绍如何在VS2013 ...

  10. perl开发环境配置(Database,SOCKET,CISCO)j(ReShip)

    perl开发环境配置(Database,SOCKET,CISCO) 1. Oracle Client Enviroment 2. Perl Modules Installation 1. Oracle ...

最新文章

  1. java验证注册页面_Java使用正则表达式对注册页面进行验证功能实现
  2. linux shell 字符串 转 数组 列表 分隔符 字符串 转 数组
  3. Hive数据导入Elasticsearch
  4. 光源时间_您的国美备战时间已不足一个月!绝密国美考点、考场、光源分析送上!...
  5. java 反射 new class_Java高级特性-反射:不写死在代码,还怎么 new 对象?
  6. 一文搞定Python正则表达式
  7. 【java】java 多线程 异步计算 FutureTask 源码详解
  8. 【报告分享】2021年中国人工智能产业研究报告:数字经济时代的产业升级探索.pdf(附下载链接)...
  9. C# 中 动态获得或设置一个对象的值
  10. ios6.x 插件介绍及常用源
  11. 安装MathType及使用
  12. oracle txn,Oracle 11gR2上遇到blocking txn id for DDL等待事件,11gr2txn
  13. 密码库LibTomCrypt学习记录——(2.3)分组密码算法的工作模式——ECB代码示例
  14. 阻尼效果总结(顶部图片放大效果)
  15. 阿里云实时大数据解决方案,助力企业实时分析与决策
  16. Python异常和异常处理
  17. 微信无法拖拽文件解决办法
  18. Typecho主题Brave—勇敢爱
  19. Win10:解决安装第三方杀毒软件(金山毒霸、腾讯管家、360等)导致安全中心一片空白,只显示安全性概览
  20. 家庭健身赛道闯入新选手,一面智能镜撑起一座健身房

热门文章

  1. 加入域的计算机如何本地用户登录,关于本地缓存登陆和域用户将计算机加入域的问题(转)...
  2. Ubuntu18.04笔记本触控板失效解决办法
  3. 一起撸过游戏的下铺兄弟,你还在玩游戏吗
  4. win10cmd重置系统_win10命令行恢复出厂设置
  5. Linux Entering rescue mode
  6. 解析:Python就业方向有哪些?
  7. word压缩软件,免费
  8. gitlab安装注册记录——gitlab(一)
  9. Stata:快速转换工作路径
  10. PostgreSql对比MySQL优势