⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.c

📁 Cortex-M4+example
💻 C
字号:
//-------------------------------------------------------------------------*
// 文件名: common.h (通用头文件)                                           *
// 说  明:                                                                 *
//-------------------------------------------------------------------------*

#include "common.h"

//-------------------------------------------------------------------------*
//函数名: stop                                                             *
//功  能: 设置CPU为STOP模式                                                * 
//参  数: 无								   *	
//返  回: 无                                                               *
//说  明: 无                                                               *
//-------------------------------------------------------------------------*
void stop (void)
{
    //置位SLEEPDEEP来使能STOP模式
    SCB_SCR |= SCB_SCR_SLEEPDEEP_MASK;	
    //进入STOP模式
    asm("WFI");
}

//-------------------------------------------------------------------------*
//函数名: wait                                                             *
//功  能: 设置CPU为WAIT模式                                                * 
//参  数: 无								   *	
//返  回: 无                                                               *
//说  明: 无                                                               *
//-------------------------------------------------------------------------*
void wait (void)
{
    //清SLEEPDEEP位来确定进入WAIT模式
    SCB_SCR &= ~SCB_SCR_SLEEPDEEP_MASK;	
    //进入WAIT模式
    asm("WFI");
}

//-------------------------------------------------------------------------*
//函数名: write_vtor                                                       *
//功  能: 更改中断向量表偏移寄存器的值                                     * 
//参  数: 要更改的值    						   *	
//返  回: 无                                                               *
//说  明: 无                                                               *
//-------------------------------------------------------------------------*
void write_vtor (int vtor)
{
    //写新值
    SCB_VTOR = vtor;	
}

//-------------------------------------------------------------------------*
//函数名: enable_irq                                                       *
//功  能: 使能irq中断                                                      * 
//参  数: irq:irq号       						   *	
//返  回: 无                                                               *
//说  明: irq号不是中断向量号                                              *
//-------------------------------------------------------------------------*
void enable_irq (int irq)
{
    int div;

    //确定irq号为有效的irq号
    if (irq > 91)	irq=91;
    
    //确定对应的NVICISER
    div = irq/32;
    
    switch (div)
    {
    	case 0x0:
              NVICICPR0 = 1 << (irq%32);
              NVICISER0 = 1 << (irq%32);
              break;
    	case 0x1:
              NVICICPR1 = 1 << (irq%32);
              NVICISER1 = 1 << (irq%32);
              break;
    	case 0x2:
              NVICICPR2 = 1 << (irq%32);
              NVICISER2 = 1 << (irq%32);
              break;
    }              
}

//-------------------------------------------------------------------------*
//函数名: disable_irq                                                      *
//功  能: 禁止irq中断                                                      * 
//参  数: irq:irq号       						   *	
//返  回: 无                                                               *
//说  明: irq号不是中断向量号                                              *
//-------------------------------------------------------------------------*
void disable_irq (int irq)
{
    int div;
    
    //确定irq号为有效的irq号
    if (irq > 91)	irq=91;
    
    //确定对应的NVICISER
    div = irq/32;
    
    switch (div)
    {
    	case 0x0:
               NVICICER0 = 1 << (irq%32);
              break;
    	case 0x1:
              NVICICER1 = 1 << (irq%32);
              break;
    	case 0x2:
              NVICICER2 = 1 << (irq%32);
              break;
    }              
}
 
//-------------------------------------------------------------------------*
//函数名: set_irq_priority                                                 *
//功  能: 设置irq中断和优先级                                              * 
//参  数: irq:irq号         						   *	
//        prio:优先级						           *	
//返  回: 无                                                               *
//说  明: irq号不是中断向量号                                              *
//-------------------------------------------------------------------------*
void set_irq_priority (int irq, int prio)
{
    uint8 *prio_reg;

    //确定irq号和优先级有效
    if (irq > 91)	irq=91;
    if (prio > 15)	prio=15;

    //确定对应的NVICISER
    prio_reg = (uint8 *)(((uint32)&NVICIP0) + irq);
    //设置优先级
    *prio_reg = ( (prio&0xF) << (8 - ARM_INTERRUPT_LEVEL_BITS) );             
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -