高血压专题网,内容丰富有趣,生活中的好帮手!
高血压专题网 > Keil MDK5 STM32F401CCU6开发环境配置

Keil MDK5 STM32F401CCU6开发环境配置

时间:2019-09-16 00:59:17

相关推荐

Keil MDK5 STM32F401CCU6开发环境配置

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

硬件

STM32F4系列基于Cortex M4内核, 于发布, 上市已经十年了. 相对于基于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 FPU80 MHz maximum frequency256k flash64k ramUFQFPN 封装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 -- GNDCLK -- SWCLKIO -- SWDIOV3 -- 3.3V

USB2TTL 转接卡

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

安装说明

ST官方库: 前往/, 点击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整个目录到librariesMDK-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 CMSISStdPeriph_DriverStartupUser

对每个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,STM32F401xxInclude 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_ASSERTvoid 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, 进行烧录

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。