标题:
stm32F401,HSI作为时钟源PLL为时钟,PD2产生10K方波
[打印本页]
作者:
EmestYJ
时间:
2020-4-7 10:10
标题:
stm32F401,HSI作为时钟源PLL为时钟,PD2产生10K方波
#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 上传
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1