嵌入式(2端口编程)

STM32单片机的管脚命名规则

stm32管脚

以STM32F103Cx为例,采用的封装形式为LQFP48,共有37个I/O管脚(PA口16脚+ PB口16脚+ PC口3脚+ PD口2脚)。其中stm32没有专门的读写控制线,读写控制是由某个I/O口线来控制的。

  • 对于STM32F103xxyy系列而言:
    • 第一个x代表引脚数:T代表36引脚,C代表48个引脚,R代表64个引脚,V代表100个引脚,Z代表144个引脚。
    • 第二个x代表内嵌的Flash容量:6代表32KB,8代表64KB,B代表128KB,C代表256KB,D代表384KB,E代表512KB。
    • 第一个y代表封装:H代表BGA封装,T代表LQFP封装,U代表QFN封装。
    • 第二个y代表工作温度范围:6代表-4085℃,7代表-40105℃。

STM32单片机的时钟配置

嵌入式进行初始化的过程,包含有RCC_Configuration(RCC:Reset Clock Control。复位和时钟设置)函数。用于系统复位和初始化STM32微控制器的时钟。

STM32系统时钟

  • STM32系列微控制器有5个时钟源:HSI、HSE、LSI、LSE和PLL(其中HSI、HSE或PLL可被用来驱动系统时钟,LSI和LSE作为二级时钟源,供RTC使用等)
    • HSI:高速内部时钟,RC振荡器,频率为8MHz(精度较差)。默认打开为系统时钟。
    • HSE:高速外部时钟,可接石英/陶瓷振荡器,或者接外部时钟源,频率范围为4~16MHz(精度高)。
    • LSI:低速内部时钟,RC振荡器,频率30~60kHz。
    • LSE:低速外部时钟,接频率为32.768kHz的石英晶体,供实时时钟RTC使用。
    • PLL:锁相环倍频输出,其时钟源可选择为HSI/2、HSE或HSE/2。倍频可选择为2~16倍,但是其输出频率最大不能超过72MHz。

注:PLL:锁相回路,也称锁相环。锁相环是一种反馈控制电路,特点为:利用外部输入的参考信号控制环路内部振荡信号的频率和相位。通常用于闭环跟踪电路。

STM32外设对应的时钟使能

总线结构

连接在各个总线上设备可查看上一篇:嵌入式(1绪论)。在第四部分介绍STM32微控制器的系统结构中,图中有标出接在各个总线上的设备。

  • 我们根据外设接在不同的总线上,可以把外设时钟使能命令分为3类*(所有的外设时钟,都由RCC来控制)*:
    • 使能接在APB1总线上的外设对应的时钟函数:RCC_APB1PeriphClockCmd()
    • 使能接在APB2总线上的外设对应的时钟函数:RCC_APB2PeriphClockCmd()
    • 使能接在AHB总线上的外设对应的时钟函数:RCC_AHBPeriphClockCmd()

注:使用按位或运算符 “ | ” 可以一次性使能多个外设时钟。

基于ARM Cortex内核的MCU和传统8/16位单片机的区别

C8051F系列单片机:通常包括3个时钟——外部时钟(高速)、内部高速时钟、内部低速时钟(供RTC使用)。虽然有多个时钟,但是没有实现高速设备配备高速时钟,低速设备配备低速时钟。且没有时钟控制开关。


基于ARM Cortex内核的单片机:通常包括4个时钟——外部高速时钟、内部高速时钟、内部低速时钟(供RTC使用)、外部低速时钟(供RTC使用)。不仅比C8051F系列单片机多一个外部低速时钟(供RTC使用);
而且实现高速时钟用高速设备,低速时钟用低速设备。时钟分开有助于实现低功耗。且有时钟控制开关,当我们需要使用某个外设模块时,要先使能该外设对应的时钟,否则不能工作。

复位和时钟配置函数RCC_Configuration()

RCC寄存器映像和复位值表

以上是RCC寄存器映像和复位值表。

  • stm32单片机的RCC寄存器(复位和时钟控制)单元:包括了10个寄存器设置
    • 一个32位时钟控制寄存器(RCC_CR)
    • 一个32位时钟配置寄存器(RCC_CFGR)
    • 一个32位时钟中断寄存器(RCC_CIR)
    • 一个32位APB2外设复位寄存器(RCC_APB2RSTR)
    • 一个32位APB1外设复位寄存器(RCC_APB1RSTR)
    • 一个32位AHB外设时钟使能寄存器(RCC_AHBENR)
    • 一个32位APB2外设时钟使能寄存器(RCC_APB2ENR)
    • 一个32位APB1外设时钟使能寄存器(RCC_APB1ENR)
    • 一个32位备份域控制寄存器(RCC_BDCR)
    • 一个32位控制/状态寄存器(RCC_CSR)

