接上一篇文章。继续void Set_System(void)的分析。
1.3 RCC_AHBPeriphClockCmd()
位于USB_Example\Libraries\STM32F30x_StdPeriph_Driver\src\stm32f30x_rcc.c文件中。其主要功能也是使能或禁止AHB外设时钟。
/**
* @brief Enables or disables the AHB peripheral clock.
* @note After reset, the peripheral clock (used for registers read/write access)
* is disabled and the application software has to enable this clock before
* using it.
* @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock.
* This parameter can be any combination of the following values:
* @arg RCC_AHBPeriph_GPIOA
* @arg RCC_AHBPeriph_GPIOB
* @arg RCC_AHBPeriph_GPIOC
* @arg RCC_AHBPeriph_GPIOD
* @arg RCC_AHBPeriph_GPIOE
* @arg RCC_AHBPeriph_GPIOF
* @arg RCC_AHBPeriph_TS
* @arg RCC_AHBPeriph_CRC
* @arg RCC_AHBPeriph_FLITF (has effect only when the Flash memory is in power down mode)
* @arg RCC_AHBPeriph_SRAM
* @arg RCC_AHBPeriph_DMA2
* @arg RCC_AHBPeriph_DMA1
* @arg RCC_AHBPeriph_ADC34
* @arg RCC_AHBPeriph_ADC12
* @param NewState: new state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->AHBENR |= RCC_AHBPeriph;
}
else
{
RCC->AHBENR &= ~RCC_AHBPeriph;
}
}
RCC、AHBENR的说明见前一篇文章,在此不再赘述。
“1. Set_System()”中调用RCC_AHBPeriphClockCmd()时传入的第一个参数RCC_AHBPeriph_GPIOA在USB_Example\Libraries\STM32F30x_StdPeriph_Driver\inc\stm32f30x_rcc.h中定义:
#define RCC_AHBPeriph_GPIOA RCC_AHBENR_GPIOAEN
RCC_AHBENR_GPIOAEN在USB_Example1\Libraries\CMSIS\Device\ST\STM32F30x\Include\stm32f30x.h中定义:
#define RCC_AHBENR_GPIOAEN ((uint32_t)0x00020000) /*!< GPIOA clock enable */
对应手册P118中"Bit 17 IOPAEN: I/O port A clock enable"。