Keil MDK5 STM32F401CCU6开发环境配置
Windows下使用Keil MDK5进行stm32f401cc的开发和编译, 配合ST-LINK工具进行烧录, 使用原生非HAL的方式.
硬件
STM32F4系列基于Cortex M4内核, 于2011年发布, 上市已经十年了. 相对于基于Cortex M3的产品, STM32F4最大的优势是新增了硬件FPU单元以及DSP指令, 同时主频也提高到了168Mhz(可获得210DMIPS的处理能力), 这使得STM32F4适用于需要浮点运算或DSP处理的应用.
STM32F4相对于STM32F1,主要优势如下
- 采用Cortex M4内核, 带FPU和DSP指令集, 而STM32F1采用的是Cortex M3内核, 不带FPU和DSP指令集
- 更多的资源, STM32F4有 192KB 片内SRAM, 带摄像头接口(DCMI), 加密处理器(CRYP), USB高速OTG, 真随机数发生器, OTP存储器等
- 增强的外设功能. 对于相同的外设部分, STM32F4具有更快的模数转换速度、更低的ADC/DAC工作电压, 32位定时器, 带日历功能的实时时钟(RTC), IO复用功能大大增强, 4K字节的电池备份SRAM以及更快的USART和SPI通信速度
- 更高的性能. STM32F4最高运行频率可达168Mhz, 而STM32F1只能到72Mhz, STM32F4拥有ART自适应实时加速器, 可以达到相当于FLASH零等待周期的性能, STM32F1则需要等待周期, STM32F4的FSMC采用32位多重AHB总线矩阵, 相比STM32F1总线访问速度明显提高
- 更低的功耗, 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.
外观
电路图(不完全一致)
ST-Link 烧录器
使用普通的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个目录
- 复制Libraries\CMSIS目录下的Device和Include目录到libraries, 其他目录不需要
- 复制Libraries\STM32F4xx_StdPeriph_Driver整个目录到libraries
- MDK-ARM
用于放置Keil MDK项目文件, 以及项目开发过程中生成的临时文件 - USER
- 复制 Project\STM32F4xx_StdPeriph_Templates 下面的stm32f4xx_conf.h, stm32f4xx_it.c, stm32f4xx_it.h三个文件到这个目录
- 用于放置用户编写的代码
在Keil uVision5中创建项目
Project -> New uVision Project
, 选择前面的user目录, 使用名称test001, 保存- 选择芯片型号stm32f401cc
配置项目
点击Manage Project Items
- 修改project targets名称为test001
- 添加groups
- CMSIS
- StdPeriph_Driver
- Startup
- 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++
- Define: 写入 USE_STDPERIPH_DRIVER,STM32F401xx
- 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中
- 点击configure target options , 定位到Debug, Use选择ST-Link Debuger, 点击Settings
- 如果Debug Adapter里时空白没有显示ST-LINK/V2, 去windows设备管理器看下设备是否正常
- 切换到Flash Download标签, 勾选Reset and Run
- 点击Download按钮, 或者按F8, 进行烧录
Keil MDK5 STM32F401CCU6开发环境配置相关推荐
- [Keil] MDK5 集成开发环境搭建与注册破解
PC :Win10 Keil:MDK5.23 一.软件包 1. 1 下载 MDK-ARM 1.1.1 打开Keil 官网(http://www.keil.com),进入导航栏[Download],选择 ...
- STM32F103C8T6基础开发教程(HAL库)—开发环境配置
STM32F103C8T6基础开发教程目录 STM32F103C8T6基础开发教程(HAL库)-开发环境配置 STM32F103C8T6基础开发教程(HAL库)-Keil添加注释的快捷键 STM32F ...
- 树莓派Raspberry Pico RP2040 开发环境配置完全缝合终极版C-SDK
树莓派Raspberry Pico RP2040 开发环境配置骨灰版 总览目录 树莓派Raspberry Pico RP2040 开发环境配置骨灰版 前置说明 0.1 关于调试使用的Debugger ...
- Win10下Keil5的C51和ARM共存的开发环境配置
文章目录 概述 正文 1.安装 C51 2.安装 MDK 3.C51 和 MDK 共存 4.注册 5.安装 STM32 PACK 6.更改配色 结语 概述 在学完51单片机就要学习32单片机了,由于二 ...
- [物联网] - [STM32/51|JavaWeb|微信小程序] - 2.开发环境配置
注意 单片机方面首先以STM32F407为主,故在与51对接前将不赘述51开发环境配置部分.又因仅单片机开发部分环境配置最为麻烦,故此处仅介绍单片机部分开发环境配置.本系列默认读者拥有最基础的Java ...
- Python开发环境配置
好久没有写博客了,自从6月份毕业后,进入一家做书法.字画文化宣传的互联网公司(www.manyiaby.com),这段时间一直在进行前端开发,对于后端的使用很少了,整天都是什么html.css.jav ...
- vue如何配置服务器端跨域_vue开发环境配置跨域,一步到位
本文要实现的是:使用vue-cli搭建的项目在开发时配置跨域,上线后不做任何任何修改,接口也可以访问 阅读时间需要三分钟 production:产品 生产环境 development:开发 开发环境 ...
- 安装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月)的下载和安装.与其说是安装,不 ...
- ug二次开发环境可以用c语言吗,NX二次开发(1):开发环境配置
最近小编开始走上NX的二次开发之路,驱动我学习NX二次开发主要是兴趣使然.对NX进行二次开发,首先需要配置好开发环境,下面跟着小编踏上二次开发的道路吧! 本文以NX11.0为例,介绍如何在VS2013 ...
- perl开发环境配置(Database,SOCKET,CISCO)j(ReShip)
perl开发环境配置(Database,SOCKET,CISCO) 1. Oracle Client Enviroment 2. Perl Modules Installation 1. Oracle ...
最新文章
- java验证注册页面_Java使用正则表达式对注册页面进行验证功能实现
- linux shell 字符串 转 数组 列表 分隔符 字符串 转 数组
- Hive数据导入Elasticsearch
- 光源时间_您的国美备战时间已不足一个月!绝密国美考点、考场、光源分析送上!...
- java 反射 new class_Java高级特性-反射:不写死在代码,还怎么 new 对象?
- 一文搞定Python正则表达式
- 【java】java 多线程 异步计算 FutureTask 源码详解
- 【报告分享】2021年中国人工智能产业研究报告:数字经济时代的产业升级探索.pdf(附下载链接)...
- C# 中 动态获得或设置一个对象的值
- ios6.x 插件介绍及常用源
- 安装MathType及使用
- oracle txn,Oracle 11gR2上遇到blocking txn id for DDL等待事件,11gr2txn
- 密码库LibTomCrypt学习记录——(2.3)分组密码算法的工作模式——ECB代码示例
- 阻尼效果总结(顶部图片放大效果)
- 阿里云实时大数据解决方案,助力企业实时分析与决策
- Python异常和异常处理
- 微信无法拖拽文件解决办法
- Typecho主题Brave—勇敢爱
- Win10:解决安装第三方杀毒软件(金山毒霸、腾讯管家、360等)导致安全中心一片空白,只显示安全性概览
- 家庭健身赛道闯入新选手,一面智能镜撑起一座健身房