stm32的简单程序的编译(LED闪烁)及熟悉proteus电路仿真软件

    科技2024-04-15  78

    文章目录

    一、stm32的简单程序的编译(LED闪烁)1.工程的建立2.代码输入与编译3.总结 二、proteus电路仿真软件进行51程序设计与仿真1.程序代码2.生成HEX文件3.用Proteus软件连接电路并运行4.总结

    一、stm32的简单程序的编译(LED闪烁)

    1.工程的建立

    (1)先新建一个文件夹 (2)打开keil5,新建一个工程 (3)选择要用的stm32的芯片 (4)对Run-Time Environment进行设置,设置完成后,点击OK,这样一个工程就建立完成 (5)在工程中新建一个文本并保存,命名为main.c (6)然后将文本添加到工程中

    2.代码输入与编译

    (1)输入以下代码:

    #define PERIPH_BASE ((unsigned int)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) #define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) #define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8)) //#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8 //定义typedef类型别名 typedef struct { volatile unsigned int CR; volatile unsigned int CFGR; volatile unsigned int CIR; volatile unsigned int APB2RSTR; volatile unsigned int APB1RSTR; volatile unsigned int AHBENR; volatile unsigned int APB2ENR; volatile unsigned int APB1ENR; volatile unsigned int BDCR; volatile unsigned int CSR; } RCC_TypeDef; #define RCC ((RCC_TypeDef *)0x40021000) // 定义typedef类型别名 typedef struct { volatile unsigned int CRL; volatile unsigned int CRH; volatile unsigned int IDR; volatile unsigned int ODR; volatile unsigned int BSRR; volatile unsigned int BRR; volatile unsigned int LCKR; } GPIO_TypeDef; //GPIOA指向地址GPIOA_BASE,GPIOA_BASE地址存放的数据类型为GPIO_TypeDef #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) void LEDInit( void ) { RCC->APB2ENR|=1<<2; //GPIOA 时钟开启 GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=0X00000003; } //粗略延时 void Delay_ms( volatile unsigned int t) { unsigned int i,n; for (n=0;n<t;n++) for (i=0;i<800;i++); } int main( void ) { LEDInit(); while (1) { LED0=0;//LED熄灭 Delay_ms(500);//延时时间 LED0=1;//LED亮 Delay_ms(500);//延时时间 } }

    (2)编译结果: (3)仿真测试 选择工具栏上的红框标志 根据序号依次点击

    打开Settings后,改成如下形式 确定后,开始进行仿真测试

    3.总结

    在编写程序过程中,遇到了许多错误,通过百度也得到了解决,最终也得到了正确的代码,并且编译和仿真测试也没有错误。此次让我熟悉了如何stm32编写简单程序,由于keil软件的没有长期使用,有所忘记,此次也让我更加了解了keil软件的应用。

    二、proteus电路仿真软件进行51程序设计与仿真

    要求:用89C51并行口设计显示一个数码的电路,使数码管循环显示“0”-“F”。

    1.程序代码

    (1)使用keil软件创建工程、文本保存,并输入代码 代码如下:

    #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]= { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff }; void DelayMS(uint x) { uchar t; while(x--) for(t=120;t>0;t--); } void main() { uchar i=0; P0=0x00; while(1) { P0=~DSY_CODE[i]; i=(i+1)%16; DelayMS(400); } }

    (2)编译结果

    2.生成HEX文件

    (3)写好文件后,点击工具栏上的红框标志

    (2)选择Output(输出),把Create HEX File勾选上,点击ok,然后点击编译

    (3)然后就可以在项目所在文件夹中发现.hex文件

    3.用Proteus软件连接电路并运行

    (1)连接的电路图 (2)双击89C51芯片,将刚刚的.hex文件填入,然后运行即可 (3)运行结果

    4.总结

    此次让我熟悉了proteus电路仿真软件的使用,知道了怎样生成HEX文件,以及怎样在proteus中使用HEX文件运行电路。

    参考文献:https://blog.csdn.net/u014453898/article/details/56673487?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160190557919724839211732%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160190557919724839211732&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-1-56673487.pc_first_rank_v2_rank_v28&utm_term=keil5%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90hex%E6%96%87%E4%BB%B6&spm=1018.2118.3001.4187).

    Processed: 0.011, SQL: 8