历史上的今天
返回首页

历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2021年10月19日 | S5PV210的中断系统和按键控制外部中断

2021-10-19 来源:eefocus

一、按键及轮训方式处理按键(基于S5PV210)

1.什么是按键

1、按键的物理特性

(1)、平时没人按的时候,弹簧把按键按钮弹开。此时内部断开的。

(2)、有人按下的时候,手的力量克服弹簧的弹力,将按钮按下,此时内部保持接通(闭合)状态;如果手拿开,则弹簧作用下按钮又弹开,同时内部又断开。

(3)、一般的按键都有4个引脚,这4个引脚成2对:其中一对是常开触点(像上面描述的不按则断开,按下则闭合);一对是常闭触点(平时不按时是闭合的,按下后是断开的)


2、按键的电学原理(结合原理图分析)

在这里插入图片描述

(1)硬件接法: SW5:GPH0_2、 SW6:GPH0_3、 SW7 8 9 10:GPH2_0 1 2 3

(2)**按键的电路连接分析:平时按钮没有按下时,按钮内部断开,GPIO引脚处电压为高电平;当有人按下按钮时,按钮内部导通,外部VDD经过电阻和按钮连接到地,形成回路,此时GPIO引脚处电压就变成了低电平。**此时VDD电压全部分压在了电阻上(这个电阻就叫分压电阻,这个电阻不能太小,因为电阻的功率是U*U/R)

(3)总结:按键的工作方法:其实就是按键的按下与弹开,分别对应GPIO的两种电平状态(按下则GPIO为低电平,弹开则GPIO为高电平)。此时SoC内部可以通过检测这个GPIO的电平高低来判断按键有没有被按下,这个判断结果即可作为SoC的输入信号。


3、按键属于输入类设备

(1)按键一般用来做输入设备(由人向SoC发送信息的设备,叫输入设备),由人向SoC发送按键信号(按键信号有2种:按下信号和弹开信号)。

(2)有些设备就是单纯的输入设备,譬如按键、触摸屏等;有些设备就是单纯的输出设备,譬如LCD;还有一些设备是既能输入又能输出的,叫输入输出设备(IO),譬如串口。


4、按键的2种响应方法

(1)SoC处理按键有2种思路:轮询方式和中断方式。

(2)轮询方式,就是SoC主动的每隔一段时间去读取(按键所对应的)GPIO的电平高低,以此获得按键信息;缺点在于CPU要一直注意按键事件,会影响CPU做其他事情。

(3)中断方式,就是SoC事先设定好GPIO触发的中断所对应的中断处理程序ISR,当外部按键按下或弹开时会自动触发GPIO对应的外部中断,导致ISR执行,从而自动处理按键信息。


2.轮询方式处理按键

1、X210开发板的按键接法

(1)查原理图,找到按键对应的GPIO:SW5:GPH0_2 SW6:GPH0_3 SW7 8 9 10:GPH2_0 1 2 3

(2)原理图上可以看出:按下时是低电平,弹起时是高电平(原理图如我们上面的图所示)


2、按键对应的GPIO模式设置

(1)按键接到GPIO上,按键按下还是弹起,决定外部电路的接通与否,从而决定这个GPIO引脚的电压是高还是低;这个电压可以作为这个GPIO引脚的输入信号,此时GPIO配置为输入模式,即可从SoC内部读取该引脚的电平为1还是0(1对应高电平,0对应低电平)。

在这里插入图片描述

(2)GPH0CON(0xE0200C00) GPH0DAT(0xE0200C04) GPH2CON(0xE0200C40) GPH2DAT(0xE0200C44) 这些就是按键对应的一些寄存器和寄存器的地址。

(3)应该在CON寄存器中将GPIO设置为input模式,然后去读取DAT寄存器(读取到的相应位的值为1表示外部是高电平(对应按键弹起),读取到的位的值为0表明外部是低电平(按键按下))


3、轮询方式处理按键的程序流程

