总线框架
数据存储
中断异常
寄存器
异常返回
Systick延时
/**
* @brief 延时程序,单位us
* @param 延时数量
* @retval None
* @note 主频180Mhz, 8分频作为时钟源
*/
void delay_us(uint32_t count)
{
uint32_t temp;
SysTick->LOAD = 22.5f *count;
SysTick->VAL = 0x00; //清空计数器
SysTick->CTRL = 0x01; //使能,减到零是无动作,采用外部时钟源
do
{
temp = SysTick->CTRL; //读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL = 0x00; //关闭计数器
SysTick->VAL = 0x00; //清空计数器
}
/**
* @brief 延时程序,单位ms
* @param 延时毫秒数
* @retval None
*/
void delay_ms(uint32_t nms)
{
u32 temp;
SysTick->LOAD = 22500u;
SysTick->VAL = 0x00; //清空计数器
SysTick->CTRL = 0x01; //使能,减到零是无动作,采用外部时钟源
do
{
do
{
temp = SysTick->CTRL; //读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
}while(nms--);
SysTick->CTRL = 0x00; //关闭计数器
SysTick->VAL = 0x00; //清空计数器
}
设置时钟流程:
1、将RCC寄存器重新设置为默认值 RCC_DeInit
2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);
3、等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp();
4、设置PLL RCC_PLLConfig
5、打开PLL RCC_PLLCmd(ENABLE);
6、设置系统时钟 RCC_SYSCLKConfig
7、设置AHB时钟 RCC_HCLKConfig;
8、设置低速速AHB时钟 RCC_PCLK1Config
9、设置高速AHB时钟 RCC_PCLK2Config;
10、等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
11、判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08)
12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()
/*使用HSE配置系统时钟*/
void HSE_sysclock_config( uint32_t RCC_PLLMul_x )
{
RCC_DeInit(); //先复位RCC寄存器
RCC_HSEConfig( RCC_HSE_ON ); //使能HSE
//检测HSE是否启动成功
if ( SUCCESS == RCC_WaitForHSEStartUp() )
{
//使能预取指,这是FLASH固件中的函数
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//设置FLASH等待周期。 因为倍频成72M 所以等待两个周期。
FLASH_SetLatency(FLASH_Latency_2);
//配置三个总线的倍频因子
//HCLK --> AHB 最大为72M,所以只需要1分频
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//PCLK1 --> APB1 最大为36M,所以要2分频
RCC_PCLK1Config(RCC_HCLK_Div2);
//PCLK2 --> APB2 最大为72M,所以只需要1分频
RCC_PCLK2Config(RCC_HCLK_Div1);
//先配置锁相环 PLLCLK = HSE * 倍频因子
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);
RCC_PLLCmd(ENABLE); //使能PLL
while ( RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY) ); //等待PLL稳定
//选择系统时钟(选择锁相环输出)
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//等待选择稳定
while ( 0x08 != RCC_GetSYSCLKSource() );
}
else
{
//HSE启动失败
}
void HSI_sysclock_config( uint32_t RCC_PLLMul_x )
{
__IO uint32_t HSIStatus = 0;
//先复位RCC寄存器
RCC_DeInit();
//使能HSI
RCC_HSICmd(ENABLE);
//检测HSE是否启动成功
HSIStatus = RCC->CR & RCC_CR_HSIRDY;
if ( RCC_CR_HSIRDY == HSIStatus )
{
//使能预取指,这是FLASH固件中的函数
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//设置FLASH等待周期。 因为倍频成72M 所以等待两个周期。
FLASH_SetLatency(FLASH_Latency_2);
// 8M/2*16=64M RCC_PLLMul_x = RCC_PLLMul_16
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x); //先配置锁相环 PLLCLK = HSI * 倍频因子
//配置三个总线的倍频因子
// HCLK = SYSCLK AHB 36M
RCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK --> AHB 最大为72M,所以只需要1分频
RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 --> APB1 最大为36M,所以要2分频
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 --> APB2 最大为72M,所以只需要1分频
RCC_PLLCmd(ENABLE); //使能PLL
// Wait till PLL is ready
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择系统时钟(选择锁相环输出)
// Wait till PLL is used as system clock source
while (RCC_GetSYSCLKSource() != 0x08); //等待选择稳定
RCC_GetClocksFreq(&RCC_ClockFreq);//查看频率值
}
else
{
//HSI启动失败
}
}
}
处理器模式
处理模式+MSP+特权
线程模式+PSP+特权/非特权
任务切换