[应用相关] 在 Keil uVision4 MDK下配置开发STM32F103Z完整教程

[复制链接]
 楼主| 结合国际经验 发表于 2022-3-27 16:09 | 显示全部楼层 |阅读模式
环境搭建:
1、安装 Keil uVision4 MDK
2、安装 J-Link
安装 Setup_JLinkARM_V4501.exe 驱动时,会弹出【SEGGER J-Link DLL Updater V4.501 】对话框,
不要选择 Keil 直接点击OK即可,因为Keil对支持M3内核SW接口采用了JL2CM3.dll 这个文件,该文
件的版本号是和该目录下Jlink驱动版本号配套的,不要擅自改变他们,否则不能使用。

 楼主| 结合国际经验 发表于 2022-3-27 16:09 | 显示全部楼层
建立工程:
1、在桌面上建立一个文件夹【MyStm32】文件夹
2、在【MyStm32】文件夹下建立【USER】、【FWlib】、【CMSIS】、【Output】、【Listing】文件夹。
        【USER】:存放用户自定义的应用程序
        【FWlib】:存放库文件
        【CMSIS】:存放M3系列单片机通用的文件
        【Output】:存放编译器编译后输出的文件
        【Listing】:编译器编译过程中产生的文件
 楼主| 结合国际经验 发表于 2022-3-27 16:12 | 显示全部楼层
3、将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 的【inc】跟【src】
        这两个文件夹拷贝到【FWlib】。
        【inc】、【src】片上外设驱动的源文件和头文件。
 楼主| 结合国际经验 发表于 2022-3-27 16:13 | 显示全部楼层
4、\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 下的
        main.c、stm32f10x_conf.h、stm32f10x_it.h、stm32f10x_it.c 、system_stm32f10x.c 拷贝到【USER】
        stm32f10x_conf.h:配置文件
        stm32f10x_it.h、stm32f10x_it.c:中断函数文件。
        system_stm32f10x.c:ARM公司提供的符合CMSIS标准的库文件
 楼主| 结合国际经验 发表于 2022-3-27 16:14 | 显示全部楼层
5、STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup的
        【arm】文件夹的拷贝到 MyStm32\CMSIS\startup。
        这些都是用汇编编写的驱动文件,STM32F103ZE芯片是大容量Flash,应选择startup_stm32f10x_hd.s
 楼主| 结合国际经验 发表于 2022-3-27 16:15 | 显示全部楼层
6、STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 的 core_cm3.c 和 core_cm3.h
        也拷贝到【CMSIS】文件夹下。
 楼主| 结合国际经验 发表于 2022-3-27 16:18 | 显示全部楼层
7、STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 的
        stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h 拷贝到【CMSIS】文件夹下。
 楼主| 结合国际经验 发表于 2022-3-27 16:20 | 显示全部楼层
8、用keil MDK 建立工程文件到【USER】文件夹下,工程名为【STM32-DEMO】
        在该工程下建立四个组:
        【STARTCODE】:存放启动代码 添加 startup_stm32f10x_hd.s 文件
        【USER】:存放用户自定义的应用程序 添加main.c、stm32f10x_it.c
        【FWlib】:存放库文件 按需添加src里面的驱动文件
        【CMSIS】:存放M3系列单片机通用的文件 添加core_cm3.c、system_stm32f10x.c
 楼主| 结合国际经验 发表于 2022-3-27 16:22 | 显示全部楼层
 楼主| 结合国际经验 发表于 2022-3-27 16:23 | 显示全部楼层
配置MDK:
5744662401ed2166c8.png
 楼主| 结合国际经验 发表于 2022-3-27 16:25 | 显示全部楼层
 楼主| 结合国际经验 发表于 2022-3-27 16:27 | 显示全部楼层
 楼主| 结合国际经验 发表于 2022-3-27 16:28 | 显示全部楼层
 楼主| 结合国际经验 发表于 2022-3-27 16:29 | 显示全部楼层
 楼主| 结合国际经验 发表于 2022-3-27 16:30 | 显示全部楼层
添加 USE_STDPERIPH_DRIVER 是为了屏蔽编译器的默认搜索路径,转而使用我们添加
到工程中的 ST 的库,添加 STM32F10X_HD 是因为我们用的芯片是大容量的,添加了
STM32F10X_HD 这个宏之后,库文件里面为大容量定义的寄存器我们就可以用了。
芯片是小或中容量的时候宏要换成STM32F10X_LD或者STM32F10X_MD。其实不管是什么容量的,
    我们只要添加上 STM32F10X_HD 这个宏即可,当你用小或者中容量的芯
