-
https://bbs.eeworld.com.cn/icview-109346-1-1.html的帖子讨论的很精彩,最后我得出的结论:串口接收不适宜用DMA做。不必在这上面再浪费时间了,只是觉得很遗憾啊。
不要以偏概全,不适合你的应用方式,并不表示不适合所有人。
-
我用的是原厂的MCBSTM32开发板,多层板的,请看和STC的波形对比吧,脉冲是800US的, 由于采样率不同,显示的宽度有所不同,如果说电源有波动,这个波动频率也太高了吧,至少500KHz,应该早被滤波电容过滤了吧。另外发现用1MHz采样时,AD输入口有30UA漏电,采样率越低,漏电越小。
wave.GIF
(6.34 KB)
下载次数:8
2010-9-30 23:26
-
谢谢!
这些倒是能理解,就是不理解为什么只有第一次电压检测不准确。我准备根据大家的建议换个小点的电阻试试看。
-
那我们换个方式,如果我想出0.5us的中断,该如何做呢?你可否拿你手里的demo板调试下,看是否能出呢
-
会不会是蓝牙耳机的问题呢?比如说蓝牙耳机按了PAUSE后,就把自己的声音给关了。建议PC上找个蓝牙适配器,装一个IVT测试一下。
-
仅是 引脚当前信号
-
多实践
-
处理IRP_MJ_WRITE不就OK 了! 你再怎么复制它到优盘都得WriteFile
1
-
单片机的基本架构、编程方式都是差不多的,学通了一种之后,其它的就容易上手了
-
整个wince系统都是32位地址啊。
数据可以有很多种类型,你读写8位的数据,就是向一个32位的地址读写一个BYTE的值。
-
这个要看手册呢 手册上写的很清楚,每条命令是什么意思
至于原理嘛 也就是加一些命令 然后在相应的地址上写入数据,在LCD上显示
-
楼主可以参考下面的代码:
//======================================================================
// 文件名称: main.asm
// 功能描述: 通过音频通道输入,同时通过DAC1、DAC2输出
// 采样率为8KHz
// 维护记录: 2005-09-12 v1.0
//======================================================================
.DEFINE P_TimerA_Data 0x700A
.DEFINE P_TimerA_Ctrl 0x700B
.DEFINE P_ADC 0x7014
.DEFINE P_ADC_Ctrl 0x7015
.DEFINE P_DAC2 0x7016
.DEFINE P_DAC1 0x7017
.DEFINE P_DAC_Ctrl 0x702A
.DEFINE P_INT_Ctrl 0x7010
.DEFINE P_INT_Clear 0x7011
.DEFINE P_Watchdog_Clear 0x7012
.DEFINE C_Fosc_2 0x0000
.DEFINE C_B1 0x0030
.DEFINE C_TIMERA_8KHZ (0xffff-0x600)
.RAM
.CODE
//==========================================================================
// 汇编格式: _main
// C格式: int main(void);
// 实现功能: 通过音频通道输入,同时通过DAC1、DAC2输出
// 采样率为8KHz
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器:r1,r2
//==========================================================================
.PUBLIC _main
_main:
int off
r1 = C_Fosc_2 | C_B1
[P_TimerA_Ctrl] = r1
r1 = C_TIMERA_8KHZ //设置定时器计数初值
[P_TimerA_Data] = r1
r1 = 0x0005 //使能自动增益AGC、MIC、ADC
[P_ADC_Ctrl] = r1
r1 = 0x00a8 //通过定时器A的溢出锁存数据,ADC为自动方式
[P_DAC_Ctrl] = r1
r1 = 0x1000
[P_INT_Ctrl] = r1 //允许IRQ1中断
int irq //开IRQ总中断,关FIQ中断
?Loop:
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
jmp ?Loop
.TEXT
.PUBLIC _IRQ1
_IRQ1:
push r1,r5 to [sp]
r1 = [P_ADC] //取MIC输入并转换后数据
[P_DAC1] = r1 //把输入数据送到DAC1和DAC2输出播放
[P_DAC2] = r1
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
r1 = 0x1000
[P_INT_Clear] = r1 //清IRQ1中断标志
pop r1,r5 from [sp]
reti复制代码
关键看下思路,有注释,好好看下,应该能懂,虽然是ASM
-
ding
-
我现在的实际问题是这样的:
数年以来,我已经用汇编语言设计出了一个相当规模的完整的实际应用的系统,并且与被控制设备本身的研制工作同步,该软件已经经过了长时间的不断调试、改进、升级,以及详细的测试。
该软件将来的继续维护工作,将会一直持续到该设备被淘汰为止,显然不可以仅靠我一个人,必须培训出一批可以接手的青年程序员来。
但是接受了消化本系统任务的青年程序员中,存在不少畏难情绪。虽然我的说明资料已经尽可能写得详细易懂,而且还进行过多次的讲解,但仅仅一句“汇编语言太难学”这一条,就成了一个“学不会”借口。
所以,我打算花时间把这个系统改写成一个C语言的版本,作为他们消化理解原系统的一个参考资料。或许会有些助益。
当然,改编后的C语言版本,因为其效率、性能的差异,响应的准时性、调节的精度、资源的安全裕度等都不如原汇编版本,而且它也没有经过充分测试。
所以,改编版本不打算实际交付使用,只提供给他们作为“学习参考资料”。
因此,这个版本最好尽量采用C语言的常规形式。前面说的汇编扩充,显然不是个理想的办法。
-
你用的是HIVE-BASE的注册表吗?
-
我觉得这段还是有点问题:
一,“编译器的双字对齐在处理器级别依然是字对齐,因为双字地址必然是一个字地址。”这句话是不对的,v5以及v5以前版本的ARM,在双字访问的指令(STRD/LDRD)中,地址必须是双字对齐的,否 ...
被你越搞越乱,我只能说个人理解角度不同
-
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s103k.h"
void delay(unsigned char b)
{
unsigned char i;
for(i=0;i<b;i++)
{
}
}
unsigned int save1;
unsigned int back[8];
unsigned int savetime2;
//unsigned int savetime2back;
unsigned int savemiddle;
unsigned char keytime;
unsigned char keynottime;
unsigned char keyvalue;
main()
{
unsigned char i;
//PD_DDR = 0xFF;//the PD set is input
//PD_CR1 = 0xFF;//the PULL resist is not use
//PD_ODR = 0xFF;
//PF_DDR = 0xFF;
//PF_CR1 = 0xFF;
//PF_ODR = 0xFF;
TIM2_CNTRL = 0x00;
TIM2_CNTRH = 0x00;
//TIM2_CR1 = 0x01;
PF_ODR = 0xFF;
PF_CR1 = 0xFF;
PF_DDR = 0xFF;
PC_ODR = 0xFF;
PC_CR1 = 0xFF;
PC_DDR = 0xFF;
PB_ODR = 0xFF;
PB_CR1 = 0xFF;
PB_DDR = 0xFF;
for(i=0;i<8;i++)
{
PF_ODR = 0xFF;
PF_CR1 = 0xFF;
PF_DDR = 0xFF;
PC_ODR = 0xFF;
PC_CR1 = 0xFF;
PC_DDR = 0xFF;
TIM2_CNTRL = 0x00;
TIM2_CNTRH = 0x00;
PC_ODR = 0x00;
PC_CR1 = 0x00;//不上拉输出
PC_DDR = 0x00;
TIM2_CR1 = 0x01;
for(;;)
{
if(PC_IDR & (1<<5)) //1<<6 is *8 //1<<5 is *9
break;
}
TIM2_CR1 = 0x00;
save1 = (unsigned int)(TIM2_CNTRH<<8);
save1 += (unsigned int)TIM2_CNTRL;
TIM2_CNTRL = 0x00;
TIM2_CNTRH = 0x00;
PC_ODR = 0xFF;
PC_CR1 = 0xFF;
PC_DDR = 0xFF;
PF_ODR = 0x00;
PF_CR1 = 0xFF;
PF_DDR = 0xFF;
PC_CR1 = 0x00;
PC_DDR = 0x00;
TIM2_CR1 = 0x01;
for(;;)
{
if(!(PC_IDR & (1<<5))) //1<<6 is *8 //1<<5 is *9
break;
}
TIM2_CR1 = 0x00;
savetime2 = (unsigned int)(TIM2_CNTRH<<8);
savetime2 += (unsigned int)(TIM2_CNTRL);
if(i>0)
{
back = save1+savetime2;
}
}
for(i=1;i<8;i++)
{
if(back == back[i+1])
{
keynottime++;
}
else
{
if((back- 35)>10)
keytime++;
}
}
while(1);
}
-
atmel官方网站
-
我和楼主一样...期待.....
-
引用 40 楼 codewarrior 的回复:
引用 39 楼 gooogleman 的回复:
引用 38 楼 xumercury 的回复:
我现在看了一家北京的。下周三去他们公司看看。他们板子没有留GPIO口出来。留了GPIO口的竟然要1W RMB.。。。。先去看看。好的话买块小板调试下Can总线的东西。Devkit的弄Linux的去算了。我怀疑是他们没花心思在wince上面。linux的弄的比较多。
嘿嘿,我前两天联系PXA310代理要开发板居然要$5000啊,一般公司怎么买得起啊。嘿嘿。
mainstone?
http://www.realtimedsp.com.cn/plan/
这个。。。。额。。。。自称很好。