中级会员
 
- 积分
- 358
- 金钱
- 358
- 注册时间
- 2015-11-4
- 在线时间
- 124 小时
|
10金钱
由于自己学得还不够深,应用得不够多,所有有些问题遇到了不知道怎么去理解,先说说我想问的问题吧,麻烦各路好友知道的告知一下,深表感谢:
1:ADC初始化那里有个可以设置为软件触发模式,假如我设置为定时器中断触发。是不是在定时器中断函数里运行一次ADC_GetValue()就可以了;
例:
void timeIRQ ()
{......
ADC_GetValue();
.........}
我也在论坛说下了某个人的工程,可是看到他工程里面没有定时中断函数这部分,可他也是写着用到了定时中断,AD采样。
请问:具体的是怎么回事,是两者都对吗还是其中一个才是正确的。
2:我想问问USART_SendData()和DMA发送数据有什么区别,我只知道是在时间上,可能DMA的比串口的快。
现在自己在弄一个传数据的东西,在定时器中断里每中断一次采样一次AD(采样率为1200),采样够100次就靠串口发送出去,可是现在我发现这样做,串口把数据发送完所需要的时间比采样率的时间长得多,所以那个数据会产生丢失,这个要怎么弄能够把时间的补上使数据不会丢失:
我现在的实现发现如下
void TIM3_IRQHandler(void){
int i;//待发送数据个数
int sum1=50;
int n1=10;
if(TIM3->SR&0X0001)//Overflow
{
if(num<sum1)
{
adcbuff[num]=Get_Adc(ADC_CH1);
num++;
num2++;
}
//收集满了,开始发送数据
if(num2==sum1)
{
USART_SendData(USART1,0x0d); //发送
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
USART_SendData(USART1,sum1*2); //发送
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
for(i=0;i<sum1;i++)
{
USART_SendData(USART1,(adcbuff)&0xFF); //发送低8位
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
USART_SendData(USART1,(adcbuff)>>8); //发送高8位
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
}
USART_SendData(USART1,0x20); //发送CRC
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
USART_SendData(USART1,0x41); //发送
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
num2=0;
num=0;
}
}
TIM3->SR&=~(1<<0);//Clear the interrupt flag
}
补充个问题,我的num,num2定义了全局变量,我弄过把num去掉,可是去掉后输出的数据完全错了,是不是我的逻辑存在问题
|
最佳答案
查看完整内容[请看2#楼]
1,你的方法是在定时器里面读取ADC。网友那个估计是用定时器触发ADC转换。不一样概念哦
2,USART_SendData是单个字符发送。DMA则可以一次性发送一批的数据。DMA可以释放CPU,提高效率。
|