完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
F4的复用功能配置
**之前使用F429的时候算是知道了怎么配置它的复用功能,但是前天在用到F103的时候发现和自己想的不一样,查了一下资料发现完全不用,所以这里做一些记录方便以后查阅,先来介绍F4复用功能配置 F4的复用功能配置数据手册上说的非常清楚,F4的复用功能配置寄存器有两个,一个低位寄存器和一个高位寄存器,低位寄存器用来配置对应GPIO端口的前8个IO口,高位寄存器用来配置后8个IO口,每4个bit位对应一个IO口,所以每个IO口可以配置的复用功能为AF0-AF15,但不是说每个IO口上AF0到AF15所有的功能都有,上面第二张图片给出了AF0到AF15所对应的复用功能,具体每个IO口上有哪些复用功能可以去看数据手册的alternate function mapping部分,有详细说明。 F1的复用功能配置 下面来说下F1的复用功能配置,F1的复用功能不想F4那样,想用那个就配置那个,具有复用功能的IO口默认就只有一个复用功能,换句话来说就是,每个能复用的IO口上都具有默认的复用功能,没有F4那么多的选择,默认你就只能用这一个,只需要把IO口配置成复用模式然后开启相对应的外设时钟就可以了。F1某些引脚还具有重映射的功能,比如上图,PB6,PB7默认是I2C的时钟线和数据线,你使用I2C功能时只需要开启I2C1这个外设的时钟就可以使用了,但是你如果不想使用这个默认功能,这个引脚上还有一个USART1外设功能,你想使用这个外设就必须要配置AFIO_MAPR这个寄存器将USART1这个外设重映射到这两个引脚上这时你的I2C1这个外设就不能用了,具体外设重映射脚位可以在数据手册上找到,具体的配置细节说明可以参考下面这篇文档 https://www.cnblogs.com/renmeditation/articles/9977183.html F4库里面的复用功能配置函数 最好来说一下我对F4这个库里面的复用功能配置函数的理解,F1的库暂时还没研究过,不过感觉算法上应该都差不多吧 void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) { uint32_t temp = 0x00; uint32_t temp_2 = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); assert_param(IS_GPIO_AF(GPIO_AF)); temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp; GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2; } GPIO_PinSource这个参数对应的是GPIO口0-15的编号 temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; 这一句是将需要配置的AF值GPIO_AF(0-15)移位到对应的IO口的4bit位上,GPIO_PinSource & 0x07便可以算出需要移位的单位因为与0x07相与得到的都是0-7之间的数,因为大于0-7的倍数部分都与0相与了,得到的都是0-7整除之后的余数,比如:9的二进制展开是1001,7的二进制展开是0111,这里bit3位都是前三位的倍数,相与之后等于1,刚好对应。这个例子中是每4个bit对应一个IO,对应0-7,每次右移的单位都是4bit。所以在0111这4bit位中低三位可以用来确定在32位寄存器中的属于哪个位置,bit3位可以用来确定在那个寄存器组 PIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;GPIOx->AFR[GPIO_PinSource >> 0x03]这一句就是验证了上面的算GPIO_PinSource的值右移3个bit位后就只剩下bit3位的值,如果该位为0就是0组,为1就是1组,也就是对应这复用功能低位寄存器和复用功能高位寄存器,后面的和上面的一样,只是这里是将0xF移位到对应的位置然后取反清0 temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;这句表示将当前寄存器的值与上AF值移位后的值,然后保存在temp_2这个变量中 GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;将最终计算出来在temp_2中的值写入寄存器中 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1754 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1613 浏览 1 评论
1053 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1667 浏览 2 评论
1927浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
712浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
562浏览 3评论
584浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
544浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 07:24 , Processed in 0.904814 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号