系统内核
- 总线框架
- 数据存储
- 中断异常
- 寄存器
- 异常返回
- Systick延时
- 处理器模式
- 任务切换
总线框架
数据存储
中断异常
寄存器
异常返回
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); //使能PLLwhile ( 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();//使能HSIRCC_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_16RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x); //先配置锁相环 PLLCLK = HSI * 倍频因子//配置三个总线的倍频因子// HCLK = SYSCLK AHB 36MRCC_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 readywhile (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL稳定RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择系统时钟(选择锁相环输出)// Wait till PLL is used as system clock sourcewhile (RCC_GetSYSCLKSource() != 0x08); //等待选择稳定RCC_GetClocksFreq(&RCC_ClockFreq);//查看频率值}else{//HSI启动失败}
}}
处理器模式
处理模式+MSP+特权
线程模式+PSP+特权/非特权
任务切换