ARM内核Cortex-M4 📅 2026/8/17 15:39:33 系统内核总线框架数据存储中断异常寄存器异常返回Systick延时处理器模式任务切换低功耗总线框架数据存储中断异常寄存器异常返回Systick延时/** * brief 延时程序单位us * param 延时数量 * retval None * note 主频180Mhz, 8分频作为时钟源 */voiddelay_us(uint32_tcount){uint32_ttemp;SysTick-LOAD22.5f*count;SysTick-VAL0x00;//清空计数器SysTick-CTRL0x01;//使能减到零是无动作采用外部时钟源do{tempSysTick-CTRL;//读取当前倒计数值}while((temp0x01)(!(temp(116))));//等待时间到达SysTick-CTRL0x00;//关闭计数器SysTick-VAL0x00;//清空计数器}/** * brief 延时程序单位ms * param 延时毫秒数 * retval None */voiddelay_ms(uint32_tnms){u32 temp;SysTick-LOAD22500u;SysTick-VAL0x00;//清空计数器SysTick-CTRL0x01;//使能减到零是无动作采用外部时钟源do{do{tempSysTick-CTRL;//读取当前倒计数值}while((temp0x01)(!(temp(116))));//等待时间到达}while(nms--);SysTick-CTRL0x00;//关闭计数器SysTick-VAL0x00;//清空计数器}设置时钟流程1、将RCC寄存器重新设置为默认值 RCC_DeInit2、打开外部高速时钟晶振HSERCC_HSEConfig(RCC_HSE_ON);3、等待外部高速时钟晶振工作 HSEStartUpStatusRCC_WaitForHSEStartUp();4、设置PLL RCC_PLLConfig5、打开PLLRCC_PLLCmd(ENABLE);6、设置系统时钟 RCC_SYSCLKConfig7、设置AHB时钟 RCC_HCLKConfig;8、设置低速速AHB时钟 RCC_PCLK1Config9、设置高速AHB时钟 RCC_PCLK2Config;10、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)RESET)11、判断是否PLL是系统时钟while(RCC_GetSYSCLKSource()!0x08)12、打开要使用的外设时钟RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd/*使用HSE配置系统时钟*/voidHSE_sysclock_config(uint32_tRCC_PLLMul_x){RCC_DeInit();//先复位RCC寄存器RCC_HSEConfig(RCC_HSE_ON);//使能HSE//检测HSE是否启动成功if(SUCCESSRCC_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(RESETRCC_GetFlagStatus(RCC_FLAG_PLLRDY));//等待PLL稳定//选择系统时钟选择锁相环输出RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//等待选择稳定while(0x08!RCC_GetSYSCLKSource());}else{//HSE启动失败}voidHSI_sysclock_config(uint32_tRCC_PLLMul_x){__IOuint32_tHSIStatus0;//先复位RCC寄存器RCC_DeInit();//使能HSIRCC_HSICmd(ENABLE);//检测HSE是否启动成功HSIStatusRCC-CRRCC_CR_HSIRDY;if(RCC_CR_HSIRDYHSIStatus){//使能预取指这是FLASH固件中的函数FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//设置FLASH等待周期。 因为倍频成72M 所以等待两个周期。FLASH_SetLatency(FLASH_Latency_2);// 8M/2*1664M 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特权/非特权任务切换低功耗以STM32F4系列为例低功耗的目的是在功耗唤醒速度和功能保留之间进行取舍达到一个平衡的状态。STM32F4低功耗有睡眠停止待机三种模式。睡眠模式只关闭CPU时钟外设和系统时钟正常运行任意中断和事件都可以唤醒唤醒速度最快。停止模式关闭高速时钟只保留SRAM和寄存器数据外部中断或RTC闹钟唤醒唤醒需要重置系统时钟。待机模式只保留备份域看门狗和RTC唤醒唤醒相当于复位。