(1)第一步,先初始化GPIO模式为input;

(2)第二步,循环读取GPIO的电平值,然后判断有无按键按下


4、代码编写和调试

添加key.c文件


// 定义操作寄存器的宏

#define GPH0CON 0xE0200C00

#define GPH0DAT 0xE0200C04


#define GPH2CON 0xE0200C40

#define GPH2DAT 0xE0200C44


#define rGPH0CON (*(volatile unsigned int *)GPH0CON)

#define rGPH0DAT (*(volatile unsigned int *)GPH0DAT)

#define rGPH2CON (*(volatile unsigned int *)GPH2CON)

#define rGPH2DAT (*(volatile unsigned int *)GPH2DAT)


// 初始化按键

void key_init(void)

{

// 设置GPHxCON寄存器,设置为输入模式

// GPH0CON的bit8~15全部设置为0,即可

rGPH0CON &= ~(0xFF<<8);

// GPH2CON的bit0~15全部设置为0,即可

rGPH2CON &= ~(0xFFFF<<0);

}

//轮循方式处理按键函数

void key_polling(void)

{

// 依次,挨个去读出每个GPIO的值,判断其值为1还是0.如果为1则按键按下,为0则弹起

// 轮询的意思就是反复循环判断有无按键,隔很短时间

while (1)

{

// 对应开发板上标着LEFT的那个按键

if (rGPH0DAT & (1<<2))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led1(); //调用led()这个函数来调试程序

}

// 对应开发板上标着DOWN的那个按键

if (rGPH0DAT & (1<<3))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led2();

}

// 对应开发板上标着UP的那个按键

if (rGPH2DAT & (1<<0))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led3();

}

}

}


3.串口输出和按键消抖

1、基于串口标准输出的按键调试

(1)以之前的串口stdio的工程为基础来移植添加轮询方式按键处理。


2、什么是按键消抖

(1)按键这种物理器件本身会有抖动信号,抖动信号指的是在电平由高到低(也就是按键按下时)或者电平由低到高(也就是按键弹起时)过程中,电平的变化不是立刻变化,而是经过了一段时间的不稳定期才完成变化,在这个不稳定期间电平可能会时高时低反复变化,这个不稳定期就叫抖动(抖动期内获取按键信息是不可靠的,要想办法消抖)。

(2)什么叫消抖?消抖就是用硬件或者软件方法来尽量减小抖动期对按键获取的影响。

消抖常用2种思路:

第一是硬件消抖,消抖思路就是尽量减小抖动时间,方法是通过硬件添加电容等元件来减小抖动;

第二是软件消抖,消抖思路是发现一次按键按下/弹起事件后,不立即处理按键,而是延时一段时间(一般10~20ms,这就是消抖时间)后再次获取按键键值,如果此次获取和上次一样是按下/弹起,那就认为真的按下/弹起了。

(3)一般比较精密需要的时候,需要硬件消抖和软件消抖一起配合。


3、编程实践

添加标准输入输出调试按键和添加按键消抖


#include "stdio.h"


// 定义操作寄存器的宏

#define GPH0CON 0xE0200C00

#define GPH0DAT 0xE0200C04


#define GPH2CON 0xE0200C40

#define GPH2DAT 0xE0200C44


#define rGPH0CON (*(volatile unsigned int *)GPH0CON)

#define rGPH0DAT (*(volatile unsigned int *)GPH0DAT)

#define rGPH2CON (*(volatile unsigned int *)GPH2CON)

#define rGPH2DAT (*(volatile unsigned int *)GPH2DAT)


// 初始化按键

void key_init(void)

{

// 设置GPHxCON寄存器,设置为输入模式

// GPH0CON的bit8~15全部设置为0,即可

rGPH0CON &= ~(0xFF<<8);

// GPH2CON的bit0~15全部设置为0,即可

rGPH2CON &= ~(0xFFFF<<0);

}


void delay20ms(void)

