金牌会员
 
- 积分
- 1065
- 金钱
- 1065
- 注册时间
- 2018-3-27
- 在线时间
- 378 小时
|
5金钱
程序要完成功能是:串口一配合DMA接收不定长数据,并通过串口二发出到电脑上显示
这是我大致写的程序,程序测试可以进入串口一中断,但是串口助手没有接收到数据
void Usart1_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
//开时钟总线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//复位串口一
USART_DeInit(USART1);
// GPIOÅ配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9 TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//串口一配置
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
// 配置串口一NVIC
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_DeInit(DMA1_Channel5); //复位DMA1的通道5,和串口一的Rx对应
//DMA1通道5的配置
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_DMA_Rxbuf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 128;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5,&DMA_InitStructure);
DMA_ITConfig(DMA1_Channel5,DMA_IT_TE,ENABLE);
DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA1_Channel5,ENABLE);
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //开串口空闲中断
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); //串口一DMA接收使能
USART_Cmd(USART1, ENABLE); //′®¿ú3ê1Äü
USART_ClearFlag(USART1, USART_FLAG_TC); //清接收完成标志
}
//串口一中断函数
void USART1_IRQHandler(void)
{
u8 i = 0;
LED2_OFF; //关闭LED2
if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET)
{
LED1_OFF;
i = USART1->SR;
i = USART1->DR; //清USART_IT_IDLE标志
//USART_ClearFlag(USART1,USART_IT_IDLE);
DMA_Cmd(DMA1_Channel5, DISABLE); //关闭DMA
i = 128-DMA_GetCurrDataCounter(DMA1_Channel5); //得到真正接收数据个数
USART1_DMA_Rxbuf[i] = '\0';
Uaer1_Rxflag = 1; //串口一接收完成标志位置一
DMA1_Channel5->CNDTR = 128; //重新设置接收数据个数
DMA_Cmd(DMA1_Channel5, ENABLE);//打开DMA
}
}
//主函数
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
Usart2_init(2400);
Usart1_Init(9600);
LED1_ON;LED2_ON;
while(1)
{
if(Uaer1_Rxflag == 1)
{
//LED1_ON;
Uaer1_Rxflag = 0;
USART2_Printf(USART1_DMA_Rxbuf); //串口二发送串口一DMA接收缓存数据
}
}
}
请问配置了串口一的DMA接收,串口一有数据过来就会存放到DMA接收缓存数组中吗?不用读USARTx->DR。
还有我程序这样有错误吗?刚学串口DMA,请多多指教
|
最佳答案
查看完整内容[请看2#楼]
你把刚才发的贴http://www.openedv.com/thread-273874-1-1.html
中的while(1)改成下面就可以了,就是串口1收,串口2转发出去
while(1)
{
if(USART1_RX_STA&0x8000)
{
USART2_printf("USART1_RX_BUF=%s",USART1_RX_BUF);
//printf("USART1_RX_BUF=%s",USART1_RX_BUF);//串口1可用printf 在sys里面设置,但是printf非dma发送 ...
|