这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » USART中断接收

共20条 1/2 1 2 跳转至

USART中断接收

助工
2012-06-25 12:35:35     打赏
RT
如何实现USART中断接收字符串?



关键词: USART     中断     接收    

院士
2012-06-25 12:41:36     打赏
2楼
配置相关引脚,
配置相关串口
配置中断方式
开启中断

工程师
2012-06-25 14:26:58     打赏
3楼
哥们的回答真是言简意赅啊,哈哈

工程师
2012-06-25 14:27:41     打赏
4楼

我再补充下,还有编写中断服务函数


助工
2012-06-25 15:12:02     打赏
5楼
这些都做了~也用了数组存放接收数据

不知道问题出在哪里~

工程师
2012-06-25 15:18:09     打赏
6楼
关键代码贴出来,我帮你看看

助工
2012-06-25 15:18:48     打赏
7楼
串口发送字符串

而通过中断接收,接收到的只有第一个字符?
接收只有第一个字符而已?不知道什么情况!

助工
2012-06-25 15:41:10     打赏
8楼

//中断代码
void USART1_IRQHandler(void)
{
 static u8 i=0;

 delay(0xfffff);
 //中断接收数据
 if(i%2)
 {
  GPIO_SetBits(GPIOE, GPIO_Pin_4);
 }
 else
 {
  GPIO_ResetBits(GPIOE, GPIO_Pin_4);
 }
 i++;


 //接收数据 
 ch[count] = USART1_Getchar();
 //USART1_Putchar(ch[count]);
 count ++;

 if(ch[count] == 0)
 {
  flag = SET;
  USART_ClearITPendingBit(USART1, USART_IT_ORE);
 }

 //停止中断
 if(count > 50)
 {
  //flag = SET;
  USART_ClearITPendingBit(USART1, USART_IT_ORE);
  //USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
  count = 0;  
 }
 

 //
}
//各种配置
void USART_Configure()
{
 USART_InitTypeDef USART_InitStruct;
 USART_ClockInitTypeDef USART_ClockInitStruct;
 GPIO_InitTypeDef GPIO_InitStruct;

 USART_InitStruct.USART_BaudRate = 9600;
 USART_InitStruct.USART_StopBits = USART_StopBits_1;
 USART_InitStruct.USART_Parity = USART_Parity_No;
 USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 USART_Init(USART1, &USART_InitStruct);

 USART_ClockInitStruct.USART_Clock = USART_Clock_Disable;
 USART_ClockInitStruct.USART_CPOL = USART_CPOL_High;
 USART_ClockInitStruct.USART_CPHA = USART_CPHA_1Edge;
 USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable;
 USART_ClockInit(USART1, &USART_ClockInitStruct);
 
 //使能USART1
 USART_Cmd(USART1, ENABLE);

 //使能接收中断中断
 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 //使能DMA发送
 USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

 DMA_Cmd(DMA1_Channel4, ENABLE);


 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_Init(GPIOA, &GPIO_InitStruct);

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

 GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void NVIC_Configure()
{
 NVIC_InitTypeDef NVIC_InitStruct;

    //NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  

 NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

 NVIC_Init(&NVIC_InitStruct);
}

void DMA_Configure()
{
 DMA_InitTypeDef DMA_InitStruct;

 DMA_InitStruct.DMA_PeripheralBaseAddr = tUSART1_DR_Base;
 DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)ch;
 DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;
 DMA_InitStruct.DMA_BufferSize = sizeof(ch) / sizeof(ch[0]);
 DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
 DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
 DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
 DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
 DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
 DMA_InitStruct.DMA_Priority = DMA_Priority_VeryHigh;
 DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;

 DMA_Init(DMA1_Channel4, &DMA_InitStruct);
}


专家
2012-06-25 15:41:12     打赏
9楼
你怎么知道你就能接受一个字符?如果是这样的话那就是你的程序有问题,你何不把代码贴出来呢?》

助工
2012-06-25 15:43:24     打赏
10楼
因为我有测试过
在发送一串字符后,进入中断,在中断接收,直接就在发送到串口上,串口只收到了第一个字符,其他字符没有收到!

共20条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]