STM32G474时钟设置笔记(170MHz)

11 篇文章 4 订阅

g474是M4内核,系统时钟的最大频率是170MHz。系统复位后,选择HSI16作为系统时钟。
(以下文章纯属个人理解,如果有不对的地方还请大佬指点,我会及时修改,必要时删除本文章,防止我误导他人)

编写基础

RCC(Reset and Clock Control)

在这里插入图片描述
AHB、APB1、APB2最大频率都是170MHz。
在这里插入图片描述

时钟树

要想配置时钟首先必须要看明白时钟树。
在这里插入图片描述
啊这。。。。我感觉比原来的时钟更人性化了哈,直接搞了个内部48MHz给USB啥的用了,这样就不用考虑怎么配置又有48MHz又相对最快频率啥的了,直接搞到最高频率。
时钟树我就不解释了,就放这了,懂得都懂哈,不懂的康103啥的或者找个没有倍频功能单片机手册啥的康康,可能会更容易上手!

PLL

配置时钟精髓就是PLL倍频,因此搞清楚了它就很好解决了。
手册上对PLL配置步骤如下图:
在这里插入图片描述
首先通过上面的时钟树也可以看出来PLL的时钟源有两种:HSI、HSE。PLL的分频、倍频配置在RCC_PLLCFGR寄存器中。
配置PLL的过程是:

  1. 将RCC_CR的PLLON位清零来关闭PLL。
  2. 查询RCC_CR的PLLRDY是否被清零了,如果该位为0说明PLL已经关闭。
  3. 配置分频、倍频系数等(单纯的使能或者关闭PLL_P、PLL_Q或者PLL_R不需要这些步骤,直接操作即可)。
  4. 将PLLON设置为1,再次启用PLL。
  5. 通过在RCC_PLLCFGR寄存器中配置PLLPEN、PLLQEN、PLLREN来启用所需的PLL输出。 注:PLL输出频率不得大于170MHz。 当一个时钟源被直接使用或通过PLL作为一个系统时钟,是不可能停止它。

PWR

在不同的工作频率下,对应的电源模式也不一样。
可能是为了满足不同频率下的功耗管理,高时钟对应高内核电压,我使用TI的5529时也有倍频时修改内核电压的的操作。
g474的电源模式与各个时钟频率对应关系如下表:
在这里插入图片描述
PWR_CR1的VOS[1:0]对应Range2和Range1:
在这里插入图片描述
至于Range1的normal模式和boost模式是在PWR_CR5寄存器的R1MODE位配置,R1MODE为0就是boost模式:
在这里插入图片描述
g474的R1MODE位与SYSCLK的对应关系如下:
在这里插入图片描述
手册中还介绍了从range_normal切换到range_boost模式的步骤:
在这里插入图片描述

  1. 在切换到更高的系统频率之前,系统时钟必须用AHB分频器除以2。
  2. 清除的R1MODE位在PWR_CR5寄存器中。
  3. 在range1 boost模式中,根据新的频率目标调整等待状态的数量。
  4. 配置并切换到新的系统频率。
  5. 等待至少1us,然后重新配置AHB预压器以获得所需的HCLK时钟频率

FLASH

这个是我原来忽略的地方,原来就配置了PLL和PWR,然后倍频到140MHz就是极限了,后来我反复查阅手册,才发现了原来少了对FLASH的访问比率的配置。(可以看到上面的range_normal切换到range_boost模式步骤里已经提到了修改FLASH访问比率的事,但是由于没看懂是什么意思,还以为是延时1us,因此配置170MHz时候就失败了。)

上面提到range_normal切换到range_boost步骤里有这么一句:

  1. 在range1 boost模式中,根据新的频率目标调整等待状态的数量(FLASH_ACR的LATENCY位)。

那么就看看这个 FLASH_ACR 的 LATENCY到底是个什么。
查阅手册找到这个寄存器:
在这里插入图片描述
可以看到LATENCY在最低位:
在这里插入图片描述

