1.新建一个文件夹。
2.新建一个工程- new project - 定位到文件夹中 -命名。
3.选择芯片。
4.选择 :
CMSIS 标准 - core勾选
DEVICE - startup 勾选
标准库 -
GPIO勾选
framework勾选
RCC勾选
//或者点击resolve解决这个问题。
//五个勾就算完成任务。
core
startup
图片:
GPIO勾选
framework勾选
RCC勾选
5.点击三个方块 - 新建文件夹,组织文件结构(改变工程文件夹的名字 (可以不操作))
6.新建文件c文件并且添加进工程当中。
//右键 - add new items to this group
1.新建.c 文件 保存
2.然后添加到文件夹里面就可以(直接左边的项目栏 里面的 文件夹 右键, 添加,就行了)
7.新编写一个主函数并且编译。
8.进到stm32f4xx.h中的109行的宏添加到 options for target c/c++中;
//再编译一下就没有错误了。
9.使用寄存器 来点亮LED 灯 , 蜂鸣器, key 按键
寄存器的地址 RCC 基地址;0x40023800
时钟地址
1配置时钟:找到AHB1总线的寄存器位 //找到各种功能所对应的寄存器位
RCC 的地址 (初始化,LED 的引脚GPIOE 让他使能!!)
基地址 + 偏移地址; 0x4002 3800 + 0x30
使这个地址的数值等于:0x10
- unsigned int * PECLK =(unsigned int *)(0x40023800 + 0x30);//寄存器的位置
- *PECLK = 0X10;//寄存器的赋值
10.配置引脚:模式:输出模式 输出类型 速度 电阻 引脚输出的电平 :也要找到寄存器位
基地址+偏移地址; //查手册:存储器映射 0x40021000 + 0x00 :
配置引脚:
1.我们要找的引脚是 GPIOE (地址 : 0x40021000)
2.然后找到GPIO 配置引脚的部分:
GIOPE 引脚输出设置的地址 (基本地址 + 偏移量 )
地址: 0x40021000 + 0x00
赋值的大小: (1<<2*8 | 1 << 2 * 9 | 1 << 2*10);
或者为0x1a0000
代码:
- unsigned int * PEMODE = (void*)(0x40021000 + 0x00);//GPIO 的地址
- *PEMODE = (1<<2*8 | 1 << 2 * 9 | 1 << 2*10);//设置为GPIOE 8 9 10 这些引脚为输出引脚
输出类型 : (也可以不设置 因为默认状态是 推挽输出)
地址 (基地址 + 偏移地址)= GPIOE (地址 : 0x40021000)+ (偏移地址 0x04)
赋值的大小:0x000
代码:
- unsigned int * PEMODE_leixing = (void*)(0x40021000 + 0x04);//设置引脚的输出类型
- *PEMODE_leixing=0x000;//设置输出类型 为推挽输出
速度: (假如设置引脚的速度为低速 也可以不要设置,因为它默认是 低速)
地址 (基地址 + 偏移地址)= GPIOE (地址 : 0x40021000)+ (偏移地址 0x08)
赋值的大小:0x30000
代码:
- unsigned int * PESPEED = (void*)(0x40021000 + 0x08);//设置引脚 的速度
- *PESPEED =0x10000;//引脚8 为 中速 9 10 为低速
电阻: (LED 亮 一般配置 上拉电阻)
地址 (基地址 + 偏移地址)= GPIOE (地址 : 0x40021000)+ (偏移地址 0x0c)
赋值的大小:0x150000
代码:
- unsigned int * PEMODE_dianzu = (void*)(0x40021000 + 0x0c);//设置引脚的电阻
- *PEMODE_dianzu=0x150000;//引脚8 为 中速 9 10 为上拉电阻
引脚输出的电平 :(LED 灯亮 为输出低电平)
地址 (基地址 + 偏移地址)= GPIOE (地址 : 0x40021000)+ (偏移地址 0x14)
赋值的大小:0x0 (0)
代码:
- unsigned int *PEdata = (void*)(0x40021000 + 0x14);//设置引脚的输出的电平
- *PEdata = 0;//设置引脚都输出低电平
LED 亮的 总的代码:
- #include "stm32f4xx.h"
- //.寄存器方法配置GPIO接口功能:1点亮一个灯-打开蜂鸣器-按键检测
- int main()
- {
- //GPIOE-8 9 10 ; //
- unsigned int * PECLK =(unsigned int *)(0x40023800 + 0x30);
- unsigned int * PEMODE = (void*)(0x40021000 + 0x00);//设置引脚为 输出模式 或者输入模式
- unsigned int * PEMODE_leixing = (void*)(0x40021000 + 0x04);//设置引脚的输出类型
- unsigned int * PEMODE_dianzu = (void*)(0x40021000 + 0x0c);//设置引脚的电阻
- unsigned int * PESPEED = (void*)(0x40021000 + 0x08);//设置引脚 的速度
- unsigned int *PEdata = (void*)(0x40021000 + 0x14);//设置引脚的输出的电平
- //1配置时钟:找到AHB1总线的寄存器位 //找到各种功能所对应的寄存器位
- //RCC 的地址
- //基地址 + 偏移地址; 0x4002 3800 + 0x30
- // 0000 0000 0000 0000 0000 0000 0001 0000 = 0x10;
- *PECLK = 0X10;//设置时钟
-
-
- //2.配置引脚:模式:输出模式 输出类型 速度 电阻 引脚 :也要找到寄存器位
- //基地址+偏移地址;//查手册:存储器映射
- //0x40021000 + 0x00 :
-
-
- // 0000 0000 0000 0001 0000 0000 0000 0000 = 0x10000;
- //*PEMODE = 0X10000;
- *PEMODE = (1<<2*8 | 1 << 2 * 9 | 1 << 2*10);//设置引脚 8 9 10 引脚为输出模式
- *PEMODE_leixing=0x000;//设置输出类型 为推挽输出
- *PESPEED =0x10000;//引脚8 为 中速 9 10 为低速
- *PEMODE_dianzu=0x150000;//引脚8 为 中速 9 10 为上拉电阻
-
- //3.操作引脚:输出低电平 //也要找到寄存器位
- //数据寄存器;
- //0x40021000 + 0x14
-
- *PEdata = 0;//设置引脚都输出低电平
-
- //防止程序跑飞
- while(1);
- }
11.使用寄存器 使 蜂鸣器 响 或者关闭!
1.首先配置时钟:
寄存器的地址 RCC 基地址;0x40023800
时钟地址
1配置时钟:找到AHB1总线的寄存器位 //找到各种功能所对应的寄存器位
RCC 的地址 (初始化,LED 的引脚GPIOE 让他使能!!)
基地址 + 偏移地址; 0x4002 3800 + 0x30
使这个地址的数值等于:0x02
- unsigned int * PECLK =(unsigned int *)(0x40023800 + 0x30);//寄存器的位置
- *PECLK = 0X02;//寄存器的赋值
1.设置引脚的输出模式 (蜂鸣器的引脚是 GPIOB 10)
我们要找的引脚是 GPIOB (地址 : 0x40020400)
2.然后找到GPIO 配置引脚的部分:
GIOPB 引脚输出设置的地址 (基本地址 + 偏移量 )
地址:0x40020400 + 0x00
赋值的大小:
或者为0x100000
代码:
- unsigned int * BEEP_PEMODE = (void*)(0x40020400 + 0x00);//设置引脚为 输出模式 或者输入模式
- *BEEP_PEMODE=0x100000;//设置引脚为 GPIOB 10 输出模式
输出类型 : (也可以不设置 因为默认状态是 推挽输出)
地址 (基地址 + 偏移地址)= GPIOB (地址 : 0x40020400)+ (偏移地址 0x04)
赋值的大小:0x000
代码:
- unsigned int * BEEP_PEMODE_leixing = (void*)(0x40020400 + 0x04);//设置引脚的输出类型
- *BEEP_PEMODE_leixing=0x000000;//设置输出类型 为推挽输出
速度: (假如设置引脚的速度为低速 也可以不要设置,因为它默认是 低速)
地址 (基地址 + 偏移地址)= GPIOB (地址 : 0x40020400)+ (偏移地址 0x08)
赋值的大小:0x00000
代码:
- unsigned int * BEEP_PESPEED = (void*)(0x40020400 + 0x08);//设置引脚 的速度
- *BEEP_PESPEED=0x0000;//设置引脚 的速度 GPIOB 10 为低速
电阻: ( 蜂鸣器 一般配置 上拉电阻)
地址 (基地址 + 偏移地址)= GPIOB (地址 : 0x40020400)+ (偏移地址 0x0c)
赋值的大小:0x100000
代码:
- unsigned int * BEEP_PEMODE_dianzu = (void*)(0x40020400 + 0x0c);//设置引脚的电阻
- *BEEP_PEMODE_dianzu=0x100000;//引脚 10 为上拉电阻
引脚输出的电平 :( 蜂鸣器响 为输出高电平)
地址 (基地址 + 偏移地址)= GPIOB (地址 : 0x40020400)+ (偏移地址 0x14)
赋值的大小:0x400
代码:
- unsigned int * BEEP_PEdata = (void*)(0x40020400 + 0x14);//设置引脚的输出的电平
- *BEEP_PEdata =0x400;//开启蜂鸣器
- //*BEEP_PEdata =0x0000;//关闭蜂鸣器
蜂鸣器的所有代码:
- unsigned int * BEEP_PECLK =(unsigned int *)(0x40023800 + 0x30);//配置时钟
- unsigned int * BEEP_PEMODE = (void*)(0x40020400 + 0x00);//设置引脚为 输出模式 或者输入模式
- unsigned int * BEEP_PEMODE_leixing = (void*)(0x40020400 + 0x04);//设置引脚的输出类型
- unsigned int * BEEP_PEMODE_dianzu = (void*)(0x40020400 + 0x0c);//设置引脚的电阻
- unsigned int * BEEP_PESPEED = (void*)(0x40020400 + 0x08);//设置引脚 的速度
- unsigned int * BEEP_PEdata = (void*)(0x40020400 + 0x14);//设置引脚的输出的电平
-
- *BEEP_PECLK= 0X02;//设置时钟
- *BEEP_PEMODE=0x100000;//设置引脚为 GPIOB 10 输出模式
- *BEEP_PEMODE_leixing=0x000000;//设置输出类型 为推挽输出
- *BEEP_PEMODE_dianzu=0x100000;//引脚 10 为上拉电阻
- *BEEP_PESPEED=0x0000;//设置引脚 的速度 GPIOB 10 为低速
- *BEEP_PEdata =0x400;//开启蜂鸣器
- //*BEEP_PEdata =0x0000;//关闭蜂鸣器
12.KEY 模块的代码:
- //1.时钟 //配置好 PE 和 PB时钟
- AHB1 = 0x12;
-
- //2.1配置灯 //输出模式 灯的其他部分用默认值
- unsigned int *PEMODELED = (void*)(0x40021000 + 0x00);
- *PEMODELED = (1<<8*2 | 1<<9*2 | 1<<10*2);
-
- //2.2:配置按键
- *PEMODELED |= 0x000;//位或有添加位的功能;//0000 1000 | 0100 0000 = 0100 1000
- //2.3:配置蜂鸣器
- unsigned int *PBMODEBEEP = (void*)(0x40020400 +0x00 );
- *PBMODEBEEP = 1<<10*2;
- //2.4:给按键配置一个上拉电阻
- unsigned int *PEKEYUPDER = (void*)(0x40021000 + 0X0C);
- *PEKEYUPDER = 1 << 5*2 ;
-
-
- //3.操作部分 三个关灯操作
- unsigned int *PEDATALED = (void*)(0x40021000 + 0x14);
- *PEDATALED =(1<<8 | 1<<9 | 1<<10);
- //3.1蜂鸣器数据寄存器
- unsigned int *PBBEEPDATA =(void*)( 0x40020400 + 0x14);
-
-
- //4.按键的输入数据寄存器准备好
- unsigned int *PEKEYINPUT = (void*)(0x40021000 + 0X10);
-
- while(1)
- {
- //
- if(!(*PEKEYINPUT & 0x20))//假如按下第二个按键
- {
- *PEDATALED = 0x00;//LED 灯 低电平
- *PBBEEPDATA = (1 <<10);//BEEP 响
- }
- if(!(*PEKEYINPUT & 0x40))//假如按下第三个按键
- {
- *PEDATALED =(1<<8 | 1<<9 | 1<<10);//关闭LED 灯
- }
-
- }
附加的知识: