[mw_shl_code=c,true]void DMA_uart2_init(void)
{
RCC->AHBENR |= 1; //使能DMA时钟
/*DMA1CHANNEL7 INIT for USART2-TXD */
DMA1_Channel7->CCR |= 1<<1;//允许传输完成中断
DMA1_Channel7->CCR |= 1<<4;//从存储器读
DMA1_Channel7->CCR |= 1<<5;//循环操作
DMA1_Channel7->CCR |= 1<<7;//存储器地址增量
DMA1_Channel7->CCR |= 2<<12;//优先级别为高
DMA1_Channel7->CNDTR = 15;//传输数据长度
DMA1_Channel7->CPAR = (unsigned int)&(USART2->DR);//传输数据外设地址
DMA1_Channel7->CMAR = (unsigned int)(uart2.DMA_txBuffer);//传输数据存储器地址
MY_NVIC_Init(2,2,DMA1_Channel7_IRQChannel,2);//组2,最低优先级
DMA1_Channel6->CCR |= 1<<7;//存储器地址增量
DMA1_Channel6->CCR |= 1<<5;//循环操作
DMA1_Channel6->CCR |= 3<<12;//优先级别为高
DMA1_Channel6->CNDTR = UART_BUFFER_LENGTH;//传输数据长度
DMA1_Channel6->CPAR = (unsigned int)&(USART2->DR);//传输数据外设地址
DMA1_Channel6->CMAR = (unsigned int)(uart2.DMA_rxBuffer);//传输数据存储器地址
DMA1CHANNEL6_ENABLE;
}
unsigned short get_DMA1ch6_reclen(void)
{
return UART_BUFFER_LENGTH - DMA1_Channel6->CNDTR;
}
/*获取通道7数据发送剩余长度*/
unsigned short get_DMA1ch7_remlen(void)
{
return DMA1_Channel7->CNDTR;
}
void uart2_init_230400(void)
{
u32 pclk1;
u32 bound;
float temp;
u16 mantissa;
u16 fraction;
pclk1=36;
bound=230400;
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
GPIOA->CRL&=0XFFFF00FF; //IO状态设置
GPIOA->CRL|=0X00008B00; //IO状态设置
RCC->APB1ENR|=1<<17; //使能串口2时钟
RCC->APB1RSTR|=1<<17; //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位
//波特率设置
USART2->BRR=mantissa; // 波特率设置
USART2->CR1|=0X200C;
//使能空闲中断
USART2->CR1|=1<<4;
USART2->CR3 |= (3<<6); //使能串口DMA功能
MY_NVIC_Init(3,4,USART2_IRQChannel,2);//组2,最低优先级
DMA_uart2_init();
}
void USART2_IRQHandler(void)
{ //DMA
unsigned char *tempPtr;
unsigned short templen;
if(USART2->SR&(1<<4))//空闲中断
{
uart2Tmp = USART2->SR;
uart2Tmp = USART2->DR;
templen = get_DMA1ch6_reclen();
tempPtr = uart2.DMA_rxBuffer;
DMA1CHANNEL6_DISABLE;
DMA1->IFCR |= 7<<20;//清除DMA1通道6全局中断标志
DMA1_Channel6->CNDTR = UART_BUFFER_LENGTH;//接收数据长度
while(templen--)
{
uart2.rcBuffer++ = *tempPtr++;
DMA1CHANNEL6_ENABLE;
}
}
}
void DMAChannel7_IRQHandler(void)
{
DMA1->IFCR |= 7<<24; //清除DMA1通道7全局中断标志
}[/mw_shl_code]
|