链接:https://pan.baidu.com/s/1sWWmtQomWMN1uxkHGjFrLQ
提取码:8888

链接:https://pan.baidu.com/s/1gUAFnwhGl1-ry4tFPUGsKQ
提取码:8888

链接:https://pan.baidu.com/s/1gV0-m3BynnuSXiziBzd-KA
提取码:8888

1.keil安装

1)下载完成后,得到安装程序,点击安装mdk531

2)进入安装程序,点击next进入下一步

3)勾选协议,并点击next进入下一步

4)填写信息,完成后点击next进入下一步

5)等待系统安装

6)点击finish完成安装

2.注册LIC

1)打开keil,在file中找到Lincense Management,点击Single-User Lincense,找到CID并复制。

2.配置环境

1)选择设备

点击点击菜单中的Project,找到Options for Target ‘Target 1’并点击,在弹窗中选择相应的目标环境,我选的是STM32F103ZE

2)选择运行环境

3)添加源文件

//宏定义,用于存放stm32寄存器映射
#define PERIPH_BASE           ((unsigned int)0x40000000)//AHB
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
//GPIOA_BASE=0x40000000+0x10000+0x0800=0x40010800,该地址为GPIOA的基地址
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
//GPIOB_BASE=0x40000000+0x10000+0x0C00=0x40010C00,该地址为GPIOB的基地址
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
//GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
//GPIOD_BASE=0x40000000+0x10000+0x1400=0x40011400,该地址为GPIOD的基地址
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
//GPIOE_BASE=0x40000000+0x10000+0x0800=0x40011800,该地址为GPIOE的基地址
#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)
//GPIOF_BASE=0x40000000+0x10000+0x0800=0x40011C00,该地址为GPIOF的基地址
#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)
//GPIOG_BASE=0x40000000+0x10000+0x0800=0x40012000,该地址为GPIOG的基地址
#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);//延时时间

完成后保存为.c文件,我保存的时test1.c则得到test1的.c文件

 右键单击Source Group1,点击Add Existing Files...(在工程下添加test1.c文件)

4)编译程序

 5)设置仿真器模式

点击projet,找到Options for Target ‘Target1’,选择debug,找到Use simulator并勾选,再选择ULINK2/ME Cortex Debugger,点击setting

 确保Port是JTAG,Reset可以是Autodetect或SYSRESETREQ,点击ok返回

 6)程序调试

点击带有红色d的放大镜开始调试

7)分析HEX文件

