[mw_shl_code=c,true]void MYDMA_Config( DMA_Channel_TypeDef *DMA_CHx,u32 paddr)
{
RCC->AHBENR |= 1<<0; //开启DMA1时钟
delay_ms(5); //等待DMA时钟稳定
DMA_CHx->CCR = 0X00000000; //复位
DMA_CHx->CCR |= 1<<1; //传输完成中断
DMA_CHx->CCR |= 1<<4; //从存储器读
DMA_CHx->CCR |= 0<<5; //普通模式
DMA_CHx->CCR |= 0<<6; //外设地址非增量模式
DMA_CHx->CCR |= 1<<7; //存储器增量模式
DMA_CHx->CCR |= 0<<8; //外设数据宽度为8位
DMA_CHx->CCR |= 0<<10; //存储器数据宽度8位
DMA_CHx->CCR |= 1<<12; //中等优先级
DMA_CHx->CCR |= 0<<14; //非存储器到存储器模式
DMA_CHx->CPAR = paddr; //DMA1 外设地址
DMA_CHx->CCR |= 1<<1; //USART DMA传输完成中断
//DMA
}
void USART2_Init(u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp = ( (float)(36*1000000) ) / (bound*16);//得到USARTDIV
mantissa = temp; //得到整数部分
fraction = (temp-mantissa)*16; //得到小数部分
mantissa <<= 4;
mantissa += fraction;
RCC->APB2ENR |= 1<<2; //使能PORTA口时钟
GPIOA->CRL &= 0XFFFF000F; //IO状态设置
GPIOA->CRL |= 0X00008B30; //IO状态设置
RCC->APB1ENR |= 1<<17; //使能串口时钟
RCC->APB1RSTR |= 1<<17; //复位串口3
RCC->APB1RSTR &= ~(1<<17);//停止复位
USART2->BRR = mantissa; // 波特率设置
USART2->CR1 |= 0X340C; //1位停止
USART2->CR1 |= 1<<8; //PE中断使能
USART2->CR1 |= 1<<5; //接收缓冲区非空中断使能
USART2->CR3 |= 1<<7; // DMA
MY_NVIC_Init(2,3,USART2_IRQChannel,2);//组2,最低优先级
USART2_TX_EN = 0;//默认为接收模式
}
void USART2_DMATransmit(u8 *mbdata,u8 mblen)
{
USART2_TX_EN = 1; //设置为发送模式
DMA1_Channel7->CCR &= ~(1<<0); //
DMA1_Channel7->CMAR = (u32)mbdata; //
DMA1_Channel7->CNDTR = mblen;
DMA1_Channel7->CCR |= 1<<0;
}
void DMA1_Channel7_IRQHandler(void)
{
if(DMA1->ISR&0X02000000)
{
USART2_TX_EN = 0;
USARTPARA.USART_RX_CNT[2] = 0;
}
DMA1->IFCR|=1<<25;//清发送完成中断标志位
}[/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true]以上是配置,下面是发送函数。当我使用DMA时串口监视发现并没有加上CRC,如果测试ex[2]的数据则不能接收到任何数据。发送函数如果使用原子的串口发送函数(非DMA)则有CRC。因此感觉是DMA原因,请大家帮帮忙
void Modbus_SendFrame(u8*data,u8 datalen,void(*Trans)(u8*data,u8 datalen))
{
u16 crc16 = 0xFFFF;
u8 ex[2]={0,0};
crc16 = CRC16Calculation(data,datalen);
data[datalen] = (u8)(crc16 & 0x00ff);
ex[0]=data[datalen];
datalen++;
data[datalen] = (u8)(crc16>>8);
datalen++;
ex[1]=data[datalen];
Trans(data,datalen);
}[/mw_shl_code]
以上是配置,下面是发送函数。当我使用DMA时串口监视发现并没有加上CRC,如果测试ex[2]的数据则不能接收到任何数据。发送函数如果使用原子的串口发送函数(非DMA)则有CRC。因此感觉是DMA原因,请大家帮帮忙
|