{

// 这个函数作用是延时20ms

// 因为我们这里是裸机程序,且重点不是真的要消抖,而是教学

// 所以我这里这个程序只是象征性的,并没有实体

// 如果是研发,那就要花时间真的调试出延时20ms的程序

int i, j;

for (i=0; i<100; i++)

{

for (j=0; j<1000; j++)

{

i * j;

}

}

}


void key_polling(void)

{

// 依次,挨个去读出每个GPIO的值,判断其值为1还是0.如果为1则按键按下,为0则弹起

// 轮询的意思就是反复循环判断有无按键,隔很短时间

while (1)

{

// 对应开发板上标着LEFT的那个按键

if (rGPH0DAT & (1<<2))

{

// 为1,说明没有按键

led_off();

}

else

{

// 添加消抖

// 第一步,延时

delay20ms();

// 第二步,再次检验按键状态

//再检查按键状态之间先进行延时消抖,消抖之后再去判断按键状态,在判断弹起与按下之前都需要进行延时消抖,我们这里只是举了一个例子

if (!(rGPH0DAT & (1<<2)))

{

// 为0,说明有按键

led1();

printf("key left.n"); //将前面一直的标准输入输出添加过来我们在这里就可以用printf来调试程序

}

}

// 对应开发板上标着DOWN的那个按键

if (rGPH0DAT & (1<<3))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led2();

printf("key down.n");

}

// 对应开发板上标着UP的那个按键

if (rGPH2DAT & (1<<0))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led3();

}

}

}


二、中断的引入及一些中断有关的概念和过程(基于S5PV210)

1、S5PV210的中断体系介绍

1、什么是中断

(1)中断的发明是用来解决宏观上的并行需要的。宏观就是从整体上来看,并行就是多件事情都完成了。

(2)微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行的。宏观上面的并行并不等于微观的并行,有时候宏观上是并行的,微观上是串行的。

(3)例子中一个人在看电影,快递来了暂停电影跑去收快递,收完快递继续回来看电影,这个例子就是宏观上的并行和微观上的串行。例子中一个人等同于SoC中1个CPU(也就是单核CPU),这个CPU看电影就不能收快递,收快递就不能看电影(也就是说不能真正的并行)。单核心CPU在微观角度是串行的,但是因为CPU很快,所以在宏观看来可以并行。

(4)上例中大部分时间在看电影,中间少量时间去收快递,那么类比于CPU来说,看电影就应该是CPU的常规任务,而收快递则应该是中断例程。也就是说CPU平时一直在进行看电影任务,等快递来了(中断发生了)快递员(类似于中断源)会打电话叫人去收快递(中断源会触发中断通知CPU去处理中断),人收到电话(CPU收到中断信号)后会暂定电影(CPU保存常规任务的现场)跑去收快递(CPU去执行中断处理程序ISR处理中断),收完快递(执行完ISR)回来继续看电影(CPU恢复常规任务的现场,继续执行常规任务)

(5)为什么需要中断?

因为单核CPU实际无法并行的,但是通过中断机制,可以实现假并行(宏观上的并行,微观上实际还是串行的)。


2、SoC对中断的实现机制:异常向量表

(1)异常向量表是CPU中某些特定地址的特定定义。

当中断发生的时候,中断要想办法通知CPU去处理中断,怎么做到?这就要靠异常向量表。

(2)在CPU设计时,就事先定义了CPU中一些特定地址作为特定异常的入口地址(譬如定义0x00000000地址为复位异常向量地址,则发生复位异常时CPU会自动跳转到0x00000000地址去执行指令。又譬如外部中断对应的异常向量地址为0x30000008,则发生外部中断后,CPU会硬件自动跳转到0x30000008地址去执行指令。)如

(3)以上讲的是CPU硬件设计时对异常向量表的支持,下来就需要软件支持了。硬件已经决定了发生什么异常CPU自动跳转PC到哪个地址去执行,软件需要做的就是把处理这个异常的代码的首地址填入这个异常向量地址。