:020000040800F2
:1000000060060020B1010008B9010008BB0100082A
:10001000BD010008BF010008C10100080000000088
:10002000000000000000000000000000C301000804
:10003000C501000800000000C7010008C901000850
:10004000CB010008CB010008CB010008CB01000860
:10005000CB010008CB010008CB010008CB01000850
:10006000CB010008CB010008CB010008CB01000840
:10007000CB010008CB010008CB010008CB01000830
:10008000CB010008CB010008CB010008CB01000820
:10009000CB010008CB010008CB010008CB01000810
:1000A000CB010008CB010008CB010008CB01000800
:1000B000CB010008CB010008CB010008CB010008F0
:1000C000CB010008CB010008CB010008CB010008E0
:1000D000CB010008CB010008CB010008CB010008D0
:1000E000CB010008CB010008CB010008CB010008C0
:1000F000CB010008CB010008CB010008CB010008B0
:10010000CB010008CB010008CB010008CB0100089F
:10011000CB010008CB010008CB010008CB0100088F
:10012000CB010008CB010008CB010008CB0100087F
:1001300000F002F800F02CF80AA090E8000C8244CD
:100140008344AAF10107DA4501D100F021F8AFF2AA
:10015000090EBAE80F0013F0010F18BFFB1A43F0A5
:100160000103184794020000A402000000230024A9
:1001700000250026103A28BF78C1FBD8520728BFB7
:1001800030C148BF0B6070471FB51FBD10B510BD13
:1001900000F031F81146FFF7F7FF00F019F900F011
:1001A0004FF803B4FFF7F2FF03BC00F057F800006C
:1001B0000948804709480047FEE7FEE7FEE7FEE7FB
:1001C000FEE7FEE7FEE7FEE7FEE7FEE70448054937
:1001D000054A064B7047000079030008310100080A
:1001E0006000002060060020600200206002002005
:1001F000704770477047754600F02CF8AE46050012
:100200006946534620F00700854618B020B5FFF731
:10021000DDFFBDE820404FF000064FF000074FF033
:1002200000084FF0000BAC46ACE8C009ACE8C009D0
:10023000ACE8C009ACE8C00921F007018D46704761
:1002400010B50446AFF300802046BDE81040FFF72C
:10025000A8BF000000487047000000200149182096
:10026000ABBEFEE7260002007047000081B00090A0
:10027000009828B1002000BF009901308842FBD3CC
:1002800001B0704741F21800C4F20200016841F069
:100290000401016040F60400C4F20100016821F08D
:1002A0000F010160016841F0030101607047000027
:1002B00080B500F001F880BD82B041F20400002159
:1002C000C4F202000191009150F8041C41F4803105
:1002D00040F8041C50F8041C01F40031009101990D
:1002E00001310191009919B90199B1F5A06FF1D1CE
:1002F00050F8041C890354BF00210121009100998A
:10030000012936D142F20001C4F202010A6842F02A
:1003100010020A600A6822F003020A600A6842F0CA
:1003200002020A600168016001680160016841F42D
:1003300080610160016821F47C110160016841F471
:10034000E811016050F8041C41F0807140F8041C71
:1003500050F8041C8901FBD5016821F003010160FC
:10036000016841F002010160016801F00C010829F7
:10037000FAD102B07047000080B541F20000C4F22B
:1003800002000168002241F0010101604168CFF6DE
:10039000FF021140416001684FF6FF72CFF6F6622E
:1003A00011400160016821F480210160416821F45D
:1003B000FE0141604FF41F018160FFF779FF4EF6A7
:1003C0000850CEF200004FF00061016080BD0000D7
:1003D00040F2A014C4F22124FFF754FF00250126A7
:1003E0004FF4FA702560FFF741FF4FF4FA70266072
:1003F000FFF73CFFF4E700000804000800000020BD
:08040000600600006C01000819
:04000005080001B13D
:00000001FF

 该文件为16进制的一串字符。hex文件的第一排字符称之为扩展线性地址记录,也称为32位地址记录或HEX386记录。

  1. 第一个字节 0x02表示本行数据的长度;
  2. 第二、三字节 0x00 0x00表示本行数据的起始地址;
  3. 第四字节 0x04表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05
  4. '00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
  5. '01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
  6. '02' Extended Segment Address Record: 用来标识扩展段地址的记录
  7. '03' Start Segment Address Record:开始段地址记录
  8. '04' Extended Linear Address Record: 用来标识扩展线性地址的记录
  9. '05' Start Linear Address Record:开始线性地址记录\n\n然后是数据,0x08 0x00
  10. 最后一个字节 0xf2为校验和。

由于个别原因没有硬件设备,因此只能做到程序的编译和仿真测试。从安装keil软件到程序运行都对自己有不同方向的提升。

四、参考链接

https://blog.csdn.net/qq_43279579/article/details/108880667?utm_source=app
https://blog.csdn.net/qq_45659777/article/details/120496577
 

  Keil5更新之后,开始支持ARM V6编译器,新版本的编译器对C++有了更多的支持,在编译方面也做了很多的改善,具体的没有详细了解,本文只是对STM32 开发下,使用V6版本的编译器进行STM32的C++开发作一个记录,方便和大家交流和参考。至于说为什么STM32要C++开发,这个没有解释,只是个人觉得C++比C有更多的方便,使得编程更加的容易,C++有更多的生态....
