0%

stm32_note_03day

===========================
2022-8-17
===========================

一.温故知新

    从表象到里象的方式去了解设备
    1.从外观入手
        开发板上外接了哪些模块、使用芯片的型号
    2.画图了解芯片内部结构
        CPU + 内存 + 硬盘 + 外设
    3.介绍了ARM公司和ST公司
        ARM-CORTEX-A	针对高端应用(手机 平板电脑 安卓电视)
        ARM-CORTEX-R	针对实时操作系统(军工、航天、医疗)
        ARM-CORTEX-M	针对工控领域(智能终端设备)	
    4.通过手册了解芯片
        最新选型手册 : 外设数量、存储大小、封装形式
    5.开发方式
    6.搭建模板项目工程

二.通过硬件的手册了解芯片内部的结构

    打开<STM32RBT6\DataSheet\STM32>目录下<STM32F103RB.pdf>
    P19	芯片内部的结构
    
    1.STGM32F103RBT6芯片使用的CPU是ARM-CORTEX-M3主频是72MHz
    2.CPU是通过三总线来访问外设的
    3.三总线包括 : 数据总线(传输数据) 地址总线(传输地址) 控制总线(控制读写)
    --------------------------------------------------------
    例子 :
    在某工程中,要求给地址为0xaa55的空间复制一个整型的数据,
    数据为0x55aa
    0xaa55 = 0x55aa;.//不可以,因为左值是一个常量
    *(volatile unsigned int *)(0xaa55) = 0x55aa;
    --------------------------------------------------------
    4.在STM32芯片中AHB AHB1 AHB2都是三总线,叫做高速总线
        APB1 APB2也是三总线,叫做外设总线
    5.GPIO的管脚是从0开始计数的
        GPIOxy
        [x = A B C D]
        [y = 0 1 2 ... 15]
    6.大部分的外设都是连接到了外设总线上,所以当某个外设工作时
    需要先通过相应的外设总线打开外设的时钟,该外设才能工作
    
    P23	芯片的管脚
    GPIOA	[0 - 15]
    GPIOB	[0 - 15]
    GPIOC	[0 - 15]
    GPIOD	[0 1 2]

    P26	芯片管脚的复用
    芯片的管脚是多功能复用型的管脚
        输入功能
            上拉输入
            下拉输入
            浮空输入
        输出功能
            推挽输出
            开漏输出
        复用功能
            推挽复用
            开漏复用
        模拟功能
            模拟输入

三.GPIO外设之输出功能

    输入功能相当于是检测,输出功能相当于是控制
    输出功能分为推挽输出和开漏(漏级)输出
    推挽输出 : 管脚既可以输出高电平,也可以输出低电平
    开漏输出 : 管脚只能输出低电平,输出不了高电平
    LED->PC9管脚
    如果PC9管脚输出高电平,LED灯灭
    如果PC9管脚输出低电平,LED灯亮

01LED灯

    问题 : 芯片的管脚是多功能复用型的管脚,如何给管脚选择输出功能?
    答 : 可以通过操作GPIO外设的寄存器来选择输出的功能
    问题 : GPIO都有哪些寄存器?
    答 : 可以通过查询芯片的手册了解GPIO的寄存器以及操作方式
打开<STM32RBT6\DataSheet\STM32>目录下<STM32F10x中文参考手册.pdf>
寄存器的真实地址 = 基地址 + 偏移地址
例如 : 
GPIOC_CRL的真实地址 = GPIOC组的基地址 + CRL寄存器的偏移地址
        = 0x40011000 + 0x00
因为需要操作PC9管脚,所以需要使用端口配置高寄存器
GPIOC_CRH的真实地址 = GPIOC组的基地址 + CRH寄存器的偏移地址
        = 0x40011000 + 0x04
#define GPIOC_CRH *(volatile unsigned int *)(0x40011000 + 0x04)
GPIOC_CRH |= (3 << 4);//把PC9管脚配置为输出功能并且为50MHz的输出速率
-----------------------------------------------------------------------------
3		00000000 00000000 00000000 00000011
3<<4		00000000 00000000 00000000 00110000
    |
GPIOC_CRH	xxxxxxxx xxxxxxxx xxxxxxxx xx##xxxx
    =
GPIOC_CRH	xxxxxxxx xxxxxxxx xxxxxxxx xx11xxxx
-----------------------------------------------------------------------------
GPIOC_CRH &= ~(3 << 6);.//把PC9管脚配置为推挽输出
-----------------------------------------------------------------------------
3		00000000 00000000 00000000 00000011
3<<6		00000000 00000000 00000000 11000000
~(3<<6)		11111111 11111111 11111111 00111111
    &
GPIOC_CRH	xxxxxxxx xxxxxxxx xxxxxxxx ##11xxxx
    =
GPIOC_CRH	xxxxxxxx xxxxxxxx xxxxxxxx 0011xxxx
-----------------------------------------------------------------------------
#define GPIOC_ODR *(volatile unsigned int *)(0x40011000 + 0x0C)
GPIOC_ODR &= ~(1 << 9);//把PC9管脚输出低电平(亮灯)

GPIOC_ODR |= (1 << 9);//把PC9管脚输出高电平(灭灯)

四.通过开发板原理图查看芯片的管脚

    打开<STM32RBT6\开发板原理图>目录下<MCU.pdf>和<Periph.pdf>
    LED0	PC1
    LED1	PC2
    LED2	PC3
    输出高电平,灯亮
    输出低电平,灯灭
    需要操作GPIOC_CRL(端口配置低寄存器)以及
        GPIOC_ODR(端口输出数据寄存器)

五.写程序驱动LED灯

    1.通过开发板原理图找到LED灯连接的管脚
    2.分析模块的工作方式
    3.把最近的一个项目工程拷贝一份重命名一下
    4.在<02led/mylib>目录中新建<led.c>和<led.h>
    5.在<02led/project>目录中找到项目工程文件,并且打开
    6.在Keil的左边侧边栏中的mylib组内添加led.c文件

六.举一反三

    大家通过<02led>的项目工程,尝试着搭建<03beep>的项目工程
    效果
    在流水灯的基础上加入蜂鸣器
    0 1 2
    0->1->2->0->1->2
    灯亮的同时蜂鸣器响,灯灭的同时蜂鸣器关闭

=================================
作业
1.把今天讲过的内容完完整整的复习一遍
2.把举一反三的内容做出来
3.刷题
课外
自己找音乐的编码把音乐通过蜂鸣器播放出来
=================================