片时,那些为大容量定义的寄存器我不去访问就是了,反正也访问不了。

 楼主| 结合国际经验 发表于 2022-3-27 16:31 | 显示全部楼层
流水灯实验:
只用到 配置GPIO功能和配置时钟功能,所以在 stm32f10x_conf.h

只需要包含两个头文件即可:
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
 楼主| 结合国际经验 发表于 2022-3-27 16:33 | 显示全部楼层
流水灯流程:
        1、开启指定GPIO的外设时钟 -> RCC_APB2PeriphClockCmd()
        2、设置 GPIO_InitTypeDef 指定引脚、工作状态、输出频率
        3、根据 调用GPIO_Init() 初始化IO -> GPIO_Init()
        4、设置IO输出高低电平,实现控制LED灯的亮灭。
 楼主| 结合国际经验 发表于 2022-3-27 16:35 | 显示全部楼层
  1. led.c:
  2. #include "led.h"      
  3. void LED_GPIO_Config(void)
  4. {
  5.         // 定义一个 GPIO_InitTypeDef 类型的结构体
  6.         GPIO_InitTypeDef GPIO_InitStructure;
  7.         // 开启 GPIOC 的外设时钟
  8.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
  9.         // 选择要控制的 GPIOC 引脚
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
  11.         // 设置引脚模式为通用推挽输出
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  13.         // 设置引脚速率为 50Mhz
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.         // 调用库函数,初始化GPIOC
  16.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  17.         // 设置GPIOC3、GPIOC4、GPIOC5 为高电平
  18.         GPIO_SetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
  19. }

  20. led.h:
  21. #ifndef __LED_H
  22. #define __LED_H

  23. #include "stm32f10x.h"
  24. #include "stm32f10x_rcc.h"
  25. #define ON        0
  26. #define OFF        1

  27. //带参宏,可以向联函数一样使用
  28. #define        LED1(a) if(a) \
  29.                                         GPIO_SetBits(GPIOC, GPIO_Pin_3);\
  30.                                 else  \
  31.                                         GPIO_ResetBits(GPIOC, GPIO_Pin_3)

  32. #define        LED2(a) if(a) \
  33.                                         GPIO_SetBits(GPIOC, GPIO_Pin_4);\
  34.                                 else  \
  35.                                         GPIO_ResetBits(GPIOC, GPIO_Pin_4)

  36. #define        LED3(a) if(a) \
  37.                                         GPIO_SetBits(GPIOC, GPIO_Pin_5);\
  38.                                 else  \
  39.                                         GPIO_ResetBits(GPIOC, GPIO_Pin_5)

  40. void LED_GPIO_Config(void);

  41. #endif

  42. main.c
  43. #include "stm32f10x.h"
  44. #include "led.c"

  45. void Delay(__IO u32 nCount)
  46. {
  47.         for(; nCount !=0; nCount--);      
  48. }

  49. int main(void)
  50. {
  51.         LED_GPIO_Config();
  52.         while (1)
  53.         {
  54.                 LED1(ON);
  55.                    Delay(0x0FFFEF);
  56.                 LED1(OFF);
  57.                    Delay(0x0FFFEF);
  58.         }
  59. }
 楼主| 结合国际经验 发表于 2022-3-27 16:52 | 显示全部楼层
1.  typedef enum  
2.  {GPIO_Mode_AIN = 0x0,           //模拟输入模式   
3.    GPIO_Mode_IN_FLOATING = 0x04,  //浮空输入模式   
4.    GPIO_Mode_IPD = 0x28,          //下拉输入模式   
5.    GPIO_Mode_IPU = 0x48,          //上拉输入模式   
6.    GPIO_Mode_Out_OD = 0x14,       //开漏输出模式   
7.    GPIO_Mode_Out_PP = 0x10,       //通用推挽输出模式   
8.    GPIO_Mode_AF_OD = 0x1C,        //复用功能开漏输出   
9.    GPIO_Mode_AF_PP = 0x18         //复用功能推挽输出   
10.  }GPIOMode_TypeDef;
 楼主| 结合国际经验 发表于 2022-3-27 16:53 | 显示全部楼层
1.  typedef struct  
2.  {   
3.    uint16_t GPIO_Pin;             /*指定将要进行配置的 GPIO 引脚*/  
4.    GPIOSpeed_TypeDef GPIO_Speed;  /*指定 GPIO 引脚可输出的最高频率*/  
5.    GPIOMode_TypeDef GPIO_Mode;    /*指定 GPIO 引脚将要配置成的工作状态*/  
6.  }GPIO_InitTypeDef;  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

773

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

64

主题

773

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部