• STM32F407 芯片的学习 day03 工程模块建立的新的办法,和使用寄存器 来点亮LED 灯 , 蜂鸣器, key 按键


        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

    1. unsigned int * PECLK =(unsigned int *)(0x40023800 + 0x30);//寄存器的位置
    2. *PECLK = 0X10;//寄存器的赋值

     10.配置引脚:模式:输出模式  输出类型  速度  电阻 引脚输出的电平  :也要找到寄存器位
        基地址+偏移地址; //查手册:存储器映射    0x40021000 + 0x00 : 

    配置引脚:

    1.我们要找的引脚是  GPIOE   (地址 :  0x40021000)

     2.然后找到GPIO 配置引脚的部分:

     

    GIOPE 引脚输出设置的地址  (基本地址 + 偏移量 )

    地址: 0x40021000   +  0x00

    赋值的大小:  (1<<2*8  | 1 << 2 * 9 | 1 << 2*10);

    或者为0x1a0000

    代码:

    1. unsigned int * PEMODE = (void*)(0x40021000 + 0x00);//GPIO 的地址
    2. *PEMODE = (1<<2*8 | 1 << 2 * 9 | 1 << 2*10);//设置为GPIOE 8 9 10 这些引脚为输出引脚


    输出类型  :   (也可以不设置   因为默认状态是  推挽输出) 

     

     地址 (基地址  + 偏移地址)=    GPIOE   (地址 :  0x40021000)+ (偏移地址  0x04)

    赋值的大小:0x000

    代码:

    1. unsigned int * PEMODE_leixing = (void*)(0x40021000 + 0x04);//设置引脚的输出类型
    2. *PEMODE_leixing=0x000;//设置输出类型 为推挽输出

     速度:  (假如设置引脚的速度为低速  也可以不要设置,因为它默认是 低速)

     

    地址 (基地址  + 偏移地址)=    GPIOE   (地址 :  0x40021000)+ (偏移地址  0x08)

    赋值的大小:0x30000

    代码:

    1. unsigned int * PESPEED = (void*)(0x40021000 + 0x08);//设置引脚 的速度
    2. *PESPEED =0x10000;//引脚8 为 中速 9 10 为低速

     电阻:     (LED  亮  一般配置 上拉电阻)

    地址 (基地址  + 偏移地址)=    GPIOE   (地址 :  0x40021000)+ (偏移地址  0x0c)

    赋值的大小:0x150000

    代码:

    1. unsigned int * PEMODE_dianzu = (void*)(0x40021000 + 0x0c);//设置引脚的电阻
    2. *PEMODE_dianzu=0x150000;//引脚8 为 中速 9 10 为上拉电阻

    引脚输出的电平 :(LED 灯亮  为输出低电平)

    地址 (基地址  + 偏移地址)=    GPIOE   (地址 :  0x40021000)+ (偏移地址  0x14)

    赋值的大小:0x0 (0)

    代码:

    1. unsigned int *PEdata = (void*)(0x40021000 + 0x14);//设置引脚的输出的电平
    2. *PEdata = 0;//设置引脚都输出低电平


    LED 亮的   总的代码:

    1. #include "stm32f4xx.h"
    2. //.寄存器方法配置GPIO接口功能:1点亮一个灯-打开蜂鸣器-按键检测
    3. int main()
    4. {
    5. //GPIOE-8 9 10 ; //
    6. unsigned int * PECLK =(unsigned int *)(0x40023800 + 0x30);
    7. unsigned int * PEMODE = (void*)(0x40021000 + 0x00);//设置引脚为 输出模式 或者输入模式
    8. unsigned int * PEMODE_leixing = (void*)(0x40021000 + 0x04);//设置引脚的输出类型
    9. unsigned int * PEMODE_dianzu = (void*)(0x40021000 + 0x0c);//设置引脚的电阻
    10. unsigned int * PESPEED = (void*)(0x40021000 + 0x08);//设置引脚 的速度
    11. unsigned int *PEdata = (void*)(0x40021000 + 0x14);//设置引脚的输出的电平
    12. //1配置时钟:找到AHB1总线的寄存器位 //找到各种功能所对应的寄存器位
    13. //RCC 的地址
    14. //基地址 + 偏移地址; 0x4002 3800 + 0x30
    15. // 0000 0000 0000 0000 0000 0000 0001 0000 = 0x10;
    16. *PECLK = 0X10;//设置时钟
    17. //2.配置引脚:模式:输出模式 输出类型 速度 电阻 引脚 :也要找到寄存器位
    18. //基地址+偏移地址;//查手册:存储器映射
    19. //0x40021000 + 0x00
    20. // 0000 0000 0000 0001 0000 0000 0000 0000 = 0x10000;
    21. //*PEMODE = 0X10000;
    22. *PEMODE = (1<<2*8 | 1 << 2 * 9 | 1 << 2*10);//设置引脚 8 9 10 引脚为输出模式
    23. *PEMODE_leixing=0x000;//设置输出类型 为推挽输出
    24. *PESPEED =0x10000;//引脚8 为 中速 9 10 为低速
    25. *PEMODE_dianzu=0x150000;//引脚8 为 中速 9 10 为上拉电阻
    26. //3.操作引脚:输出低电平 //也要找到寄存器位
    27. //数据寄存器;
    28. //0x40021000 + 0x14
    29. *PEdata = 0;//设置引脚都输出低电平
    30. //防止程序跑飞
    31. while(1);
    32. }



    11.使用寄存器 使 蜂鸣器 响 或者关闭!

    1.首先配置时钟:

     寄存器的地址     RCC  基地址;0x40023800

    时钟地址

        1配置时钟:找到AHB1总线的寄存器位    //找到各种功能所对应的寄存器位
        RCC  的地址    (初始化,LED 的引脚GPIOE   让他使能!!)
        基地址 + 偏移地址;    0x4002 3800 + 0x30

    使这个地址的数值等于:0x02

    1. unsigned int * PECLK =(unsigned int *)(0x40023800 + 0x30);//寄存器的位置
    2. *PECLK = 0X02;//寄存器的赋值

     1.设置引脚的输出模式  (蜂鸣器的引脚是   GPIOB   10)

    我们要找的引脚是  GPIOB  (地址 :  0x40020400) 

     2.然后找到GPIO 配置引脚的部分:

     

    GIOPB 引脚输出设置的地址  (基本地址 + 偏移量 )

    地址:0x40020400   +  0x00

    赋值的大小:  

    或者为0x100000

    代码:

    1. unsigned int * BEEP_PEMODE = (void*)(0x40020400 + 0x00);//设置引脚为 输出模式 或者输入模式
    2. *BEEP_PEMODE=0x100000;//设置引脚为 GPIOB 10 输出模式

    输出类型  :   (也可以不设置   因为默认状态是  推挽输出) 

     

     地址 (基地址  + 偏移地址)=    GPIOB  (地址 :  0x40020400)+ (偏移地址  0x04)

    赋值的大小:0x000

    代码:

    1. unsigned int * BEEP_PEMODE_leixing = (void*)(0x40020400 + 0x04);//设置引脚的输出类型
    2. *BEEP_PEMODE_leixing=0x000000;//设置输出类型 为推挽输出

     速度:  (假如设置引脚的速度为低速  也可以不要设置,因为它默认是 低速)

     

    地址 (基地址  + 偏移地址)=    GPIOB   (地址 :  0x40020400)+ (偏移地址  0x08)

    赋值的大小:0x00000

    代码:

    1. unsigned int * BEEP_PESPEED = (void*)(0x40020400 + 0x08);//设置引脚 的速度
    2. *BEEP_PESPEED=0x0000;//设置引脚 的速度 GPIOB 10 为低速

     电阻:     (  蜂鸣器  一般配置 上拉电阻)

    地址 (基地址  + 偏移地址)=     GPIOB   (地址 :  0x40020400)+ (偏移地址  0x0c)

    赋值的大小:0x100000

    代码:

    1. unsigned int * BEEP_PEMODE_dianzu = (void*)(0x40020400 + 0x0c);//设置引脚的电阻
    2. *BEEP_PEMODE_dianzu=0x100000;//引脚 10 为上拉电阻

    引脚输出的电平 :( 蜂鸣器响  为输出高电平)

    地址 (基地址  + 偏移地址)=    GPIOB   (地址 :  0x40020400)+ (偏移地址  0x14)

    赋值的大小:0x400 

    代码:

    1. unsigned int * BEEP_PEdata = (void*)(0x40020400 + 0x14);//设置引脚的输出的电平
    2. *BEEP_PEdata =0x400;//开启蜂鸣器
    3. //*BEEP_PEdata =0x0000;//关闭蜂鸣器

    蜂鸣器的所有代码:

    1. unsigned int * BEEP_PECLK =(unsigned int *)(0x40023800 + 0x30);//配置时钟
    2. unsigned int * BEEP_PEMODE = (void*)(0x40020400 + 0x00);//设置引脚为 输出模式 或者输入模式
    3. unsigned int * BEEP_PEMODE_leixing = (void*)(0x40020400 + 0x04);//设置引脚的输出类型
    4. unsigned int * BEEP_PEMODE_dianzu = (void*)(0x40020400 + 0x0c);//设置引脚的电阻
    5. unsigned int * BEEP_PESPEED = (void*)(0x40020400 + 0x08);//设置引脚 的速度
    6. unsigned int * BEEP_PEdata = (void*)(0x40020400 + 0x14);//设置引脚的输出的电平
    7. *BEEP_PECLK= 0X02;//设置时钟
    8. *BEEP_PEMODE=0x100000;//设置引脚为 GPIOB 10 输出模式
    9. *BEEP_PEMODE_leixing=0x000000;//设置输出类型 为推挽输出
    10. *BEEP_PEMODE_dianzu=0x100000;//引脚 10 为上拉电阻
    11. *BEEP_PESPEED=0x0000;//设置引脚 的速度 GPIOB 10 为低速
    12. *BEEP_PEdata =0x400;//开启蜂鸣器
    13. //*BEEP_PEdata =0x0000;//关闭蜂鸣器


    12.KEY 模块的代码:

    1. //1.时钟 //配置好 PE 和 PB时钟
    2. AHB1 = 0x12;
    3. //2.1配置灯 //输出模式 灯的其他部分用默认值
    4. unsigned int *PEMODELED = (void*)(0x40021000 + 0x00);
    5. *PEMODELED = (1<<8*2 | 1<<9*2 | 1<<10*2);
    6. //2.2:配置按键
    7. *PEMODELED |= 0x000;//位或有添加位的功能;//0000 1000 | 0100 0000 = 0100 1000
    8. //2.3:配置蜂鸣器
    9. unsigned int *PBMODEBEEP = (void*)(0x40020400 +0x00 );
    10. *PBMODEBEEP = 1<<10*2;
    11. //2.4:给按键配置一个上拉电阻
    12. unsigned int *PEKEYUPDER = (void*)(0x40021000 + 0X0C);
    13. *PEKEYUPDER = 1 << 5*2 ;
    14. //3.操作部分 三个关灯操作
    15. unsigned int *PEDATALED = (void*)(0x40021000 + 0x14);
    16. *PEDATALED =(1<<8 | 1<<9 | 1<<10);
    17. //3.1蜂鸣器数据寄存器
    18. unsigned int *PBBEEPDATA =(void*)( 0x40020400 + 0x14);
    19. //4.按键的输入数据寄存器准备好
    20. unsigned int *PEKEYINPUT = (void*)(0x40021000 + 0X10);
    21. while(1)
    22. {
    23. //
    24. if(!(*PEKEYINPUT & 0x20))//假如按下第二个按键
    25. {
    26. *PEDATALED = 0x00;//LED 灯 低电平
    27. *PBBEEPDATA = (1 <<10);//BEEP 响
    28. }
    29. if(!(*PEKEYINPUT & 0x40))//假如按下第三个按键
    30. {
    31. *PEDATALED =(1<<8 | 1<<9 | 1<<10);//关闭LED 灯
    32. }
    33. }




    附加的知识:


  • 相关阅读:
    26个开发者常用必备网站汇总推荐
    【从头构筑C#知识体系】2.2 分部类型
    进程的通信 - 剪切板
    某计费管理系统任意文件读取漏洞
    【树莓派不吃灰】Raspberry Pi上搭建NodeJS运行环境
    【mcuclub】STC89C52单片机最小系统讲解
    nodejs安装和环境配置-Windows
    基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(简单支持发起人与审批人的流程)续
    Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
    RestTemplat
  • 原文地址:https://blog.csdn.net/she666666/article/details/127094387