您的位置 首页 IOT

学习STM32(2)-IO-AFIO(复用功用IO和调试装备)

最近在学习STM32,在BZ上一篇关于的串口通信文章里有这么一段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD

最近在学习STM32,在BZ上一篇关于的串口通讯文章里有这么一段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);

最初是参阅开发的里子写的一直对GPIOD或上“RCC_APB2Periph_AFIO”这句话的意思没搞懂,经过这几天在网上查找材料和看手册,总算高清楚了,不敢独享,期望能对跟我相同的新手有所协助吧o(∩_∩)o…

STM32上有许多I/O口,也有许多的内置外想象I2C,ADC,ISP,USART等,为了节约引出管脚,这些内置外设基本上是与I/O口共用管脚的,也便是I/O管脚的复用功用。可是STM32还有一特别之处便是:许多复用内置的外设的I/O引脚能够经过重映射功用,从不同的I/O管脚引出,即复用功用的引脚是可经过程序改动的。知道了这些咱们就不难理解上面代码的意思了,程序中用到的USART2外设的TX,RX别离对应PA2,PA3,可是我的学习板上的PA2,PA3引脚接了其他设备,可是为了还要用USART2,“RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO”就翻开了GPIOD重映射功用把USART2设备的TX,RX映射到PD5,PD6上,咱们在这两个引脚上接上MAX232串口芯片就能够运用USART2串口通讯了。那为看官该问:“USART2是不是能够映射到恣意管脚呢?”答案是否定的,它只能映射到固定的管脚,下图是USART2重映射表

其他外设的重映射能够参阅STM32100X手册。

为了节约IO资源单片机会在一个IO上复用许多功用,一般的单片机用到 一个功用后就能再用两外复用的功用了,这就表现出了STM32 GPIO的强壮功用了,咱们用重映射的办法把其间一个外设映射到其他IO脚上,这样就能够充分利用片内资源!

惹祸你认为IO和AFIO是很简略的,现实上有几个误区或许许多人都没留意过,当你只用现成的开发板来学习的时分,他人现已帮你做好了资源分配,一切的外设功用学习都是照着他人给你的例程去做的,这才没让你觉得古怪。

先问自己一个问题:STM32中,USART2和TIM2是共用相同IO的,你怎么决议这几个IO到底是做USART2仍是做TIM2呢?假如你要一起运用USART2和TIM2,该怎么办?

1、不是说运用了IO的复用功用就必定要发动RCC_APB2Periph_AFIO的Clock的,参阅下图

只需运用了AFIO的工作操控寄存器、AFIO的重映射功用以及外部中止(EXTI)操控寄存器才需求舱位AFIO的时钟,STM32参阅手册历来没说过运用IO的复用功用就必定要舱位AFIO时钟,这是个误区。

例如下面的,最常用的USART1,假如你的板子上,默许用的便是PA9和PA10这两个IO作为USART1的TX和TX,那么也便是没有重映射,No Remap,这种状况下底子不需求舱位AFIO时钟,只需舱位USART1的外设时钟就行了。这个试验很简略,自己试试就知道了。

2、从上面的图你能够看到,本来USART1是能够放在PB6和PB7上面的,只不过简直一切的原理图封装中都不会在PB6和PB7的复用功用上标出它能够当USART1用,究竟这种重映射的状况太多,简直一切外设都能够重映射,每个都标出来会十分紊乱。

STM32中,USART2的CTS、RTS、TX、RX和TIM2的CH1~CH4都在PA0~PA3上面,具体要怎么挑选这两个功用呢?

假如要运用USART2,就开端USART2的外设时钟,假如要运用TIM2,就舱位TIM2的外设时钟,假如你一起舱位,我也不知道会怎么样,你能够自己试试,我觉得应该是两个都不能用。假如你必定要在PA0~PA3上运用这两个功用,只能是时分复用。

正确的一起运用USART2和TIM2,应该是运用上面提到的AFIO_Remap寄存器,将其间的一个重映射到其他IO上去,当然这样其他IO的自身的复用功用你就不能舱位了。

回到前面的问题,假如你不做Remap,你底子不或许一起在PA0~PA3上一起运用这两个外设,现在你的计划有两种:

一、保存USART2在PA口上,将TIM2彻底重映射(Full Remap)到其他IO上,或许,假如你不必RTS和CTS的硬件流操控,PA0(CTS)和PA1(RTS)上对应的CH1和CH2是能够不必重映射的,只需求将Bit9:8改成10,也便是将CH3和CH4部分重映射到PB10和PB11上去,而CH1和CH2持续保存在PA0和PA1上。但这种状况下,PB10和PB11上的I2C2和USART3就不能用了。

二、保存TIM2在PA口,将USART2重映射到PD口上,很明显,当TIM2彻底不重映射时,USART2有必要的信号线只需Clock不受影响,这种状况下也没有部分映射可言了,有必要将USART2彻底重映射到PD3~PD7上,相同的,这种状况下FSMC就不能用了。

STM32上有许多I/O口,也有许多的内置外想象I2C,ADC,ISP,USART等,为了节约引出管脚,这些内置外设基本上是与I/O口共用管脚的,也便是I/O管脚的复用功用。可是STM32还有一特别之处便是:许多复用内置的外设的I/O引脚能够经过重映射功用,从不同的I/O管脚引出,即复用功用的引脚是可经过程序改动的.读到这儿信任咱们都应该了解了端口重映射的一些概念了.原理上的东西不细说了,咱们能够看手册或许网上查,这方面的材料仍是许多的.下面说说我的调试阅历.

上面说过,我用的CPU是STM32F103VCT6 ,提到这儿跟咱们提一个小插曲.其时在老板让我换计划也便是CPU时,只说用VC的CPU,让我把要买的CPU告知担任买器材的人,咱们我是第一次做,所以傻呵呵的写了张纸给了对方.内容是”STM32F103VC 10PCS”对方看了一眼就给我退了回来并加一句”类型不对,没写全”.我没理解,便也欠好持续问痴人问题,所以跑网上查,本来光这个CPU就不止一种.咱们选用的是T6也便是LQFP封装的工作环境为-40C — 80C.所以说咱们今后当心点儿 ..言规正传.不知道是什么原因 PCB制图时把串口接到USART1上了,其时也没介意,等我把USART测验程序写好烧进去硬件仿真时,串口给的是乱码,我其时就觉得古怪.把程序查看了好几遍便是查不出问题来,认为是硬件有问题,但忽然想到了STM有复用功用,心想会不会是这儿有鬼?所以找来datasheet 一看 ,水落石出


三个红框交汇处.STM32F103VCT6 这个CPU的USART1接的是PB6/PB7 可是上电初始化后默许功用并非是USART1.所以想要用串口功用 .有必要用端口重映射..

咱们知道,STM32的单片机每个功用模块有自己的时钟体系,所以要想要调用STM32单片机的功用模块时有必要先装备对应时钟,然后才能去操作相应的功用模块.端口重映射也相同.如图示:

重映射过程为:

1.翻开重映射时钟和USART重映射后的I/O口引脚时钟,

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

2.I/O口重映射舱位.

GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

3.制造重映射引脚,这儿只需装备重映射后的I/O,本来的不需求去装备.

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);

只需求这三步,串口就能够正常运用了,简略吧? 可是我纠结了大半个小时才搞定的,很多工作都是说起来简单做起来难的,期望我今后多多行进.不要眼高手低,嗯 我正朝这个方向行进.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/263561.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部