Cortex-M4

news/2024/11/25 15:48:18/

系统内核

  • 总线框架
  • 数据存储
  • 中断异常
  • 寄存器
  • 异常返回
  • 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+特权/非特权

在这里插入图片描述
在这里插入图片描述

任务切换

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/715010.html

相关文章

pytorch实战13:基于pytorch实现YOLOv1(长长文)

基于pytorch实现YOLOv1&#xff08;长长文&#xff09; 前言 ​ 本篇文章的目的是记录自己实现yolo v1的过程&#xff0c;在此过程中&#xff0c;参考了许多开源的代码和博客&#xff0c;赞美大佬们。 参考文献和代码 YOLO v1代码参考&#xff1a;&#xff08;读书人的事情&…

linux系统断电文件系统损坏规避方法

1. 如果有大电容&#xff0c;检测到断电后先做dismount&#xff0c;然后再走标准关机流程。 #!/bin/bashPATH/sbin:/bin:/usr/sbin:/usr/binmount -o remount,ro / umount -f -a -r > /dev/null 2>&1 fp popen("ps -e | grep \app\ | awk \{print $1}\&qu…

“Windows 资源保护找到了损坏文件但无法修复其中某些文件”的问题

很多人都会用sfc /scannow来解决系统文件损坏的问题&#xff0c;但有时也会遇到连sfc都无法修复的情况&#xff0c;最常见的就是出现“Windows 资源保护找到了损坏文件但无法修复其中某些文件 CBS.Log windir\Logs\CBS\CBS.log中有详细信息”&#xff0c;其实这是因为系统文件在…

Linux写文件断电保存,linux 写文件操作,异常掉电后,文件损坏丢失(0kb)

今天调试程序,在做异常断电测试时,再开机发现文件是0 kb, 通过log查询,文件已经写入完成。不明白为何掉电之后文件就没了。 查到下面的博文解决了该问题。 通过 fflush->fsync->fclose解决该问题 一、问题描述 Linux系统,嵌入式程序开发。 程序运行过程中,有读写配…

excel文件修复工具_OFFICE文件图标空白的修复方法(亲测有效)

前两天,我的一位同事反馈他的电脑中OFFICE2016出现了问题,操作系统为WIN10,图标显示异常为空白,但不影响打开使用(只是该兄弟为强迫症患者,求我给修复好)。显示效果如下图: office图标显示空白 PS:造成这种情况的原因一般是装过WPS,卸载后又安装了OFFICE;又或者是win1…

VMware虚拟机配置文件(.vmx)损坏,提示移除,如何修复?

早起打开虚拟机&#xff0c;突然提示“文件损坏&#xff0c;是否移除&#xff1f;” 吓我一跳&#xff0c;里面的文件都没有上传到云端&#xff0c;虽然之前有过备份&#xff0c;但是昨天的数据肯定是没有备份的。 昨天还是好好的&#xff0c;怎么一打开就这样了&#xff1f; …

预防WinRAR文件损坏

有时在网上下载软件&#xff0c;解压的时候会弹出如下弹框&#xff08;图片来自百度&#xff09;&#xff1a;不可预料的压缩文件末端&#xff0c;非常恼人&#xff01; 一、原因 出现这种问题&#xff0c;有这么两种原因&#xff1a; 1、文件在服务器上就已经损坏了&#xf…

关于MongoDB collection***.wt 文件损坏后,无法修复也无法启动mongodb

PS&#xff1a;尝试修复之前&#xff0c;先把数据文件备份一份,免得修复过程中数据丢失 意外操作导致了mongoDB运行不了&#xff0c;原因是collection***.wt文件损坏 尝试 mongod --dbpath "/usr/***/****" --repair&#xff0c;但是会失败&#xff0c;具体的失败信…