RCC寄存器的首地址为0x40021000。定义RCC配置寄存器的结构体RCC_TypeDef,结构体中的变量与各个外设寄存器一一对应,通过结构体来完成时钟的配置。

嵌入式系统中,volatile大量地用来描述一个对应于内存映射的输入/输出端口,或者硬件寄存器(如状态寄存器)。volatile的变量是指这个变量是易变的,可能会被意想不到的改变,这样的变量,编译器优化时,在用到这个变量时必须每次都必须访问实际地址存储器的内容,而不是使用保存在寄存器中的副本。


STM32单片机的I/O端口配置

STM32单片机最多有7个16位的并行I/O端口:PA、PB、PC、PD、PE、PF、PG。STM32F103Cx单片机只有4个16位的并行I/O端口:PA、PB、PC、PD。P代表Port端口;GPIOx为通用I/O口,其中的G代表General通用,P代表Purpose目的;AFIO为复用I/O口,其中A代表Alternate复用的,交替的,F代表Function功能。

  • 每个GPIOx端口共有7个设置寄存器:
    • 两个32位的配置寄存器(GPIOx_CRL,GPIOx_CRH):GPIOx端口低配置寄存器,用于配置GPIOx端口的第0位~第7位。
    • 两个32位的数据寄存器(GPIOx_IDR,GPIOx_ODR):MCS51单片机IO端口的输入、输出数据寄存器共用一个寄存器Px,STM32单片机的输入、输出寄存器是分开的。
    • 一个32位的置位/复位寄存器(GPIOx_BSRR)
    • 一个16位的复位寄存器(GPIOx_BRR)
    • 一个32位的锁定寄存器(GPIOx_LCKR)
  • GPIO的特点:
    • 耐压:很多I/O引脚可以承受5V。
    • I/O引脚可以最大输出电流或吸收电流25mA(总共可吸收150mA)
    • I/O引脚最大输出速度可达50MHz。
    • 锁定机制可以避免I/O口的寄存器的误写操作:当对一个I/O的某一位进行锁定序列操作后,该位的序列不再可能被修改,直到下一次复位。
    • 最多可达16路的模拟输入。
    • 可改变功能引脚。
    • 一个I/O引脚可用于将MCU从待机模式唤醒(PA0)。
    • 一个I/O引脚可用作防入侵引脚(PC13)。
    • I/O引脚18MHz的翻转速度。
  • 端口低配置寄存器(GPIOx_CRL),端口高配置寄存器(GPIOx_CRH):分别配置一个端口的低8位和高8位
  • MODEy[1:0]:端口x的模式位
    • 00:输入模式(复位后的状态
    • 01:输出模式,最大速度10MHz
    • 10:输出模式,最大速度2MHz
    • 11:输出模式,最大速度50MHz
  • CNFy[1:0]:端口x配置位
    • 如果是在输入模式下(MODE[1:0]=00)
      • 00:模拟输入模式
      • 01:浮空输入模式(复位后的状态
      • 10:上拉/下拉输入模式
      • 11:保留
    • 如果是在输出模式下(MODE[1:0]>00)
      • 00:通用推挽输出模式
      • 01:通用开漏输出模式
      • 10:复用功能推挽输出模式
      • 11:复用功能开漏输出模式

使用按位或运算符 " | " 可以一次选中多个管脚。GPIO端口外设,无需使能即可使用,且管脚默认是浮空输入。当管脚用作输入时,只需要设置管脚和工作模式,速度不需要设置。

typedef struct
{
  u16   GPIO_Pin; //定义引脚
  GPIOSpeed_TypeDef   GPIO_Speed; //设置输出速度
  GPIOMode_TypeDef    GPIO_Mode; //设置工作模式
}GPIO_InitTypeDef;    //定义了端口参数

typedef enum
{ 
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;  //列举出GPIO管脚的所有可能的最大响应速度

typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef; //列举出GPIO管脚的所有可能的工作模式

I/O端口位的复用功能配置,仅有输出,才有复用功能。而开漏输出、推挽输出和复用功能的开漏输出、推挽输出的不同之处:①引脚和输出寄存器断开,并和片上外设的输出信号连接;② 增加了复用功能Input。

虽然没有复用输入功能模式,但是当某引脚使用其复用功能,并且作为输入引脚使用时:该引脚作为复用输入使用



感觉嵌入式的整体编程框架在我的脑子里属于若隐若现的状态,整体的框架还没有很实在的理解透彻,但又知道一点大概。还是继续努力学习吧,如果有什么错误或不足之处,望指正。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值