GPIOのSET、RESET MXの生成したコードの解析メモ
SYSCLKの速度によって、Core電圧を上げる設定。
(STM32F446xC/E DS10693 Rev 10 P.75)
設定電圧は3種類。
| Power Scales | 電圧 |
|---|---|
| Power Scale 1 ((VOS[1:0] bits in PWR_CR register = 0x11), 168 MHz HCLK max frequency with over-drive OFF or 180 MHz with over-drive ON | 1.40V |
| Power Scale 2 ((VOS[1:0] bits in PWR_CR register = 0x10), 144 MHz HCLK max frequency with over-drive OFF or 168 MHz with over-drive ON | 1.32V |
| Power Scale 3 ((VOS[1:0] bits in PWR_CR register = 0x01), 120 MHz HCLK max frequency | 1.14V |
各ペリフェラルにクロックを供給
STM32は、各ペリフェラルのクロック供給を選択的に指定できる。
ペリフェラルが接続されているバスの種類を特定しておく。
SystemConfigrationとPowerへのクロック供給開始
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
GPIOのクロック供給開始
/* GPIO Ports Clock Enable */
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOH);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
USARTのクロック供給開始
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
GPIOの制御コード
LD2(GPIOA PA5)のLEDの点滅
B1(GPIOC PC13)のスイッチ入力
B1のGPIO modeは、外部割込み端子ではなく、通常のIO入力端子設定に変更。
GPIOコード
GPIOのSet、Reset
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//LL GPIOx bit Set/Reset Output
LL_mDelay(delayTime);
//Set several pins to high level on dedicated gpio port
LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_5);
LL_mDelay(delayTime);
//Set several pins to low level on dedicated gpio port
LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_5);
//GPIO port input data register GPIOx.IDR
//pull upされているスイッチ
if((GPIOC->IDR & LL_GPIO_PIN_13) == 0UL)
{
if(delayTime==500)
delayTime=1000;
else
delayTime=500;
while(!(GPIOC->IDR & LL_GPIO_PIN_13));
}
//GPIO port bit set/reset register (GPIOx_BSRR)
LL_mDelay(delayTime);
GPIOA->BSRR = GPIO_BSRR_BS_5;
LL_mDelay(delayTime);
GPIOA->BSRR = GPIO_BSRR_BR_5;
//GPIO port output data register (GPIOx_ODR)
LL_mDelay(delayTime);
GPIOA->ODR |= 0x00000020;
//GPIOA->ODR |= GPIO_ODR_OD5;
LL_mDelay(delayTime);
GPIOA->ODR ^= 0x00000020;
//GPIOA->ODR ^= GPIO_ODR_OD5;
//LL GPIOx read
//Return full input data register value for a dedicated port.
//pull upされているスイッチ
portValue = LL_GPIO_ReadInputPort(GPIOC);
if((portValue & LL_GPIO_PIN_13) == 0UL)
{
if(delayTime==500)
delayTime=1000;
else
delayTime=500;
while((portValue & LL_GPIO_PIN_13)== 0UL)
{
portValue = LL_GPIO_ReadInputPort(GPIOC);
}
}
}
/* USER CODE END 3 */