LATENCY[3:0]:这些位表示SYSCLK(系统时钟)周期与Flash访问时间的比率。
知道了它是干嘛的,那么它到底设置为多少合适呢?如下图所示:
在这里插入图片描述
为了正确地从闪存读取数据,等待状态(延迟)的数量必须根据CPU时钟(HCLK)的频率和内部电压范围的设备VCORE被正确地编程在闪存访问控制寄存器(FLASH_ACR)。参考第6.1.5节:动态电压缩放管理。表29显示了等待状态和CPU时钟频率之间的对应关系。

对号入座,我要设置为170MHz,模式为Range 1 Boost模式,那么对应LATENCY值应该为4WS,因此将其配置为4。

FLASH->ACR |= FLASH_ACR_LATENCY_4WS;

配置函数

有了上面的概念就可以进行编写时钟函数了。
步骤如下:

  1. 开启HSE(鄙人的板子HSE为8MHz)并确认HSE就绪;
  2. 关闭PLL并确认PLL已经关闭;
  3. AHB二分频;
  4. 配置为range1_boost(默认复位为range1_normal模式);
  5. 配置FLASH_ACR的访问时间比率;
  6. 配置PLL;
  7. 打开PLL并确认PLL就绪;
  8. 使能PLL_R;
  9. 配置系统时钟为PLL输入,并确认系统时钟就绪;
  10. 延时至少1us后切换AHB为不分频。
u8 SYSCLK_170MHz(void)
{
	u16 temp = 0x2000;
	RCC->CR |= RCC_CR_HSEON;
	while((!(RCC->CR & RCC_CR_HSERDY))&&(--temp));//等待HSE就绪
	if(!temp)
	{
		return FAILED;
	}
	RCC->CR &= ~RCC_CR_PLLON;
	temp = 0x2000;
	while((RCC->CR & RCC_CR_PLLRDY) && (--temp));//等待PLL下线
	if(!temp)
	{
		return FAILED;
	}
	RCC->CFGR = RCC_CFGR_PPRE2_DIV1|RCC_CFGR_PPRE1_DIV2|RCC_CFGR_HPRE_DIV2|RCC_CFGR_SW_HSI;
	temp = 0x2000;
	while(--temp);//等待AHB稳定
	//RCC->APB1ENR1 |= RCC_APB1ENR1_PWREN;
	PWR->CR5 &= ~PWR_CR5_R1MODE;//设置为range1_boost
	FLASH->ACR &= ~FLASH_ACR_LATENCY;
	FLASH->ACR |= FLASH_ACR_LATENCY_4WS;
	temp = 0x2000;
	while(--temp);//等待系统稳定
	RCC->PLLCFGR = (85<<RCC_PLLCFGR_PLLN_Pos)|(1<<RCC_PLLCFGR_PLLM_Pos)|RCC_PLLCFGR_PLLSRC_HSE;//(8*85)/2 = VCO = 340 MHz
	RCC->CR |= RCC_CR_PLLON;
	temp = 0xf000;
	while((!(RCC->CR & RCC_CR_PLLRDY)) && (--temp));//等待PLL准备就绪
	if(!temp)
	{
		return FAILED;
	}
	RCC->PLLCFGR |= RCC_PLLCFGR_PLLREN;
	RCC->CFGR |= RCC_CFGR_SW_PLL;
	temp = 0xf000;
	while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS);//等待系统设置PLL主时钟完成标志位置位
	if(temp)
	{
		temp = 0;
		while(--temp);//等待系统稳定
		RCC->CFGR &= ~RCC_CFGR_HPRE;//AHB 不分频 == SYSCLK
		return SUCCEED;
	}
	else
	{
		return FAILED;
	}	
}

然后就配置结束了,通过定时器验证确实为170MHz。

附录:RCC寄存器

最后:
附上本人写的寄存器配置,方便个人配置,要啥直接删注释就好:

//================================RCC->CR========================================
	RCC->CR |= 0		//default: 0x0000 0063
	//	//RCC_CR_PLLRDY		//bit25【read only】:	PLL Ready
	//	|RCC_CR_PLLON		//bit24: 使能PLL。
	//	|RCC_CR_CSSON		//bit19: 时钟安全系统使能。0 OFF ; 1 ON
	//	|RCC_CR_HSEBYP		//bit18: 0 HSE晶振不旁路	1 HSE晶振旁路
	//	//RCC_CR_HSERDY		//bit17【read only】:	HSE Ready
		|RCC_CR_HSEON		//bit16: 使能HSE
	//	|RCC_CR_HSIRDY		//bit10: HSI16时钟准备就绪
	//	|RCC_CR_HSIKERON	//bit09: 停止模式HSI是否启动
	//	|RCC_CR_HSION		//bit08: 1 HSION   0 OFF
	;

