Keil MDK5是一款常用的STM32开发软件,它不仅可以帮助开发者进行裸机编程,也可以支持各种操作系统的开发。当然,Keil MDK5的一个重要功能是支持仿真器,这是一个广泛应用于STM32仿真和调试过程中的工具。在STM32开发中,仿真器起到了至关重要的作用,本文将从仿真原理和具体实践两个方面,分享我在利用Keil MDK5仿真器进行STM32开发中的心得。
Keil MDK5是一款非常强大的嵌入式系统开发工具,主要用于开发和调试ARM Cortex-M处理器架构的应用程序,支持包括仿真和调试、编译、链接、下载和Flash编程在内的众多功能。而在Keil MDK5的应用中,仿真软件也是一个非常重要的组成部分,对于开发人员来说,掌握仿真软件运用的技巧和经验是非常有必要的。
这是课堂上,老师让弄作业其中一个案例
修改了主要的文件:main、led、key;
这是main.c
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
int main(void)
{
u8 t=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
LED0=0;
//点亮LED
while(1)
{
t=KEY_Scan(0);
switch(t)
{
case KEY0_PRES: LED0=!LED0;break;
case KEY1_PRES: LED1=!LED1;break;
case WKUP_PRES: LED0=!LED0;
LED1=!LED1;break;
default: delay_ms(5);
}
}
}
这是led.c
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置, 推挽输出
GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高
}
这是key.c
#include "key.h"
#include "delay.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PC5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(15);//去抖动
key_up=0;
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return 0;// 无按键按下
}
还要分别对main、led、key的头文件的引用。
我的心得体会:
这种多文件的形式,确实让我很头大,觉得难学习。
在学习的过程中,可能会遇到很多难点。其中,最大的难点可能是对硬件和软件的理解。
首先,需要自身对STM32微控制器有一定的了解,包括它的引脚分布、时钟控制、中断机制等等。初学者可能需要通过查阅官方文档、参考书籍或者其他相关资料来对这些基础知识有一个全面的认识。
其次,在学习仿真软件时,需要对仿真工具的使用进行掌握,例如如何配置仿真环境、如何加载程序、如何进行单步调试等等。此外,还需要对程序代码有一定的观察和理解能力,以便对程序逻辑进行调试和测试。
最后,学习Keil MDK5时还需要掌握一些基于C语言的编程技巧,并具备一定的算法和数据结构知识。这些都是必要的前置条件,以便更好地理解和掌握Keil MDK5的使用方法和编程技巧。
总的来说,学习Keil MDK5和STM32最小系统以及仿真软件,真的需要耐心,耐心,耐心!!!