3、S5PV210的异常向量表

在这里插入图片描述

(1)异常向量表中各个向量的相对位置是固定的,但是他们的起始地址是不固定的,各种SoC可以不一样,而且复杂ARM中还可以让用户来软件设置这个异常向量表的基地址。

(2)扩展到所有架构的CPU中:所有架构(譬如51单片机、PIC单片机)的CPU实现中断都是通过异常向量表实现的,这个机制是不变的;但是不同CPU异常向量表的构造和位置是不同的。


4、异常和中断的区别和联系

(1)针对SoC来说,发生复位、软中断、中断、快速中断、取指令异常、数据异常等,我们都统一叫异常。所以说:中断其实是异常的一种。

(2)异常的定义就是突发事件,打断了CPU的正常常规业务,CPU不得不跳转到异常向量表中去执行异常处理程序;中断是异常的一种,一般特指SoC内的内部外设产生的打断SoC常规业务,或者外部中断(SoC的GPIO引脚传回来的中断)。


2、异常向量表的编程处理

1、像内存一样去访问异常向量表(异常向量表的访问)

(1)S5PV210的异常向量表可以改变(在CP15协处理器中),以适应操作系统的需求。但是目前系统刚启动时,此时DRAM尚未初始化,程序都在SRAM中运行。210在iRAM中设置了异常向量表,供暂时性使用。

(2)查210的iROM application note文档中iRAM的地址分配,可知,iRAM中的异常向量表起始地址为0xD0037400。知道了异常向量表的起始地址后,各个异常对应的入口就很好知道了。

在这里插入图片描述

2、函数名的实质就是函数的首地址

(1)函数名在C语言中的理解方法和变量名其实没区别。编译器会把这个函数的函数体对应的代码段和这个函数的函数名(实质是符号)对应起来,等我们在使用这个函数名符号时,编译器会将函数的函数体实际上做替换。因为函数体都不止4字节,而函数名这个符号只能对应1个地址,所以实际对应的是函数体那一个代码段的首地址。

(2)拿C语言中的语法来讲,函数名就是这个函数的函数指针。


创建int.c和int.h文件进行异常向量表的绑定的代码演示:


初级阶段的int.h:定义异常向量的入口地址


#ifndef __INT_H__

#define __INT_H__


#define exception_vector_table_base 0xD0037400        //cpu异常向量表的基地址

#define exception_reset (exception_vector_table_base + 0x00)

#define exception_undef (exception_vector_table_base + 0x04)

#define exception_sotf_int (exception_vector_table_base + 0x08)

#define exception_prefetch (exception_vector_table_base + 0x0C)

#define exception_data (exception_vector_table_base + 0x10)

#define exception_irq (exception_vector_table_base + 0x18)

#define exception_fiq (exception_vector_table_base + 0x1C)


#define r_exception_reset (*(volatile unsigned int *)exception_reset)

#define r_exception_undef (*(volatile unsigned int *)exception_undef)

#define r_exception_sotf_int (*(volatile unsigned int *)exception_sotf_int)

#define r_exception_prefetch (*(volatile unsigned int *)exception_prefetch)

#define r_exception_data (*(volatile unsigned int *)exception_data)

#define r_exception_irq (*(volatile unsigned int *)exception_irq)

#define r_exception_fiq (*(volatile unsigned int *)exception_fiq)


初级阶段的int.c:绑定异常向量的执行函数


#include "int.h"

#include "stdio.h"


void system_init_exception(void)

{

r_exception_reset = (unsigned int)reset_exception; //这里就是将我们的异常处理程序跟我们的异常向量表绑定

r_exception_undef = (unsigned int)undef_exception;

r_exception_sotf_int = (unsigned int)sotf_int_exception;

r_exception_prefetch = (unsigned int)prefetch_exception;

r_exception_data = (unsigned int)data_exception;

r_exception_irq = (unsigned int)IRQ_handle;

r_exception_fiq = (unsigned int)IRQ_handle;

}


