开启和关闭AFIO时钟

STM32F1的引脚,在上电复位后所具有的功能被称为主功能,大部分的引脚所具有的主功能即作为通用的输入输出引脚(GPIO),引脚除主功能外还具有备用功能,当选择备用功能时即作为复用输入输出(AFIO)
这里写图片描述
在单片机数据手册中可以查看到(表5 中等容量STM32F103xx引脚定义),有些引脚的备用功能有两种,一种为默认复用的,一种为重定义的。当使用引脚的默认复用功能时,AFIO不需开启;使用重定义的功能时,AFIO需要开启。还有一种情况,使用EXTI外部中断也需开启AFIO。
例如我们使用PA7作为TIM3的的第二通道,或者将PB10、PB11配置为USART3来用,则不需要操作AFIO。
这里写图片描述
大部分引脚主功能是作为GPIO,但PB3、PB4的主功能是作为程序下载与复位单片机的引脚。因此需要开启PB3、PB4的重定义的功能使其变为通用输入输出。程序如下:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
APB2使能寄存器(RCU_APB2EN)地址偏移:0x18复位值:0x0000 0000该寄存器可以按字节(8位)、半字(16位)或字(32位)访问。31302928272625242322212019181716保留TIMER10ENTIMER9ENTIMER8EN保留rwrwrw1514131211109876543210ADC2ENUSART0ENTIMER7ENSPI0ENTIMER0ENADC1ENADC0ENPGENPFENPEENPDENPCENPBENPAEN保留AFENrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw位/位域名称描述31:22保留必须保持复位值。21TIMER10ENTIMER10时钟使能由软件置位或复位0:关闭TIMER10时钟1:开启TIMER10时钟20TIMER9ENTIMER9时钟使能由软件置位或复位0:关闭TIMER9时钟1:开启TIMER9时钟19TIMER8ENTIMER8时钟使能由软件置位或复位0:关闭TIMER8时钟1:开启TIMER8时钟18:16保留必须保持复位值。 GD32F30x用户手册9915ADC2ENADC2时钟使能由软件置位或复位0:关闭ADC2时钟1:开启ADC2时钟14USART0ENUSART0时钟使能由软件置位或复位0:关闭USART0时钟1:开启USART0时钟13TIMER7ENTIMER7复位由软件置位或复位0:无作用1:复位TIMER712SPI0ENSPI0复位由软件置位或复位0:无作用1:复位SPI011TIMER0ENTIMER0复位由软件置位或复位0:无作用1:复位TIMER010ADC1ENADC1时钟使能由软件置位或复位0:关闭ADC1时钟1:开启ADC1时钟9ADC0ENADC0时钟使能由软件置位或复位0:关闭ADC0时钟1:开启ADC0时钟8PGEN GPIO端口G时钟使能由软件置位或复位0:关闭GPIO端口G时钟1:开启GPIO端口G时钟7PFEN GPIO端口F时钟使能由软件置位或复位0:关闭GPIO端口F时钟1:开启GPIO端口F时钟6PEEN GPIO端口E时钟使能由软件置位或复位0:关闭GPIO端口E时钟 GD32F30x用户手册1001:开启GPIO端口E时钟5PDEN GPIO端口D时钟使能由软件置位或复位0:关闭GPIO端口D时钟1:开启GPIO端口D时钟4PCEN GPIO端口C时钟使能由软件置位或复位0:关闭GPIO端口C时钟1:开启GPIO端口C时钟3PBEN GPIO端口B时钟使能由软件置位或复位0:关闭GPIO端口B时钟1:开启GPIO端口B时钟2PAEN GPIO端口A时钟使能由软件置位或复位0:关闭GPIO端口A时钟1:开启GPIO端口A时钟1保留必须保持复位值。0AFEN复用功能IO时钟使能由软件置位或复位0:关闭复用功能IO时钟1:开启复用功能IO时钟
03-18
<think>嗯,用户问的是在STM32F103C8T6中如何正确选择开启外设时钟。首先,我需要回忆一下STM32时钟系统结构。STM32F1系列使用的是较为传统的时钟树设计,有多个时钟源,比如HSI、HSE,然后通过分频倍频到系统时钟,再分给各个外设。 用户可能刚接触STM32,对时钟配置不太熟悉,所以需要从基础讲起。首先应该介绍外设时钟的重要性,比如每个外设在使用前必须使能对应的时钟,否则无法工作。然后,需要说明不同的外设挂载在哪个总线上,比如APB1或APB2,因为开启时钟的函数会根据总线不同而有所区别。 接下来,可能需要详细步骤:如何查找外设对应的总线,比如参考手册或数据手册中的时钟树图。例如,GPIO通常挂在APB2,而USART2在APB1。然后,使用RCC库函数来开启时钟,比如RCC_APB2PeriphClockCmd()或RCC_APB1PeriphClockCmd(),并给出具体的代码例子。 用户可能还会想知道是否有其他方法,比如直接操作寄存器,或者使用HAL库,但考虑到STM32F1常用标准外设库,应该以标准库为例。同时,需要提醒注意事项,比如开启时钟的顺序,不要重复开启,以及低功耗模式下关闭时钟等。 可能还需要提到常见的错误,比如忘记开启时钟导致外设不工作,或者错误地选择了总线。这时候,用户可能会在调试时遇到问题,所以强调检查时钟配置的重要性。 另外,可能要考虑用户的应用场景,比如他们可能在做一个需要多个外设的项目,比如同时使用GPIO、USARTSPI,这时候需要分别开启各个外设的时钟,并合理管理时钟开启关闭以节省功耗。 总结下来,回答的结构应该是:先介绍外设时钟的重要性,然后讲解如何确定外设挂载的总线,接着给出配置时钟的具体步骤示例代码,最后提到注意事项常见问题。这样用户能够系统地了解整个过程,避免常见错误。</think>在STM32F103C8T6中,正确选择开启外设时钟是配置外设功能的前提。以下是关键步骤注意事项: --- ### **1. 理解时钟架构** STM32F103C8T6的时钟树通过AHB/APB总线为外设提供时钟: - **APB1总线**:低速外设(最大36 MHz),如TIM2-TIM4、USART2/3、SPI2、I2C1/2等。 - **APB2总线**:高速外设(最大72 MHz),如GPIOA-GPIOC、ADC1、TIM1、USART1、SPI1等。 --- ### **2. 确定外设挂载的总线** - **查阅手册**:通过《STM32F1xx参考手册》的时钟树图或外设章节确认外设所属总线。 - **常用外设分类**: - **APB1**:USART2/3、TIM2-4、I2C1/2、SPI2、CAN、DAC等。 - **APB2**:GPIOA-GPIOC、ADC1/2、TIM1、USART1、SPI1、EXTI等。 --- ### **3. 开启外设时钟的步骤** #### **(1) 使用标准外设库(标准库)** ```c #include "stm32f10x_rcc.h" // 开启APB2总线上的外设(如GPIOA、USART1) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // 开启APB1总线上的外设(如USART2、TIM2) RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_TIM2, ENABLE); ``` #### **(2) 使用HAL库** ```c #include "stm32f1xx_hal.h" // 开启APB2总线上的外设(如GPIOA) __HAL_RCC_GPIOA_CLK_ENABLE(); // 开启APB1总线上的外设(如USART2) __HAL_RCC_USART2_CLK_ENABLE(); ``` #### **(3) 直接操作寄存器(不推荐新手使用)** ```c // 开启APB2总线的GPIOA时钟 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 开启APB1总线的USART2时钟 RCC->APB1ENR |= RCC_APB1ENR_USART2EN; ``` --- ### **4. 注意事项** 1. **顺序问题**:建议先配置时钟,再初始化外设。 2. **低功耗模式**:进入低功耗前需关闭不需要的外设时钟。 3. **复用功能**:某些外设(如SPI、USART)需要同时开启GPIO对应外设时钟。 4. **重复开启**:多次调用`ENABLE`无副作用,但需避免冗余代码。 --- ### **5. 常见错误排查** - 外设不工作:首先检查时钟是否已开启。 - 总线选择错误:如误将APB1外设挂到APB2(或反之)。 - 未启用复用时钟:使用重映射功能时需额外开启`AFIO`时钟(APB2总线)。 --- ### **示例:配置USART1** ```c // 1. 开启USART1GPIOA的时钟(USART1在APB2) RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置GPIOUSART参数 GPIO_InitTypeDef gpio_init; gpio_init.Pin = GPIO_Pin_9; // TX gpio_init.Mode = GPIO_Mode_AF_PP; gpio_init.Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio_init); // 3. 初始化USART USART_InitTypeDef usart_init; usart_init.BaudRate = 9600; usart_init.Mode = USART_Mode_Tx; USART_Init(USART1, &usart_init); USART_Cmd(USART1, ENABLE); ``` --- 通过以上步骤,可以确保外设时钟正确配置。建议结合STM32CubeMX工具(图形化配置时钟树)进一步简化流程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡姆图拉夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值