Cortex-M4

总线框架

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

数据存储

在这里插入图片描述

中断异常

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

寄存器

在这里插入图片描述

异常返回

在这里插入图片描述

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+特权/非特权

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

任务切换

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值