STM32和Protues的入门学习

    科技2024-10-10  19

    STM32和Proteus的入门学习

    一、STM32下的简单编译1.建立工程2.代码运行3.总结 二、Proteus下的程序设计与仿真1.程序的创建2.仿真运行3.总结

    一、STM32下的简单编译

    1.建立工程

    (1)打开keil5,点击project建立一个新的工程

    (2)选择芯片

    (3)勾选设置

    点击OK (4)在新工程中创建文件

    (5)保存为main.c

    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.总结

    学习了如何安装mdk5并且学会简单的运用

    二、Proteus下的程序设计与仿真

    1.程序的创建

    编写代码并导出hex文件

    #include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "includes.h" //START 任务 //设置任务优先级 #define START_TASK_PRIO 10 ///开始任务的优先级为最低 //设置任务堆栈大小 #define START_STK_SIZE 128 //任务任务堆栈 OS_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *pdata); //LED0任务 //设置任务优先级 #define LED0_TASK_PRIO 7 //设置任务堆栈大小 #define LED0_STK_SIZE 128 //任务堆栈 OS_STK LED0_TASK_STK[LED0_STK_SIZE]; //任务函数 void led0_task(void *pdata); int main(void) { delay_init(); //延时初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置 uart_init(57600); //串口波特率设置 LED_Init(); //LED初始化 delay_ms(500); OSInit(); //UCOS初始化 OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //创建开始任务 OSStart(); //开始任务 } //开始任务 void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; pdata=pdata; OS_ENTER_CRITICAL(); //进入临界区(关闭中断) OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO);//挂起开始任务 OS_EXIT_CRITICAL(); //退出临界区(开中断) } //LED0任务 void led0_task(void *pdata) { while(1) { delay_us(50000); LED0=~LED0; printf("LED0变换!\r\n"); delay_us(50000); LED1=~LED1; printf("LED1变换!\r\n"); } }

    2.仿真运行

    (1)电路图如下

    (2)导入hex文件 (3)运行结果如下

    3.总结

    熟悉了proteus仿真软件如何使用,以及电路的设计和hex文件的运用

    Processed: 0.024, SQL: 8