1、安装keilC51,安装目录 D:\keil51 2、安装keilMDK,安装目录 D:\keil32 3、把 D:\keil51\ 里面的 C51 文件夹复制到 D:\keil32\ 里 4、把 D:\keil51\ 里面的 UV4 文件夹复制到D:\keil32\里,提示有同名文件都不要覆盖(注意是不要覆盖) 5、把D:\keil51\TOOLS.INI文件里面的内容复制到D:\keil32\TOOLS.INI文件后面,并且把所有的"keil51"替换为"keil32" (1)支持源代码的编辑、编译、程序的下载和调试等多种功能 (2)编译器和器件支持包分离,可根据需求安装,减小软件大小 (3)提供多种中间件,如RTOS和GUI等,提高开发效率 (4)强大的仿真功能,可以仿真微控制器片内的所有资源
单片机开发多为裸机,程序规模小,多为单个程序员独立开发。有些复杂产品也会使用高端单片机STM32之类,并使用RTOS(uCOS、freeRTOS等)。 嵌入式开发几乎全部基于嵌入式操作系统,目前使用最多的是 linux 和Android。 注:源自B站朱有鹏老师.
ARM编程序特点:          所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通用寄存器来完成.因此代码中大量看到LDR,STR指令来传送值.          ARM汇编语句中.当前语句很多时候要隐含的使用上一句的执行结果.而且上一句的执行结果,是放在CPSR寄存器里,(比如
Keil 5中编写单片机程序,需要按照以下步骤进行配置: 1. 打开Keil 5软件,在菜单栏中选择“Project” -> “New µVision Project”。 2. 在弹出的对话框中,选择项目存放的文件夹和项目名,点击“Save”按钮。 3. 在“Device”选项卡中,选择你要使用的STM32单片机型号,并勾选“Use CMSIS”选项。 4. 在“Toolchain/IDE”选项卡中,选择你要使用的编译器,如ARMCC。 5. 在“Debug”选项卡中,选择你要使用的调试器,如ST-Link。 6. 点击“OK”按钮创建新项目后,会自动打开新建项目的工程文件。 7. 在工程文件中编写你的STM32单片机程序,例如使用C语言编写一个LED闪烁的程序。 8. 在菜单栏中选择“Project” -> “Build Target”编译项目。 9. 在菜单栏中选择“Flash” -> “Download”下载程序STM32单片机中。 10. 如果需要调试程序,可以在菜单栏中选择“Debug” -> “Start/Stop Debug Session”进行调试。 以上是在Keil 5中编写STM32单片机程序的基本步骤,希望能对你有所帮助。 ### 回答2: 在Keil5单片机开发环境中编写STM32控制蜂鸣器的程序是比较简单的任务。首先,配置STM32的GPIO引脚作为输出模式,用于连接蜂鸣器。其次,通过设置相应的GPIO引脚电平可以控制蜂鸣器的声音。 首先,在工程中引入STM32的头文件和库文件,例如#include "stm32f4xx.h"和#include "stm32f4xx_gpio.h"。 然后,在main函数中进行必要的初始化设置,包括启用GPIO时钟和设置引脚为输出模式。如下所示: RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 使能GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 设置蜂鸣器连接的引脚 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 设置引脚为输出模式 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 设置引脚为推挽输出 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; // 设置引脚速度 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // 引脚不连接上下拉电阻 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA 接下来,在主循环中可以使用GPIO_SetBits和GPIO_ResetBits函数分别控制引脚电平为高和低,从而控制蜂鸣器的声音。例如,可以让蜂鸣器间隔闪烁0.5秒: while (1) { GPIO_SetBits(GPIOA, GPIO_Pin_0); // 设置引脚电平为高,蜂鸣器响起 delay_ms(500); // 延迟500毫秒 GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 设置引脚电平为低,蜂鸣器停止响 delay_ms(500); // 延迟500毫秒 最后,需要注意在开发环境中定义延迟函数delay_ms,以提供准确的延迟时间。可以使用systick定时器或者其他方式实现延迟函数的功能。 通过以上步骤,在Keil5单片机STM32编写程序中,就可以控制蜂鸣器的开关和声音,并实现所需的功能。 ### 回答3: Keil5是一款常用的嵌入式开发工具,可以用来编写单片机程序。蜂鸣器是一种常见的电子元件,可以发出响亮的声音,常用于警报、提醒等功能。 要用Keil5编写STM32单片机程序控制蜂鸣器,首先需要了解STM32的硬件和编程语言。STM32是一款高性能的ARM Cortex-M系列微处理器,在Keil5中可以选择对应的MCU型号,然后创建一个新的工程。 在Keil5中,可以使用C语言或汇编语言编写蜂鸣器控制程序。首先需要配置STM32的GPIO引脚,将其设置为输出模式。然后可以使用GPIO输出高电平或低电平来控制蜂鸣器开关。 例如,如果将蜂鸣器连接到STM32的GPIO引脚Buzzer_Pin,可以在程序中使用以下代码来控制蜂鸣器: #include "stm32f4xx.h" #define Buzzer_Pin GPIO_Pin_0 #define Buzzer_Port GPIOA void Buzzer_Init(void) GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Pin = Buzzer_Pin; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(Buzzer_Port, &GPIO_InitStruct); void Buzzer_On(void) GPIO_SetBits(Buzzer_Port, Buzzer_Pin); void Buzzer_Off(void) GPIO_ResetBits(Buzzer_Port, Buzzer_Pin); 首先,需要在Buzzer_Init函数中对引脚进行配置,使其输出高电平后蜂鸣器发声。然后,可以使用Buzzer_On函数将引脚输出高电平,使蜂鸣器响起;使用Buzzer_Off函数将引脚输出低电平,关闭蜂鸣器。 这样就可以使用Keil5编写STM32单片机程序控制蜂鸣器了。通过调用Buzzer_On和Buzzer_Off函数,可以在需要的时候打开或关闭蜂鸣器,实现不同的功能和提醒。