本帖最后由 狗啃模拟 于 2024-2-23 13:37 编辑
涉及到设置系统时钟源和时钟分频等参数。以下是一个基本的配置例子,可以在你的代码中进行修改和扩展:
#include "stm32f10x.h"
void SystemInit(void);
int main(void) {
// 在main函数中进行其他初始化
// 配置内部时钟
SystemInit();
// 在这里继续你的应用程序逻辑
while (1) {
// 主循环中的应用程序逻辑
}
}
void SystemInit(void) {
// 在SystemInit函数中配置内部时钟
// 使能内部高速时钟(HSI)
RCC->CR |= RCC_CR_HSION;
while (!(RCC->CR & RCC_CR_HSIRDY)); // 等待HSI准备好
// 选择HSI为系统时钟
RCC->CFGR &= ~RCC_CFGR_SW;
RCC->CFGR |= RCC_CFGR_SW_HSI;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI); // 等待系统时钟切换完成
// 配置AHB、APB1和APB2分频
RCC->CFGR &= ~(RCC_CFGR_HPRE | RCC_CFGR_PPRE1 | RCC_CFGR_PPRE2);
RCC->CFGR |= RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_PPRE2_DIV1;
// 可以根据需要配置其他时钟源和分频器
}
例子中,系统时钟选择了HSI,你可以根据需要选择其他时钟源,比如外部晶体振荡器(HSE)等。还可以根据需要配置AHB、APB1和APB2的分频器。 请注意,具体的时钟配置需要根据你的应用需求和硬件设计进行调整。
可以添加外部晶振(HSE)的配置、外设时钟使能(USART1、SPI1)以及中断优先级的配置
#include "stm32f10x.h"
void SystemInit(void);
int main(void) {
// 在main函数中进行其他初始化
// 配置内部时钟
SystemInit();
// 初始化外设
// ...
// 在这里继续你的应用程序逻辑
while (1) {
// 主循环中的应用程序逻辑
}
}
void SystemInit(void) {
// 在SystemInit函数中配置内部时钟
// 使能外部晶振时钟(HSE)
RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & RCC_CR_HSERDY)); // 等待HSE准备好
// 选择HSE为系统时钟
RCC->CFGR &= ~RCC_CFGR_SW;
RCC->CFGR |= RCC_CFGR_SW_HSE;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSE); // 等待系统时钟切换完成
// 配置AHB、APB1和APB2分频
RCC->CFGR &= ~(RCC_CFGR_HPRE | RCC_CFGR_PPRE1 | RCC_CFGR_PPRE2);
RCC->CFGR |= RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_PPRE2_DIV1;
// 使能外设时钟,比如使能USART1、SPI1等
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
// 配置中断优先级
NVIC_SetPriority(USART1_IRQn, 2); // 设置USART1中断的优先级为2
// 可以根据需要继续拓展其他配置
}
此代码适用于常见的配置需求,比如配置外部晶振、启用其他外设时钟、配置中断优先级等、
|