proteus是可以直接创建设计图和源码的,但是源码编译它需要借助keil-arm编译器,也就是我们安装keil-mdk之后自带的编译器。
下面给出一个完整的示例,主要是做一个LED灯闪烁的效果。
新建工程指定路径,Schematic,PCB layout都选择默认,在最后创建项目工程向导的时候,选择:Create Firmware Project:
硬件系列选择Cortex-M3,控制器类型选择STM32F103C6(其他类型,可能不会出现Compiler下拉选项),编译器类型如果没有选择项,点击后面的Compilers按钮,在弹出框中选择Keil for ARM,指定keil-mdk安装的ARM路径:
这样生成的项目,自带源码,源码结构如下所示:
这个源码还自带了标准库中的很多东西,启动文件,核心文件,所以直接编译也是没有问题的。
这里虽然有了标准库中的很多内容,但是一些初始化的功能代码并不在这里,所以需要通过操作寄存器来实现点灯操作。
如下所示,是一个简单的 通过操作寄存器来让GPIOA的GPIO_Pin_5端口作为电平输出口,并开启时钟使能的代码。
#include <stm32f103x6.h>
#include <stm32f1xx.h>
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)
#define LED0 PAout(5) // PA5
void Delay_nms(unsigned int time)
{
unsigned int i=0;
while(time--)
{
i=12000;
while(i--) ;
}
}
void LED_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // clock enable
GPIOA->CRL &= 0XFF0FFFFF; //PA5
GPIOA->CRL |= 0X00300000; //PA5
GPIOA->ODR |= 1<<5; //PA5
}
int main (void)
{
LED_Init();
while (1)
{
LED0 = 0;
Delay_nms(50);
LED0 = 1;
Delay_nms(50);
}
}
项目源码构建成功:
接着,我们直接在原理图Schematic这里添加发光二极管和电阻并连线就可以开始仿真了。
前面源码构建好了,这里原理图简单添加了LED就可以进行仿真了。效果如下所示:
这种构建仿真,原理图加源码的方式很适合没有单片机,而且不用在Keil和Proteus之间来回切换的情况,但是它的源码是在临时文件夹中,如下所示:
这种方式对于复杂项目而言,可能也有一些弊端。