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的过程是:
- 将RCC_CR的PLLON位清零来关闭PLL。
- 查询RCC_CR的PLLRDY是否被清零了,如果该位为0说明PLL已经关闭。
- 配置分频、倍频系数等(单纯的使能或者关闭PLL_P、PLL_Q或者PLL_R不需要这些步骤,直接操作即可)。
- 将PLLON设置为1,再次启用PLL。
- 通过在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模式的步骤:
- 在切换到更高的系统频率之前,系统时钟必须用AHB分频器除以2。
- 清除的R1MODE位在PWR_CR5寄存器中。
- 在range1 boost模式中,根据新的频率目标调整等待状态的数量。
- 配置并切换到新的系统频率。
- 等待至少1us,然后重新配置AHB预压器以获得所需的HCLK时钟频率
FLASH
这个是我原来忽略的地方,原来就配置了PLL和PWR,然后倍频到140MHz就是极限了,后来我反复查阅手册,才发现了原来少了对FLASH的访问比率的配置。(可以看到上面的range_normal切换到range_boost模式步骤里已经提到了修改FLASH访问比率的事,但是由于没看懂是什么意思,还以为是延时1us,因此配置170MHz时候就失败了。)
上面提到range_normal切换到range_boost步骤里有这么一句:
- 在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;
配置函数
有了上面的概念就可以进行编写时钟函数了。
步骤如下:
- 开启HSE(鄙人的板子HSE为8MHz)并确认HSE就绪;
- 关闭PLL并确认PLL已经关闭;
- AHB二分频;
- 配置为range1_boost(默认复位为range1_normal模式);
- 配置FLASH_ACR的访问时间比率;
- 配置PLL;
- 打开PLL并确认PLL就绪;
- 使能PLL_R;
- 配置系统时钟为PLL输入,并确认系统时钟就绪;
- 延时至少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
;
}