Thứ Sáu, 15 tháng 3, 2019

[Học ARM-Bài0] RCC STM32 với Standard Peripheral Library

Author: Cong Neb
Alias: Dark Neb
Studied at: SET BKHN K57
Nếu copy tài liệu: Nhớ ghi nguồn tác giả..Tks

Reset and clock control (RCC)
RCC là một khối cực kì quan trọng của MCU... Nếu không có RCC MCU của ta sẽ không khác gì các con IC như 555..ect chứ không còn là MCU nữa...
MCU chỉ làm việc được khi được cung cấp 1 xung Clock... Và RCC làm việc đó...
Nếu nói Nguồn là năng lượng thì RCC là hơi thở của MCU...

Chức năng: Cung cấp xung Clock cho hệ thống...
RCC_TypeDef is defined in the stm32f2xx.h file and contains the RCC registers

Các Registers:

__IO uint32_t CR
__IO uint32_t PLLCFGR
__IO uint32_t CFGR
__IO uint32_t CIR
__IO uint32_t AHB1RSTR
__IO uint32_t AHB2RSTR
__IO uint32_t AHB3RSTR
uint32_t RESERVED0
__IO uint32_t APB1RSTR
__IO uint32_t APB2RSTR
uint32_t RESERVED1
__IO uint32_t AHB1ENR
__IO uint32_t AHB2ENR
__IO uint32_t AHB3ENR
uint32_t RESERVED2
__IO uint32_t APB1ENR
__IO uint32_t APB2ENR
uint32_t RESERVED3
__IO uint32_t AHB1LPENR
__IO uint32_t AHB2LPENR
__IO uint32_t AHB3LPENR
uint32_t RESERVED4
__IO uint32_t APB1LPENR
__IO uint32_t APB2LPENR
uint32_t RESERVED5
__IO uint32_t BDCR
__IO uint32_t CSR
uint32_t RESERVED6
__IO uint32_t SSCGR
__IO uint32_t PLLI2SCFGR

// Mình khác Shock khi lần đầu đọc về các Reg của RCC...Nhiều vch.
Nhưng nó là khối rất quan trọng của MCU nên ta phải tìm hiểu nó...



Sau khi Reset MCU sẽ khởi chạy với nguồn xung tốc độ cao của Clock nội ... Bộ nhớ Flash 0 sẽ ở trạng thái Wait State... Các bộ nhớ khác như D-Cache,I-Cache sẽ bị disabled... Và tất cả các ngoại vi sẽ OFF ngoại trừ SRAM,Flash và JTAG...


Các function chính
RCC_DeInit()
RCC_HSEConfig()
RCC_WaitForHSEStartUp()
RCC_AdjustHSICalibrationValue()
RCC_HSICmd()
RCC_LSEConfig()
RCC_LSICmd()
RCC_PLLConfig()
RCC_PLLCmd()
RCC_PLLI2SConfig()
RCC_PLLI2SCmd()
RCC_ClockSecuritySystemCmd()
RCC_MCO1Config()
RCC_MCO2Config()

 Giải thích 1 số hàm

1. RCC_PLLConfig
void RCC_PLLConfig ( uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)

Purpose: Cấu hình PLL clock source, bộ nhân và chia...

Parameter:
1.1 RCC_PLLSource
  RCC_PLLSource_HSI :  HSI oscillator clock selected
  RCC_PLLSource_HSE :  HSE oscillator clock selected


2. RCC_PLLCmd
void RCC_PLLCmd ( FunctionalState NewState)

Mục đích:Enables or disables PLL

NewState: ENABLE or DISABLE


3.RCC_AHBxPeriphClockCmd
void RCC_AHB1PeriphClockCmd ( uint32_t RCC_AHB1Periph, FunctionalState NewState)

Mục đích: Enables or disables the AHBx peripheral clock.



Ví dụ RCC

Mình sẽ sử dụng RCC để cấu hình xung clock của MCU là 120MHz và sử dụng nguồn lock ngoài-HSE ...
Let's start !


Phần này khá khó hiểu...Mình recommend các bạn dùng CubeMX để check các Para này sẽ dễ hiểu hơn...

/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 25 /* For HSE value 25 MHz */
#define PLL_N 240

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 2                                   // HSE Prediv Valuve

IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;

/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);

/* Chờ cho đến khi HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if (HSEStartUpStatus == SUCCESS)
{
/* Flash 3 wait state, prefetch buffer and cache ON */
FLASH_SetLatency(FLASH_Latency_3);
FLASH_PrefetchBufferCmd(ENABLE);
FLASH_InstructionCacheCmd(ENABLE);
FLASH_DataCacheCmd(ENABLE);

/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* PCLK2 = HCLK/2 */
RCC_PCLK2Config(RCC_HCLK_Div2);

/* PCLK1 = HCLK/4 */
RCC_PCLK1Config(RCC_HCLK_Div4);

/* Configure the main PLL clock to 120 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE, PLL_M, PLL_N, PLL_P, PLL_Q);

/* Enable the main PLL */
RCC_PLLCmd(ENABLE);

/* Wait till the main PLL is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{}
/* Select the main PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* Wait till the main PLL is used as system clock source */
while (RCC_GetSYSCLKSource() != RCC_CFGR_SWS_PLL)
{}
}
else
{// Phần exception
 /*Nếu HSE FAIL,..bạn cần thêm các action... Với mình thì mình sẽ khởi tạo Init() lại một lần nữa */
}

Không có nhận xét nào:

Đăng nhận xét