ARM学习之KEY_ENT实验

/***************************************************
Project: KEY按键中断实验
  Writer:  SHOW      
  Time:  2011/10/13 
  Hareware: 硬件平台:mini2440 , J-link.
      硬件连接:GPG0~EINT8,
  GPG3~EINT11,
  GPG5~EINT13,
  GPG6~EINT14。
  Direction:1.查询外部中断的方式控制对应的灯亮灭。
   2.需要设置的寄存器:GPBCON,GPGCON,SRCPND,INTMSK,INTPND,EXTINT1,EINTPEND,INTMASK。
   3.烧写程序过程中,经常跑飞,后来发现是没有对DebugReg进行设置,原来每个工程都需要设置。       
              
***************************************************/
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "def.h"

#include "mmu.h"

#include "Option.h"

#define LED1_OFF (1<<5)
#define LED2_OFF (1<<6)
#define LED3_OFF (1<<7)
#define LED4_OFF (1<<8)

void Delay1ms(int times);

void Init_LED(void);    
void __irq EintHandler(void);
void Init_Interrupt_Control(void);
//========================================================================
// 函数名称: 主函数
// 实现功能: 函数入口      
// 参数:     void 
// 返回值:   void
//========================================================================
void Main(void)  
{
Init_LED();                              //初始化LED。
        while(1); 

}

//========================================================================
// 函数名称: 外部中断初始化设置函数
// 实现功能: 对外部中断EINT的设置      
// 参数:     void 
// 返回值:   void
//========================================================================
void Init_Interrupt_Control(void)
{
rGPGCON |= (1<<1 | 1<<7 | 1<<11 | 1<<13); //设置按键对应的GPIO为EINT。
  rEXTINT1 = 0;                             //低电平触发。

rEINTPEND |= (1<<8  |1<<11 | 1<<13 | 1<<14);  //清中断挂起寄存器,写1则clear。
rEINTMASK &= ~(1<<8  | 1<<11 | 1<<13  |1<<14);//关掉中断屏蔽寄存器,使能中断。

ClearPending(BIT_EINT8_23);              // 清中断源挂起寄存器SRCPND与使能中断挂起寄存器INTPND防止有其他中断干扰。
  pISR_EINT8_23=(unsigned)EintHandler; //外部中断8_23中断服务子程序入口地址。pISR_EINT8_23在2440addr.h中有定义。
EnableIrq(BIT_EINT8_23);            // 关中断屏蔽寄存器INTMSK,使能中断。
}

//========================================================================
// 函数名称: 延时1ms子函数
// 实现功能: 延时      
// 参数:     times为延时的ms数。 
// 返回值:   void
//========================================================================
void Delay1ms(int times)
{
int i;
for( ;  times > 0; times-- )
for(i=400; i>0 ; i--);
}

//========================================================================
// 函数名称: IO口初始化子函数
// 实现功能: 初始化IO口 设置GPIO为输出口。     
// 参数:     void 
// 返回值:   void
//========================================================================
void Init_LED(void)
{
// rGPBCON = 0;  复位即为0可不用先给0。
rGPBCON |= (1<<10) | (1<<12) | (1<<14) | (1<<16); // 设置GPB5~GPB8 为输出口。
rGPBDAT |= (LED1_OFF | LED2_OFF | LED3_OFF | LED4_OFF);// 初始化熄灭。

}
//========================================================================
// 函数名称: 中断服务函数
// 实现功能: 判断是那个 外部中断,点亮对应的LED。__irp是中断服务函数标志必须有。    
// 参数:     void 
// 返回值:   void
//========================================================================
void __irq EintHandler(void)
{
    
if(rINTPND == BIT_EINT8_23)
{

ClearPending(BIT_EINT8_23);

if(rEINTPEND & (1<<8))
{
rGPBDAT &= ~LED1_OFF;
Delay1ms(1000);
rGPBDAT |= LED1_OFF;
rEINTPEND |= 1 << 8;
}
if(rEINTPEND & (1<<11))
{
rGPBDAT &= ~LED2_OFF;
Delay1ms(1000);
rGPBDAT |= LED2_OFF;
rEINTPEND |= 1 << 11;
}
if(rEINTPEND & (1<<13))
{
rGPBDAT &= ~LED3_OFF;
Delay1ms(1000);
rGPBDAT |= LED3_OFF;
rEINTPEND |=  1<< 13;
}
if(rEINTPEND & (1<<14))
{
rGPBDAT &= ~LED4_OFF;
Delay1ms(1000);
rGPBDAT |= LED4_OFF;
rEINTPEND |= 1 << 14;
}
}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`arm_cfft_f32` 是 ARM CMSIS-DSP 库用于实现快速傅里叶变换的函数,可以用于对实数或复数序列进行离散傅里叶变换(DFT)。 以下是 `arm_cfft_f32` 函数的函数原型: ```c void arm_cfft_f32(const arm_cfft_instance_f32 *S, float32_t *p1, uint8_t ifftFlag, uint8_t bitReverseFlag); ``` 其: - `S`:指向 `arm_cfft_instance_f32` 结构体的指针,该结构体包含了傅里叶变换所需的参数,需要在调用函数前初始化。 - `p1`:指向存储 DFT 输入和输出数据的数组的指针。 - `ifftFlag`:表示是否进行反向快速傅里叶变换(IFFT)的标志。如果为 0,则进行正向傅里叶变换(FFT)。如果为非 0 值,则进行 IFFT。 - `bitReverseFlag`:表示是否进行位倒序的标志。如果为 0,则不进行位倒序。如果为非 0 值,则进行位倒序。 以下是一个使用 `arm_cfft_f32` 函数进行 FFT 的示例代码: ```c #include "arm_math.h" #define FFT_SIZE 1024 // 定义输入和输出缓冲区 float32_t fft_input[FFT_SIZE]; float32_t fft_output[FFT_SIZE]; // 定义 FFT 变换参数 arm_cfft_instance_f32 fft_inst; uint32_t fft_size_log2 = 10; // FFT 大小为 2^10 = 1024 uint8_t ifft_flag = 0; // 进行正向 FFT uint8_t bit_reverse_flag = 1; // 进行位倒序 int main(void) { // 初始化 FFT 变换参数 arm_cfft_radix4_init_f32(&fft_inst, FFT_SIZE, ifft_flag, bit_reverse_flag); // 填充输入数据 for (uint32_t i = 0; i < FFT_SIZE; i++) { fft_input[i] = sinf(2 * PI * i / FFT_SIZE); } // 进行 FFT 变换 arm_cfft_f32(&fft_inst, fft_input, ifft_flag, bit_reverse_flag); // 处理 FFT 输出数据 // ... while (1) { // 主循环 } } ``` 在上述示例代码,首先定义了输入和输出缓冲区,以及 FFT 变换的参数。然后通过 `arm_cfft_radix4_init_f32` 函数初始化 `fft_inst` 参数。接着填充输入数据,并通过 `arm_cfft_f32` 函数进行 FFT 变换。最后可以对 FFT 输出数据进行处理。注意,FFT 的输出数据在 `fft_input` 数组,但是需要进行格式转换才能得到正确的结果。具体的格式转换方法可以参考 ARM CMSIS-DSP 库的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值