//================================RCC->PLLCFGR ========================================
	RCC->PLLCFGR = 0		//default: 0x0000 1000
	//	|RCC_PLLCFGR_PLLPDIV	//bit31-27[4:0]: P 分频 给ADC用
								// 00000: PLL “P” clock is controlled by the bit PLLP
								// 00001: Reserved.
								// 00010: PLL “P” clock = VCO / 2
								// ....
								// 11111: PLL “P” clock = VCO / 31
	//	|RCC_PLLCFGR_PLLR		//bit26-25[1:0]: 锁相环R 分频
							///	// 00: PLLR = 2
								// 01: PLLR = 4
								// 10: PLLR = 6
								// 11: PLLR = 8
	//	|RCC_PLLCFGR_PLLREN		//bit24: PLLR使能
	//	|RCC_PLLCFGR_PLLQ_0		//bit22-21[1:0]: Q分频,USB用。分频参数与R分频一样
	//	|RCC_PLLCFGR_PLLQEN		//bit20: PLLQ使能
	//	|RCC_PLLCFGR_PLLP		//bit17: P 分频
								// 0: PLLP = 7
								// 1: PLLP = 17
	//	|RCC_PLLCFGR_PLLPEN		//bit16: PLLP 使能
	//----------------------- VCO = 280MHz
		|(70<<RCC_PLLCFGR_PLLN_Pos)//bit14-08[6:0]: PLL的倍频 不能小于8
								// 0000000: PLLN = 0 wrong configuration
								// 0000001: PLLN = 1 wrong configuration
								// ...
								// 0000111: PLLN = 7 wrong configuration
								// 0001000: PLLN = 8
								// 0001001: PLLN = 9
								// ...
								// 1111111: PLLN = 127
		|(1<<RCC_PLLCFGR_PLLM_Pos)//bit07-04[3:0]: PLL初始分频
								// 0000: PLLM = 1
							///	// 0001: PLLM = 2
								// 0010: PLLM = 3
								// 0011: PLLM = 4
								// 0100: PLLM = 5
								// 0101: PLLM = 6
								// 0110: PLLM = 7
								// 0111: PLLM = 8
								// 1000: PLLSYSM = 9
								// ...
								// 1111: PLLSYSM= 16
		|RCC_PLLCFGR_PLLSRC		//bit01-00[1:0]: PLL时钟源选择。
								// 00: No clock sent to PLL
								// 01: No clock sent to PLL
								// 10: HSI16 clock selected as PLL clock entry
							///	// 11: HSE clock selected as PLL clock entry
	;

