完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
Windows下使用Keil MDK5进行stm32f401cc的开发和编译, 配合ST-LINK工具进行烧录, 使用原生非HAL的方式.
硬件 STM32F4系列基于Cortex M4内核, 于2011年发布, 上市已经十年了. 相对于基于Cortex M3的产品, STM32F4最大的优势是新增了硬件FPU单元以及DSP指令, 同时主频也提高到了168Mhz(可获得210DMIPS的处理能力), 这使得STM32F4适用于需要浮点运算或DSP处理的应用. STM32F4相对于STM32F1,主要优势如下
参数
电路图(不完全一致) ST-Link 烧录器 使用普通的4线 ST-Link V2, 也可以使用增加了串口的V2.1 ST-Link 与 stm32核心板的连接需要4根线, 连接关系为 G -- GND CLK -- SWCLK IO -- SWDIO V3 -- 3.3V USB2TTL 转接卡 在观察串口输出时需要使用. 安装说明 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个目录
点击Manage Project Items
在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_13 aaa.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; // 使能对应模块的时钟 TIM2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 初始化定时器 aaa.TIM_Prescaler = 8400; // 通过prescaler将84MHz降为10KHz aaa.TIM_Period = 10000; // 再通过period设置计时器间隔为上面频率的10K个周期, 即1s aaa.TIM_CounterMode = TIM_CounterMode_Up; // 选择递增模式 aaa.TIM_ClockDivision = TIM_CKD_DIV1; // 1分频 1 2 4 TIM_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();//初始化LED GPIO_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 %drn", 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中
|
|
|
|
只有小组成员才能发言,加入小组>>
3280 浏览 9 评论
2958 浏览 16 评论
3460 浏览 1 评论
9004 浏览 16 评论
4052 浏览 18 评论
1115浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 14:10 , Processed in 1.208616 second(s), Total 81, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号