????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 灯
}
}
附加的知识:
|