void reset_exception(void)          //复位异常,到此处执行复位的操作,下面的各个函数的功能都类似

{

printf("reset_exception.n");

}


void undef_exception(void)

{

printf("undef_exception.n");

}


void sotf_int_exception(void)

{

printf("sotf_int_exception.n");

}


void prefetch_exception(void)

{

printf("prefetch_exception.n");

}


void data_exception(void)

{

printf("data_exception.n");

}


// 真正的中断处理程序。意思就是说这里只考虑中断处理,不考虑保护/恢复现场

void irq_handler(void)

{

//printf("irq_handler.n");

// SoC支持很多个(在低端CPU例如2440中有30多个,在210中有100多个)中断

// 这么多中断irq在第一个阶段走的是一条路,都会进入到irq_handler来

// 我们在irq_handler中要去区分究竟是哪个中断发生了,然后再去调用该中断

// 对应的isr。


}


总结:

当我们将异常处理程序的首地址和异常向量表绑定起来后,异常处理初步阶段就完成了。到目前可以保证相应异常发生后,硬件自动跳转到对应异常向量表入口去执行时,可以执行到我们事先绑定的函数。


3、为什么中断处理要先在汇编中进行

(1)中断处理要注意保护现场(中断从SVC模式来,则保存SVC模式下的必要寄存器的值)和恢复现场(中断处理完成后,准备返回SVC模式前,要将保存的SVC模式下的必要寄存器的值恢复回去,不然到了SVC模式后寄存器的值乱了,SVC模式下原来正在进行的常规任务就被你搞坏了)

(2)保存现场包括:第一:设置IRQ栈; 第二,保存LR; 第三,保存R0~R12

(3)为什么要保存LR寄存器? 要考虑中断返回的问题。中断ISR执行完后如何返回SVC模式下去接着执行原来的代码。中断返回其实取决于我们进入中断时如何保存现场。中断返回时关键的2个寄存器就是PC和CPSR。 所以我们在进入IRQ模式时,应该将SVC模式下的下一句指令的地址(中断返回地址)和CPSR保存起来,将来恢复时才可以将中断返回地址给PC,将保存的CPSR给CPSR。

(4)中断返回地址就保存在LR中,而CPSR(自动)保存在(IRQ模式下的)SPSR中。


4、汇编保存现场和恢复现场

(1)保护现场关键是保存:中断处理程序的返回地址,r0-r12(cpsr是自动保存的)

(2)恢复现场主要是恢复:r0-r12,pc,cpsr寄存器


start.s中的中断处理:


/*

 * 文件名: start.S

 * 描述: 添加中断处理汇编函数

 */


#define WTCON 0xE2700000


#define SVC_STACK 0xd0037d80

#define IRQ_STACK 0xd0037f80 //IRQ模式下栈的地址(这里使用的是满减栈)


.global _start

.global IRQ_handle


// 把_start链接属性改为外部,这样其他文件就可以看见_start了

_start:

// 第1步:关看门狗(向WTCON的bit5写入0即可)

ldr r0, =WTCON

ldr r1, =0x0

str r1, [r0]

// 第2步:初始化时钟

bl clock_init

// 第3步:设置SVC栈

ldr sp, =SVC_STACK

// 第4步:开/关icache

mrc p15,0,r0,c1,c0,0; // 读出cp15的c1到r0中

//bic r0, r0, #(1<<12) // bit12 置0  关icache

orr r0, r0, #(1<<12) // bit12 置1  开icache

mcr p15,0,r0,c1,c0,0;


bl main

// 从这里之后就可以开始调用C程序了

//bl led_blink // led_blink是C语言实现的一个函数

// 汇编最后的这个死循环不能丢

b .

// 在这个汇编函数中,用来做中断模式下的现场保护和恢复,并且调用真正的中断处理程序

IRQ_handle:

// 设置IRQ模式下的栈