//================================RCC->CFGR========================================
	RCC->CFGR = 0			//default: 0x0000 0005
	//	|RCC_CFGR_MCOPRE		//bit30-28[2:0]: MCO输出时钟分频
								// 000: MCO is divided by 1
								// 001: MCO is divided by 2
								// 010: MCO is divided by 4
								// 011: MCO is divided by 8
								// 100: MCO is divided by 16
								// Others: not allowed
	//	|RCC_CFGR_MCOSEL		//bit27-24[3:0]: MCO输出时钟选择
								// 0000: MCO output disabled, no clock on MCO
								// 0001: SYSCLK system clock selected
								// 0010: Reserved, must be kept at reset value
								// 0011: HSI16 clock selected
								// 0100: HSE clock selected
								// 0101: Main PLL clock selected
								// 0110: LSI clock selected
								// 0111: LSE clock selected
								// 1000: Internal HSI48 clock selected
		|RCC_CFGR_PPRE2_DIV2	//bit13-11[2:0]: APB2预分频
								// 0xx: HCLK not divided
								// 100: HCLK divided by 2
								// 101: HCLK divided by 4
								// 110: HCLK divided by 8
								// 111: HCLK divided by 16
		|RCC_CFGR_PPRE1_DIV4	//bit10-08[2:0]: APB1预分频
								// 0xx: HCLK not divided
								// 100: HCLK divided by 2
								// 101: HCLK divided by 4
								// 110: HCLK divided by 8
								// 111: HCLK divided by 16
	//	|RCC_CFGR_HPRE			//bit07-04[3:0]: AHB预分频(改变core电压之前应该先查看这些时钟频率)
								// 0xxx: SYSCLK not divided
								// 1000: SYSCLK divided by 2
								// 1001: SYSCLK divided by 4
								// 1010: SYSCLK divided by 8
								// 1011: SYSCLK divided by 16
								// 1100: SYSCLK divided by 64
								// 1101: SYSCLK divided by 128
								// 1110: SYSCLK divided by 256
								// 1111: SYSCLK divided by 512
	//RCC_CFGR_SWS			//bit03-02[1:0]【read only】:系统时钟源选择状态,该位与SW对应。
		|RCC_CFGR_SW		//bit01-00[1:0]: 系统时钟源选择。
								// 00: Reserved, must be kept at reset value
								// 01: HSI16 selected as system clock
								// 10: HSE selected as system clock
							///	// 11: PLL selected as system clock
	;

下面是RCC寄存器:

