遇到多了,经验也就出来,前几天我仿真一个STM32的Systick,仿真结果就不对,程序就是对的,我估计也许是软件本身的问题。
我建议用STM32+JLINK进行仿真,有个硬件平台结果的正确性就有保证。
Main.c函数代码:
#include"stm32f10x.h"
voiddelay(void)
{
inti,j;
for(i=1000;i>0;i--)
for(j=1000;j>0;j--);
}
voidGPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
intmain(void)
{
GPIO_Config();
SystemInit();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);//点亮PB.5
delay();
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//熄灭PB.5
delay();
GPIO_SetBits(GPIOB,GPIO_Pin_6);//点亮PB.6
delay();
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//熄灭PB.6
delay();
}
}
代码分析:
GPIO_InitTypeDefGPIO_InitStructure;
定义一个结构变量GPIO_InitStructure,结构体类型为GPIO_InitTypeDef,相当于intA;
GPIO_InitTypeDef=intGPIO_InitStructure=A一样。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
开启GPIOB的时钟,要使用某个管脚都需要开启该管脚的时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
管脚号设置为第五脚和第六脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Speed_10MHz,
GPIO_Speed_2MHz,
GPIO_Speed_50MH
设置管脚电平翻转的速率,比如不要求快速变化一般10M,做串口的时候设置较高波特率的话就使用50MHZ的。
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
设置输出为推挽输出。它有8中工作模式,输出只有两种推挽和开漏输出。其它可以参
考相关手册
GPIO_Init(GPIOB,&GPIO_InitStructure);
这一句就是将前面四句的设置初始化到GPIOB中;
SystemInit();将系统时钟设置为72M,不写这句,默认为8M;
GPIO_SetBits(GPIOB,GPIO_Pin_5);//点亮PB.5
delay();//延时
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//熄灭PB.5
delay();
GPIO_SetBits(GPIOB,GPIO_Pin_6);//点亮PB.6
delay();
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//熄灭PB.6
delay();
编译链接,然后开始软件仿真
软件仿真介绍:
1、编译连接好后,点击debug进入调试界面
2、调试窗口如下
3、
图片上加文字不好弄,大概就是复位、运行、停止、单步运行等我也不太熟悉,反正用到的时候试一试就知道了。
4、选择菜单栏上的peripherals按钮,选择generalpurposeI/O的GPIOB
5、点击左上角的运行按钮或者按F5键就可以看到GPIOB的5,6在一闪一闪的
6、顺便在看看波形仿真功能
点击下图的波形分析按钮
7、、点击setup按钮会弹出一个窗口,在窗口的右上边,有个new的按钮,点击后分别输入PORTB.5和PORTB.6
8、点击运行,将窗口调到合适的位置,最终波形图如下;