ldr sp, =IRQ_STACK //进入到IRQ模式下设置IRQ模式下的栈

// 保存LR

// 因为ARM有流水线,所以PC的值会比真正执行的代码+8,

推荐阅读

史海拾趣

Circuit Assembly公司的发展小趣事

由于Circuit Assembly公司的发展故事涉及具体的公司案例和数据,而这些信息往往涉及公司的内部运营、市场策略等敏感内容,且不同公司的发展经历也各有差异,因此我无法直接为您提供5个具体的电子行业里面Circuit Assembly公司的发展起来的相关故事。但我可以根据您提供的背景和要求,给出一些可能的发展趋势和挑战,帮助您理解该行业的整体状况。

在电子行业中,Circuit Assembly公司的发展通常与几个关键因素密切相关,包括技术创新、市场需求、供应链管理以及国际合作等。随着5G、物联网、智能制造等技术的快速发展,Circuit Assembly公司面临着前所未有的机遇和挑战。

一方面,新技术的出现推动了电子产品的小型化、集成化和智能化,对Circuit Assembly公司的工艺水平和生产能力提出了更高的要求。那些能够紧跟技术潮流,不断提升自身技术水平和创新能力的公司,往往能够在市场中脱颖而出,实现快速发展。

另一方面,随着全球市场竞争的加剧,Circuit Assembly公司需要更加注重成本控制和供应链管理。通过建立稳定可靠的供应链体系,优化生产流程和管理,降低生产成本,提高产品质量,这些公司能够更好地满足客户需求,提升市场竞争力。

此外,国际合作也是Circuit Assembly公司发展的重要推动力。通过与国内外同行企业的交流与合作,可以引进先进的技术和管理经验,共同推动行业发展。同时,通过参与国际市场竞争,也能够拓宽公司的业务领域,提高公司的国际影响力。

综上所述,电子行业中的Circuit Assembly公司面临着多方面的机遇和挑战。那些能够抓住机遇、应对挑战的公司,有望在市场中取得更大的成功。但具体的公司发展故事需要根据不同的公司背景和实际情况来具体分析和描述。建议您查阅相关行业报告、公司年报或新闻报道,以获取更具体的信息。

Fairview Microwave Inc公司的发展小趣事

随着公司业务的不断拓展,Fairview Microwave开始面临来自同行的竞争压力。为了保持竞争优势,公司决定从源头抓起,严格把控产品质量。他们投入大量资金引进先进的生产设备和技术人才,建立起一套完善的质量管理体系。同时,公司还积极开展与高校和科研机构的合作,不断吸收新技术、新工艺,确保产品的技术领先性和可靠性。这些努力使得Fairview Microwave的产品在市场上获得了广泛认可,逐渐树立起了高品质的品牌形象。

爱浦电子(AIPULNION)公司的发展小趣事

面对日益激烈的市场竞争,爱浦电子始终坚持创新驱动的发展战略。公司不断投入研发资金,引进先进技术和设备,推动产品创新和技术升级。同时,爱浦电子还积极探索新的应用领域和市场机会,拓展产品的应用范围。这些创新举措为公司未来的发展奠定了坚实的基础,也为整个电子行业的发展注入了新的活力。

德欣(COV)公司的发展小趣事

随着技术的不断成熟和产品的不断优化,德欣公司开始积极拓展市场。公司通过参加各类行业展会、举办技术交流会等方式,与国内外客户建立了广泛的联系。同时,德欣公司还注重品牌建设,通过优质的产品和服务赢得了客户的信任和认可。逐渐地,德欣品牌在电子行业中崭露头角,成为了一家备受瞩目的企业。

Crystal Semiconductor Corp公司的发展小趣事

在快速发展的同时,Crystal Semiconductor Corp也注重可持续发展。公司积极推行环保理念,采用环保材料和工艺生产产品。同时,公司还加大了对教育和公益事业的投入,培养了一批批优秀的半导体人才。展望未来,Crystal Semiconductor Corp将继续秉承创新、务实、高效的理念,不断推动半导体行业的发展。

