|
- #include "stm32f4xx.h"
- #include "stm32f4xx_hal_gpio.h"
- #include "stm32f4xx_hal_rcc.h"
- // define busses presscalers High-speed APB (APB2) and low-speed APB (APB1)
- #define AHB_PRE 1 // 1, 2, 4, 8, 16, 64, 128, 256, 512
- #define APB1_PRE 2 // 1, 2, 4, 8, 16
- #define APB2_PRE 1 // 1, 2, 4, 8, 16
- #define SysTicksClk 10000 // SysTick Freq = 10kHz
- // calculate peripheral frequencies
- #define SYSCLK 46000000
- #define AHB SYSCLK/AHB_PRE
- #define APB1 AHB/APB1_PRE
- #define APB1_TIM APB1*2
- #define APB2 AHB/APB2_PRE
- #define APB2_TIM APB2*1
- #define SysTicks AHB/SysTicksClk//4.6k 10k 0.1ms
- static void SetSysClock(void);
- int main()
- {
- SetSysClock();
- SysTick_Config(SysTicks);
- // <=> RCC->AHB1ENR = RCC_AHB1ENR | 1 << 0 | 1 << 1
- RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN |
- RCC_AHB1ENR_GPIOBEN |
- RCC_AHB1ENR_GPIODEN; // GPIOD for CLK OUT
- // LED1 connected to PA0, LED2 connected to PA6
- GPIOA->MODER |= 1 << (0*2) | 1 << (6*2); // here 2 bits to code mode of 1 pin
- GPIOD->MODER |= 1 << (2*2);
-
- while(1)
- {
- if(!(GPIOB->IDR & GPIO_IDR_ID0))
- {
- GPIOA->ODR |= 1 << 0; // LED1 ON
- GPIOA->ODR &= ~(1 << 6);
- }
- else
- {
- GPIOA->ODR &= ~(1 << 0); // LED2 ON
- GPIOA->ODR |= 1 << 6;
- }
- }
- }
- // SysTick Interrupt Handler
- void SysTick_Handler(void) // SysTicksClk = 10kHz, 0.0001s time=1/freq
- {
- // pin state pediod = 0.0001s
- // Frequencies output = 2*period = 0.0002s time=1/freq 5kHz 0.2ms
- if(GPIOD->ODR & GPIO_ODR_OD2)
- {
- GPIOD->BSRR |= GPIO_BSRR_BR2;
- }
- else
- {
- GPIOD->BSRR |= GPIO_BSRR_BS2;
- }
- }
- static void SetSysClock(void)
- {
- /****************************************************************************/
- /* PLL (clocked by HSI) used as System clock source */
- /****************************************************************************/
- //__IO uint32_t StartUpCounter = 0, HSIStatus = 0;
- if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
- {
- /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
- FLASH->ACR |= FLASH_ACR_PRFTEN;
- FLASH->ACR |= FLASH_ACR_LATENCY_2WS;
- /* HCLK = SYSCLK / 1*/
- RCC->CFGR &= ~RCC_CFGR_HPRE_Msk; // AHBx=SYSCLK / AHB_PRE
- RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
- /* PCLK2 = HCLK / 2*/
- RCC->CFGR &= ~RCC_CFGR_PPRE1_Msk; // APB2 = AHBx / APB2_PRE
- RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
- /* PCLK1 = HCLK / 4*/
- RCC->CFGR &= ~RCC_CFGR_PPRE2_Msk; // APB1 = AHBx / APB1_PRE
- RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
- /* Configure the main PLL */
- // RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC;
- // RCC_PLLCFGR_PLLM=16, RCC_PLLCFGR_PLLN=46, RCC_PLLCFGR_PLLP=2,
- RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLM_Msk;
- RCC->PLLCFGR |= 16 << RCC_PLLCFGR_PLLM_Pos;
- RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLN_Msk;
- RCC->PLLCFGR |= 92 << RCC_PLLCFGR_PLLN_Pos;
- RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLP_Msk;
- /* Enable the main PLL */
- RCC->CR |= RCC_CR_PLLON;
- /* Wait till the main PLL is ready */
- while ((RCC->CR & RCC_CR_PLLRDY) == 0)
- {}
- /* Select the main PLL as system clock source */
- RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
- RCC->CFGR |= RCC_CFGR_SW_PLL;
- /* Wait till the main PLL is used as system clock source */
- while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL)
- {}
- }
- }
復制代碼
|
-
7.jpg
(102.22 KB, 下載次數: 63)
下載附件
2020-4-7 10:09 上傳
-
8.jpg
(134.34 KB, 下載次數: 89)
下載附件
2020-4-7 10:09 上傳
|