本帖最后由 cepoly 于 2018-5-31 14:10 编辑
基于原子UART1DMA例程上修改UART2_DMA发送
int main(void)
{
u16 i;
u8 t=0;
u8 j,mask=0;
float pro=0; //进度
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
uart2_init(115200);
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
MYDMA_Config(DMA1_Stream6,DMA_CHANNEL_4);//初始化DMA
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");
LCD_ShowString(30,70,200,16,16,"DMA TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2016/1/24");
LCD_ShowString(30,130,200,16,16,"KEY0:Start");
POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
//显示提示信息
j=sizeof(TEXT_TO_SEND);
for(i=0;i<SEND_BUF_SIZE;i++)//填充ASCII字符集数据
{
if(t>=j)//加入换行符
{
if(mask)
{
SendBuff=0x0a;
t=0;
}else
{
SendBuff=0x0d;
mask++;
}
}else//复制TEXT_TO_SEND语句
{
mask=0;
SendBuff=TEXT_TO_SEND[t];
t++;
}
}
POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
i=0;
while(1)
{
t=KEY_Scan(0);
if(t==KEY0_PRES) //KEY0按下
{
printf("
DMA DATA:
");
LCD_ShowString(30,150,200,16,16,"Start Transimit....");
LCD_ShowString(30,170,200,16,16," %") ; //显示百分号
MYDMA_USART_Transmit(&UART2_Handler,(u8*)SendBuff,SEND_BUF_SIZE); //启动传输
// HAL_UART_Transmit_DMA(&UART1_Handler,SendBuff,SEND_BUF_SIZE);
//使能串口1的DMA发送 //等待DMA传输完成,此时我们来做另外一些事,点灯
//实际应用中,传输数据期间,可以执行另外的任务
while(1)
{
if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6))//等待DMA1_Steam6传输完成
{
__HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6传输完成标志
HAL_UART_DMAStop(&UART2_Handler); //传输完成以后关闭串口DMA
break;
}
pro=__HAL_DMA_GET_COUNTER(&UART2TxDMA_Handler);//得到当前还剩余多少个数据
pro=1-pro/SEND_BUF_SIZE; //得到百分比
pro*=100; //扩大100倍
LCD_ShowNum(30,170,pro,3,16);
}
LCD_ShowNum(30,170,100,3,16);//显示100%
LCD_ShowString(30,150,200,16,16,"Transimit Finished!");//提示传送完成
}
i++;
delay_ms(10);
if(i==20)
{
LED0=!LED0;//提示系统正在运行
i=0;
}
}
}
红 {MOD}部分代码,我用发送完成中断回调函数来清除DMA1_Steam6传输完成标志及传输完成以后关闭串口DMA
在stm32f4xx_it.c文件中加入
extern DMA_HandleTypeDef UART2TxDMA_Handler; //DMA句柄
void DMA1_Stream6_IRQHandler(void)
{
HAL_DMA_IRQHandler(&UART2TxDMA_Handler);
}
在DMA初始化中加入
HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 3, 3);
HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart == &UART2_Handler)
{
if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6))//等待DMA1_Steam6传输完成
{
__HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6传输完成标志
HAL_UART_DMAStop(&UART2_Handler); //传输完成以后关闭串口DMA
}
}
}
接下来做一个DMA接收,待续
一周热门 更多>