博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32的串口采用DMA方式发送数据测试
阅读量:4110 次
发布时间:2019-05-25

本文共 3867 字,大约阅读时间需要 12 分钟。

文博客链接:,作者:jdh,转载请注明.

环境:

主机:WIN7

开发环境:MDK4.23

MCU:STM32F103CBT6

源代码:

配置:

[cpp] 
  1. //---------------------串口功能配置---------------------  
  2. //打开串口对应的外设时钟    
  3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);     
  4. //启动DMA时钟  
  5. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  
  6. //DMA发送中断设置  
  7. NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;  
  8. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  
  9. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
  10. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  11. NVIC_Init(&NVIC_InitStructure);  
  12. //DMA1通道4配置  
  13. DMA_DeInit(DMA1_Channel4);  
  14. //外设地址  
  15. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);  
  16. //内存地址  
  17. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Send_Buffer;  
  18. //dma传输方向单向  
  19. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  
  20. //设置DMA在传输时缓冲区的长度  
  21. DMA_InitStructure.DMA_BufferSize = 100;  
  22. //设置DMA的外设递增模式,一个外设  
  23. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
  24. //设置DMA的内存递增模式  
  25. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
  26. //外设数据字长  
  27. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  
  28. //内存数据字长  
  29. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;  
  30. //设置DMA的传输模式  
  31. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
  32. //设置DMA的优先级别  
  33. DMA_InitStructure.DMA_Priority = DMA_Priority_High;  
  34. //设置DMA的2个memory中的变量互相访问  
  35. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  
  36. DMA_Init(DMA1_Channel4,&DMA_InitStructure);  
  37. DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);  
  38.   
  39. //使能通道4  
  40. //DMA_Cmd(DMA1_Channel4, ENABLE);  
  41.   
  42.     
  43. //初始化参数    
  44. //USART_InitStructure.USART_BaudRate = DEFAULT_BAUD;    
  45. USART_InitStructure.USART_WordLength = USART_WordLength_8b;    
  46. USART_InitStructure.USART_StopBits = USART_StopBits_1;    
  47. USART_InitStructure.USART_Parity = USART_Parity_No;    
  48. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    
  49. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;      
  50. USART_InitStructure.USART_BaudRate = DEFAULT_BAUD;   
  51. //初始化串口   
  52. USART_Init(USART1,&USART_InitStructure);    
  53. //TXE发送中断,TC传输完成中断,RXNE接收中断,PE奇偶错误中断,可以是多个     
  54. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    
  55.   
  56. //配置UART1中断    
  57. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);  
  58. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;               //通道设置为串口1中断    
  59. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;       //中断占先等级0    
  60. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;              //中断响应优先级0    
  61. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //打开中断    
  62. NVIC_Init(&NVIC_InitStructure);                                 //初始化    
  63.   
  64. //采用DMA方式发送  
  65. USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  
  66. //启动串口    
  67. USART_Cmd(USART1, ENABLE);     
  68.   
  69. //设置IO口时钟        
  70. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);      
  71. //串口1的管脚初始化      
  72. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                       //管脚9    
  73. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                //选择GPIO响应速度    
  74. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 //复用推挽输出    
  75. GPIO_Init(GPIOA, &GPIO_InitStructure);                          //TX初始化    
  76. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                      //管脚10    
  77. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                //选择GPIO响应速度    
  78. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;           //浮空输入    
  79. GPIO_Init(GPIOA, &GPIO_InitStructure);                          //RX初始化                                                        
  80.   
  81. //设置IO口时钟        
  82. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);     
  83. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                       //管脚9    
  84. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                //选择GPIO响应速度    
  85. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 //复用推挽输出    

中断函数:

[cpp] 
  1. //串口1DMA方式发送中断  
  2. void DMA1_Channel4_IRQHandler(void)  
  3. {  
  4.     //清除标志位  
  5.     DMA_ClearFlag(DMA1_FLAG_TC4);  
  6.     //DMA_ClearITPendingBit(DMA1_FLAG_TC4);  
  7.     //DMA1->IFCR |= DMA1_FLAG_TC4;  
  8.     //关闭DMA  
  9.     DMA_Cmd(DMA1_Channel4,DISABLE);  
  10.     //DMA1_Channel4->CCR &= ~(1<<0);  
  11.   
  12.     //允许再次发送  
  13.     Flag_Uart_Send = 0;  
  14. }  

发送测试:

[cpp] 
  1. //串口DMA发送测试  
  2. Uart_Send_Buffer[0] = 1;  
  3. Uart_Send_Buffer[1] = 2;  
  4. Uart_Send_Buffer[2] = 3;  
  5. Uart_Send_Buffer[3] = 4;  
  6. Uart_Send_Buffer[4] = 5;  
  7. i = 1;  
  8. while (1)  
  9. {  
  10.     //检查串口是否可以发送  
  11.     while (Flag_Uart_Send);  
  12.     Flag_Uart_Send = 1;  
  13.     //设置传输数据长度  
  14.     DMA_SetCurrDataCounter(DMA1_Channel4,i);  
  15.     //打开DMA  
  16.     DMA_Cmd(DMA1_Channel4,ENABLE);  
  17.     i++;  
  18.     if (i > 5)  
  19.     {  
  20.         i = 1;  
  21.     }  
  22. }  
你可能感兴趣的文章
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>