void RCC_Init(void)
{
	//--------------------------------------------------------------------------------------//
	//---------------------------------------- AHB1 ----------------------------------------//
	//--------------------------------------------------------------------------------------//
	RCC->AHB1RSTR |= 0			//default: 0x0000 0000
	//	|RCC_AHB1RSTR_CRCRST		//bit12
	//	|RCC_AHB1RSTR_FLASHRST		//bit08
	//	|RCC_AHB1RSTR_FMACRST		//bit04
	//	|RCC_AHB1RSTR_CORDICRST		//bit03
	//	|RCC_AHB1RSTR_DMAMUX1RST	//bit02
	//	|RCC_AHB1RSTR_DMA2RST		//bit01
	//	|RCC_AHB1RSTR_DMA1RST		//bit00
	;
	RCC->AHB1RSTR &= 0xffffffff	//default: 0x0000 0000
	//	&~RCC_AHB1RSTR_CRCRST		//bit12
	//	&~RCC_AHB1RSTR_FLASHRST		//bit08
	//	&~RCC_AHB1RSTR_FMACRST		//bit04
	//	&~RCC_AHB1RSTR_CORDICRST	//bit03
	//	&~RCC_AHB1RSTR_DMAMUX1RST	//bit02
	//	&~RCC_AHB1RSTR_DMA2RST		//bit01
	//	&~RCC_AHB1RSTR_DMA1RST		//bit00
	;
	
	RCC->AHB1ENR |= 0			//default: 0x0000 0100
	//	|RCC_AHB1ENR_CRCEN			//bit12
	//	|RCC_AHB1ENR_FLASHEN		//bit08
	//	|RCC_AHB1ENR_FMACEN			//bit04
	//	|RCC_AHB1ENR_CORDICEN		//bit03
	//	|RCC_AHB1ENR_DMAMUX1EN		//bit02
	//	|RCC_AHB1ENR_DMA2EN			//bit01
	//	|RCC_AHB1ENR_DMA1EN			//bit00
	;
	//--------------------------------------------------------------------------------------//
	//---------------------------------------- AHB2 ----------------------------------------//
	//--------------------------------------------------------------------------------------//
	RCC->AHB2RSTR |= 0			//defualt: 0x0000 0000
	//	|RCC_AHB2RSTR_RNGRST		//bit26
	//	|RCC_AHB2RSTR_RNGRST		//bit24
	//	|RCC_AHB2RSTR_DAC4RST		//bit19
	//	|RCC_AHB2RSTR_DAC3RST		//bit18
	//	|RCC_AHB2RSTR_DAC2RST		//bit17
	//	|RCC_AHB2RSTR_DAC1RST		//bit16
	//	|RCC_AHB2RSTR_ADC345RST		//bit14
	//	|RCC_AHB2RSTR_ADC12RST		//bit13
	//	|RCC_AHB2RSTR_GPIOGRST		//bit06
	//	|RCC_AHB2RSTR_GPIOFRST		//bit05
	//	|RCC_AHB2RSTR_GPIOERST		//bit04
	//	|RCC_AHB2RSTR_GPIODRST		//bit03
		|RCC_AHB2RSTR_GPIOCRST		//bit02
	//	|RCC_AHB2RSTR_GPIOBRST		//bit01
	//	|RCC_AHB2RSTR_GPIOARST		//bit00
	;
	RCC->AHB2RSTR &= 0xffffffff	//defualt: 0x0000 0000
	//	&~RCC_AHB2RSTR_RNGRST		//bit26
	//	&~RCC_AHB2RSTR_RNGRST		//bit24
	//	&~RCC_AHB2RSTR_DAC4RST		//bit19
	//	&~RCC_AHB2RSTR_DAC3RST		//bit18
	//	&~RCC_AHB2RSTR_DAC2RST		//bit17
	//	&~RCC_AHB2RSTR_DAC1RST		//bit16
	//	&~RCC_AHB2RSTR_ADC345RST	//bit14
	//	&~RCC_AHB2RSTR_ADC12RST		//bit13
	//	&~RCC_AHB2RSTR_GPIOGRST		//bit06
	//	&~RCC_AHB2RSTR_GPIOFRST		//bit05
	//	&~RCC_AHB2RSTR_GPIOERST		//bit04
	//	&~RCC_AHB2RSTR_GPIODRST		//bit03
		&~RCC_AHB2RSTR_GPIOCRST		//bit02
	//	&~RCC_AHB2RSTR_GPIOBRST		//bit01
	//	&~RCC_AHB2RSTR_GPIOARST		//bit00
	;
	RCC->AHB2ENR = 0			//default: 0x0000 0000
	//	|RCC_AHB2ENR_RNGEN			//bit26
	//	|RCC_AHB2ENR_DAC4EN			//bit19
	//	|RCC_AHB2ENR_DAC3EN			//bit18
	//	|RCC_AHB2ENR_DAC2EN			//bit17
	//	|RCC_AHB2ENR_DAC1EN			//bit16
	//	|RCC_AHB2ENR_ADC345EN		//bit14
	//	|RCC_AHB2ENR_ADC12EN		//bit13
	//	|RCC_AHB2ENR_GPIOGEN		//bit06
	//	|RCC_AHB2ENR_GPIOFEN		//bit05
	//	|RCC_AHB2ENR_GPIOEEN		//bit04
	//	|RCC_AHB2ENR_GPIODEN		//bit03
		|RCC_AHB2ENR_GPIOCEN		//bit02
	//	|RCC_AHB2ENR_GPIOBEN		//bit01
	//	|RCC_AHB2ENR_GPIOAEN		//bit00
	;
	//--------------------------------------------------------------------------------------//
	//---------------------------------------- AHB3 ----------------------------------------//
	//--------------------------------------------------------------------------------------//
	RCC->AHB3RSTR |= 0			//default:0x0000 0000
	//	|RCC_AHB3RSTR_QSPIRST		//bit08
	//	|RCC_AHB3RSTR_FMCRST		//bit00
	;
	RCC->AHB3RSTR &= 0xffffffff	//default:0x0000 0000
	//	&~RCC_AHB3RSTR_QSPIRST		//bit08
	//	&~RCC_AHB3RSTR_FMCRST		//bit00
	;

	RCC->AHB3ENR |= 0			//default: 0x0000 0000
	//	|RCC_AHB3ENR_QSPIEN			//bit08
	//	|RCC_AHB3ENR_FMCEN			//bit00
	;
	//--------------------------------------------------------------------------------------//
	//---------------------------------------- APB1 ----------------------------------------//
	//--------------------------------------------------------------------------------------//
	RCC->APB1RSTR1 |= 0			//default: 0x0000 0000
	//	|RCC_APB1RSTR1_LPTIM1RST	//bit31
	//	|RCC_APB1RSTR1_I2C3RST		//bit30
	//	|RCC_APB1RSTR1_PWRRST		//bit28
	//	|RCC_APB1RSTR1_FDCANRST		//bit25
	//	|RCC_APB1RSTR1_USBRST		//bit23
	//	|RCC_APB1RSTR1_I2C2RST		//bit22
	//	|RCC_APB1RSTR1_I2C1RST		//bit21
	//	|RCC_APB1RSTR1_UART5RST		//bit20
	//	|RCC_APB1RSTR1_UART4RST		//bit19
	//	|RCC_APB1RSTR1_USART3RST	//bit18
	//	|RCC_APB1RSTR1_USART2RST	//bit17
	//	|RCC_APB1RSTR1_SPI3RST		//bit15
	//	|RCC_APB1RSTR1_SPI2RST		//bit14
	//	|RCC_APB1RSTR1_CRSRST		//bit08
		|RCC_APB1RSTR1_TIM7RST		//bit05
	//	|RCC_APB1RSTR1_TIM6RST		//bit04
	//	|RCC_APB1RSTR1_TIM5RST		//bit03
	//	|RCC_APB1RSTR1_TIM4RST		//bit02
	//	|RCC_APB1RSTR1_TIM3RST		//bit01
	//	|RCC_APB1RSTR1_TIM2RST		//bit00
	;
	RCC->APB1RSTR1 &= 0xffffffff//default: 0x0000 0000
	//	&~RCC_APB1RSTR1_LPTIM1RST	//bit31
	//	&~RCC_APB1RSTR1_I2C3RST		//bit30
	//	&~RCC_APB1RSTR1_PWRRST		//bit28
	//	&~RCC_APB1RSTR1_FDCANRST	//bit25
	//	&~RCC_APB1RSTR1_USBRST		//bit23
	//	&~RCC_APB1RSTR1_I2C2RST		//bit22
	//	&~RCC_APB1RSTR1_I2C1RST		//bit21
	//	&~RCC_APB1RSTR1_UART5RST	//bit20
	//	&~RCC_APB1RSTR1_UART4RST	//bit19
	//	&~RCC_APB1RSTR1_USART3RST	//bit18
	//	&~RCC_APB1RSTR1_USART2RST	//bit17
	//	&~RCC_APB1RSTR1_SPI3RST		//bit15
	//	&~RCC_APB1RSTR1_SPI2RST		//bit14
	//	&~RCC_APB1RSTR1_CRSRST		//bit08
		&~RCC_APB1RSTR1_TIM7RST		//bit05
	//	&~RCC_APB1RSTR1_TIM6RST		//bit04
	//	&~RCC_APB1RSTR1_TIM5RST		//bit03
	//	&~RCC_APB1RSTR1_TIM4RST		//bit02
	//	&~RCC_APB1RSTR1_TIM3RST		//bit01
	//	&~RCC_APB1RSTR1_TIM2RST		//bit00
	;

	RCC->APB1ENR1 |= 0			//default: 0x0000 0400
	//	|RCC_APB1ENR1_LPTIM1EN		//bit31
	//	|RCC_APB1ENR1_I2C3EN		//bit30
	//	|RCC_APB1ENR1_PWREN			//bit28
	//	|RCC_APB1ENR1_FDCANEN		//bit25
	//	|RCC_APB1ENR1_USBEN			//bit23
	//	|RCC_APB1ENR1_I2C2EN		//bit22
	//	|RCC_APB1ENR1_I2C1EN		//bit21
	//	|RCC_APB1ENR1_UART5EN		//bit20
	//	|RCC_APB1ENR1_UART4EN		//bit19
	//	|RCC_APB1ENR1_USART3EN		//bit18
	//	|RCC_APB1ENR1_USART2EN		//bit17
	//	|RCC_APB1ENR1_SPI3EN		//bit15
	//	|RCC_APB1ENR1_SPI2EN		//bit14
	//	|RCC_APB1ENR1_WWDGEN		//bit11
	//	|RCC_APB1ENR1_RTCAPBEN		//bit10
	//	|RCC_APB1ENR1_CRSEN			//bit08
		|RCC_APB1ENR1_TIM7EN		//bit05
	//	|RCC_APB1ENR1_TIM6EN		//bit04
	//	|RCC_APB1ENR1_TIM5EN		//bit03
	//	|RCC_APB1ENR1_TIM4EN		//bit02
	//	|RCC_APB1ENR1_TIM3EN		//bit01
	//	|RCC_APB1ENR1_TIM2EN		//bit00
	;


	RCC->APB1RSTR2 |= 0			//default: 0x0000 0000
	//	|RCC_APB1RSTR2_UCPD1RST		//bit08
	//	|RCC_APB1RSTR2_I2C4RST		//bit01
	//	|RCC_APB1RSTR2_LPUART1RST	//bit00
	;
	RCC->APB1RSTR2 &= 0xffffffff//default: 0x0000 0000
	//	&~RCC_APB1RSTR2_UCPD1RST	//bit08
	//	&~RCC_APB1RSTR2_I2C4RST		//bit01
	//	&~RCC_APB1RSTR2_LPUART1RST	//bit00
	;

	RCC->APB1ENR2 |= 0			//default: 0x0000 0000
	//	|RCC_APB1ENR2_UCPD1EN		//bit08
	//	|RCC_APB1ENR2_I2C4EN		//bit01
	//	|RCC_APB1ENR2_LPUART1EN		//bit00
	;
	//--------------------------------------------------------------------------------------//
	//---------------------------------------- APB2 ----------------------------------------//
	//--------------------------------------------------------------------------------------//
	RCC->APB2RSTR |= 0			//default: 0x0000 0000
	//	|RCC_APB2RSTR_HRTIM1RST		//bit26
	//	|RCC_APB2RSTR_SAI1RST		//bit21
	//	|RCC_APB2RSTR_TIM20RST		//bit20
	//	|RCC_APB2RSTR_TIM17RST		//bit18
	//	|RCC_APB2RSTR_TIM16RST		//bit17
	//	|RCC_APB2RSTR_TIM15RST		//bit16
	//	|RCC_APB2RSTR_SPI4RST		//bit15
	//	|RCC_APB2RSTR_USART1RST		//bit14
	//	|RCC_APB2RSTR_TIM8RST		//bit13
	//	|RCC_APB2RSTR_SPI1RST		//bit12
	//	|RCC_APB2RSTR_TIM1RST		//bit11
	//	|RCC_APB2RSTR_SYSCFGRST		//bit00
	;
	RCC->APB2RSTR &= 0xffffffff	//default: 0x0000 0000
	//	&~RCC_APB2RSTR_HRTIM1RST	//bit26
	//	&~RCC_APB2RSTR_SAI1RST		//bit21
	//	&~RCC_APB2RSTR_TIM20RST		//bit20
	//	&~RCC_APB2RSTR_TIM17RST		//bit18
	//	&~RCC_APB2RSTR_TIM16RST		//bit17
	//	&~RCC_APB2RSTR_TIM15RST		//bit16
	//	&~RCC_APB2RSTR_SPI4RST		//bit15
	//	&~RCC_APB2RSTR_USART1RST	//bit14
	//	&~RCC_APB2RSTR_TIM8RST		//bit13
	//	&~RCC_APB2RSTR_SPI1RST		//bit12
	//	&~RCC_APB2RSTR_TIM1RST		//bit11
	//	&~RCC_APB2RSTR_SYSCFGRST	//bit00
	;

	RCC->APB2ENR |= 0			//default: 0x0000 0000
	//	|RCC_APB2ENR_HRTIM1EN		//bit26
	//	|RCC_APB2ENR_SAI1EN			//bit21
	//	|RCC_APB2ENR_TIM20EN		//bit20
	//	|RCC_APB2ENR_TIM17EN		//bit18
	//	|RCC_APB2ENR_TIM16EN		//bit17
	//	|RCC_APB2ENR_TIM15EN		//bit16
	//	|RCC_APB2ENR_SPI4EN			//bit15
	//	|RCC_APB2ENR_USART1EN		//bit14
	//	|RCC_APB2ENR_TIM8EN			//bit13
	//	|RCC_APB2ENR_SPI1EN			//bit12
	//	|RCC_APB2ENR_TIM1EN			//bit11
	//	|RCC_APB2ENR_SYSCFGEN		//bit00
	;
}

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值