• 嵌入式02 STM32 实验01 端口复用和重映射


    内设与外设:

      端口复用和端口重映射都需要了解内设和外设,那么什么是内设?什么是外设?

      内设:单片机内部集成的功能一般包括:串口模块、SPI模块(Serial Peripheral Interface  串行外设接口)、I2C模块(Philips公司开发的一种简单、双向二线制同步串行总线)、A/D模块(模数转换器)、PWM模块(Pulse Width Modulation  脉冲宽度调制)、CAN模块(Controller Area Network  控制器局域网络)、EEPROM(Electrically Erasable Programmable read only memory  带电可擦可编程只写存储器)、比较器模块等等,都是集成在单片机芯片的内部,有相应的寄存器控制,可以通过指令直接控制

      外设:单片机外部的外围功能模块,比如键盘控制芯片,液晶(OLED、LCD)、无线模块等等,外设可通过单片机的I/O、SPI、I2C等总线控制

    端口复用

      STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个内置外设使用的时候,此时是不可以作为外部外设使用的,此时这个端口就叫做被复用了。

      比如一个端口可以作为输入输出(使能端口时钟),同时它也可以作为串口使用(使能串口时钟),此时就说明这个端口被复用了

      端口复用是重点,只要使用stm32就要用到外设,外设是与gpio引脚共用(复用)的,即某些引脚既可以单纯作为输入输出,又可以作为具有一定功能的内设(如ADC, 串口等等)的引脚端口。

    实现方法:

      1、使能端口时钟

      2、使能复用功能的时钟

      3、按照数据手册配置端口模式

     1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //①IO时钟使能
     2 
     3 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);  //②外设时钟使能
     4 
     5 //③初始化IO为对应的模式
     6 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                //PA.9
     7 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
     9 GPIO_Init(GPIOA, &GPIO_InitStructure);
    10 
    11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                     //PA10 PA.10 浮空输入
    12 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //浮空输入
    13 GPIO_Init(GPIOA, &GPIO_InitStructure);  

    端口重映射

      为了使不同器件封装的外设IO功能数量达到最优,可以把一些复用功能重新映射到其它的一些引脚上,也就是该端口很忙,你找它的徒弟,它也可以完成师傅干的事。

      STM32中有很多内置外设的输入输出引脚都具有重映射(remap)的功能。我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好的安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。

      打个比方说,串口1的TX,RX引脚是在PA9,和PA10端口,但是同时它有两个映射端口PB6,PB7。开启重映射,PB6和PB7同样可以使用串口1。

      也就是说把管脚的外设功能映射到另一个管脚,但不是可以随便映射的,具体看每个芯片的参考手册

    实现方法:

      1、使能重映射后的IO口

      2、使能功能外设的时钟

      3、使能AFIO时钟

      4、依据数据手册设置GPIO口数据

      5、开启重映射

     1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//①IO时钟使能
     2 
     3 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//②外设时钟使能
     4 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);③复用时钟使能
     5 
     6 //④初始化IO为对应的模式
     7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9//复用推挽输出
     8 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    10 GPIO_Init(GPIOA, &GPIO_InitStructure);
    11 
    12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 PA.10 浮空输入
    13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    14 GPIO_Init(GPIOA, &GPIO_InitStructure);  
    15 
    16 GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);//开启重映射
  • 相关阅读:
    QQ音乐 删除历史登录设备
    mweb发布文章为什么默认TinyMCE编辑器?
    Mac 安装 Homebrew
    uniapp配置scss支持
    PHPRedis教程之geo
    CentOS7通过YUM安装NGINX稳定版本
    CentOS7通过YUM安装MySQL5.6
    更换composer镜像源为阿里云
    使用chattr禁止文件被删除
    centos 7 源码安装 mysql 5.6
  • 原文地址:https://www.cnblogs.com/ksht-wdyx/p/11594744.html
Copyright © 2020-2023  润新知