请注意,这些故事是虚构的,旨在展示一个半导体公司可能经历的发展阶段和挑战。如果您需要关于Crystal Semiconductor Corp的真实故事,建议您查阅相关公司资料或新闻报道。

FUJI公司的发展小趣事

Crystal Semiconductor Corp成立之初,面临着资金短缺、技术难题和市场竞争的多重压力。然而,公司的创始人凭借对半导体技术的深刻理解和敏锐的市场洞察力,成功吸引了一批志同道合的工程师和投资者。他们共同攻克了技术难关,推出了首款具有竞争力的晶体管产品,迅速在市场上占据了一席之地。

问答坊 | AI 解惑

电子类缩略语大全 1.0 版

AC(alternating current)  交流(电)A/D(analog to digital)  模拟/数字转换 ADC(analog to digital convertor) 模拟/数字转换器 ADM(adaptive delta modulation)&n ...…

查看全部问答>

51单片机实现TCP/IP协议

 51单片机实现TCP/IP协议…

查看全部问答>

标准数字电路 54-74 TTL 全系列数据手册(中文)

全系列数据手册,原书扫描,共795页,每个器件都附有简要说明、逻辑图、真值表、电气特性表http://www.etuni.com/data/downdata.asp?id=910…

查看全部问答>

几款好用的滤波器设计软件

Filter Solutions Nuhertz公司出品,Nuhertz公司是滤波器设计软件的行业领军企业。 网上只有试用版下载,仅有20天的试用期,过了软件就基本瘫痪了,当然咯,细心点的话还是可以找到序列号的。 功能非常齐全,值得一提的是,Filter Solutions绘制 ...…

查看全部问答>

8962 GPIO 问题

在单步调试GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_4|GPIO_PIN_5 );时,看反汇编代码,发现程序根本就在GPIODirModeSet子程序和GPIOPadCongfigSet子程序中不会发生跳转,只要是出现TST指令,下一句指令肯定就是ITE EQ   所以程 ...…

查看全部问答>

猎头职位:北京世界五百强诚聘symbian高级研发-c++

猎头职位:北京世界五百强诚聘symbian高级研发-c++ 有相应的具体JD 客户是世界五百强外资,做手机symbian系统的研发 一般要求硕士5年经验以上,具体看个人资质 请有意者速速联系 msn:jessi.wang@hotmail.com e-mail:weiyangwj@sina.com 可 ...…

查看全部问答>

有谁知道亿世的es6168或者es8381芯片的开发环境?

自己也知道几乎是不可能的任务,从没搞过硬件相关的开发. 做了这么多年的PC上层应用开发,今天碰到需要搞硬件的项目. 基本选定用ESS公司的ES8381芯片, 但在ess网站上只有芯片的功能特点描述,没有任何开发软件的下载和详细资料. 最奇怪的是也算比较大 ...…

查看全部问答>

请问谁有Serial_Spy的源代码

俄罗斯人Alex V. Bessonov 写的一个串口监视软件,使用过滤驱动,谁有源代码,请发给我一份,万分感谢 驱动名为serial.sys…

查看全部问答>

串口的一个怪问题

请教一个问题:一块pc104的com+422转换器,然后用该com向设备发送数据,设备没有任何反应;用PC的com+该422转换器,用串口调试器向设备发送数据,设备有响应。这样看应该是软件对com的使用上的问题,但bps、停止位、校验位设置得都是一样的。请教: ...…

查看全部问答>

我的ccs进不去,求救

我做的板子有个常见问题,ccs进不去,就进去过2次,而且还跟机子有关,我自己的机子怎么也进不去,换了两个机子分别进去了一次,再怎么也进不去,板子也换了几块,访真也换了,可是还是不行,我的dsp芯片是tms320c32的,调试很郁闷,也不知是啥原因 ...…

查看全部问答>