uarts.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. 本代码基于STM32F030F4P6,用例为DMA控制串口发送,需要注意以下几点
  3. 1、注意串口IO配置,包括IO配置和复用功能选择
  4. 2、STM32F030系列的DMA不支持外设到外设,STM32F030只有DMA1,没有DMA2
  5. 3、注意不同外设对应不同DMA通道,而且不同芯片的通道也不一定相同,注意看数据手册
  6. 直接代码如下:
  7. */
  8. //#include "stm32_lib/inc/stm32f0xx_rcc.h"
  9. //#include "stm32_lib/inc/stm32f0xx_gpio.h"
  10. //#include "stm32_lib/inc/stm32f0xx_usart.h"
  11. //#include "stm32_lib/inc/stm32f0xx_dma.h"
  12. #include "uarts.h"
  13. //以下两种地址写法都可以
  14. #define USART1_TDR_Address ((uint32_t)(USART1_BASE+0x28))
  15. //#define USART1_TDR_Address (uint32_t)(&USART1->TDR)
  16. unsigned char hellStr[] = {'H', 'E', 'L', 'L', 'O'};
  17. void RCC_Config ( void );
  18. void GPIO_Config ( void );
  19. void USART_Config ( void );
  20. void DMA_Config ( void );
  21. int main ( void )
  22. {
  23. SystemInit();
  24. RCC_Config();
  25. GPIO_Config();
  26. USART_Config();
  27. DMA_Config();
  28. //使能DMA通道2,意味着开始传输
  29. DMA_Cmd ( DMA1_Channel2, ENABLE );
  30. while ( 1 )
  31. {
  32. }
  33. }
  34. void RCC_Config ( void )
  35. {
  36. //时钟配置
  37. RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_GPIOA, ENABLE );
  38. RCC_APB2PeriphClockCmd ( RCC_APB2Periph_USART1, ENABLE );
  39. RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1, ENABLE );
  40. }
  41. void GPIO_Config ( void )
  42. {
  43. //选择引脚
  44. //针对F030F4P6,TX有PA2和PA9可选,RX有PA3和PA10可选,特别注意查看文档是AF多少
  45. //GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
  46. //GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
  47. GPIO_PinAFConfig ( GPIOA, GPIO_PinSource9, GPIO_AF_1 );
  48. GPIO_PinAFConfig ( GPIOA, GPIO_PinSource10, GPIO_AF_1 );
  49. //引脚设置
  50. GPIO_InitTypeDef PORT_UART1_TX; //定义TX脚,PORT_UART1_TX是自定义名称,可以任意
  51. PORT_UART1_TX.GPIO_Pin = GPIO_Pin_9; //此参数根据上面选择的引脚来定
  52. PORT_UART1_TX.GPIO_Speed = GPIO_Speed_10MHz;
  53. PORT_UART1_TX.GPIO_Mode = GPIO_Mode_AF;
  54. PORT_UART1_TX.GPIO_PuPd = GPIO_PuPd_NOPULL;
  55. //IO初始化
  56. GPIO_Init ( GPIOA, &PORT_UART1_TX );
  57. GPIO_InitTypeDef PORT_UART1_RX; //定义RX脚
  58. PORT_UART1_RX.GPIO_Pin = GPIO_Pin_10; //此参数根据上面选择的引脚来定
  59. PORT_UART1_RX.GPIO_Speed = GPIO_Speed_10MHz;
  60. PORT_UART1_RX.GPIO_Mode = GPIO_Mode_AF;
  61. PORT_UART1_RX.GPIO_PuPd = GPIO_PuPd_NOPULL;
  62. GPIO_Init ( GPIOA, &PORT_UART1_RX );
  63. }
  64. void USART_Config ( void )
  65. {
  66. //串口参数配置
  67. USART_InitTypeDef USART_InitStructure;
  68. USART_InitStructure.USART_BaudRate = 115200; //设置波特率
  69. USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置数据长度
  70. USART_InitStructure.USART_Parity = USART_Parity_No; //设置奇偶校验
  71. USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位
  72. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置流控制
  73. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //设置模式
  74. USART_Init ( USART1, &USART_InitStructure );
  75. //使能DMA发送
  76. USART_DMACmd ( USART1, USART_DMAReq_Tx, ENABLE ); //串口1发射 DMA使能
  77. //使能
  78. USART_Cmd ( USART1, ENABLE );
  79. }
  80. void DMA_Config ( void )
  81. {
  82. //特别注意,对于STM32F030F4P6,USART1_TX对应通道2,注意看数据手册
  83. DMA_DeInit ( DMA1_Channel2 );
  84. DMA_InitTypeDef DMA_InitStructure;
  85. DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_TDR_Address;
  86. DMA_InitStructure.DMA_MemoryBaseAddr = ( uint32_t ) hellStr;
  87. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  88. DMA_InitStructure.DMA_BufferSize = 5;
  89. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  90. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  91. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  92. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  93. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  94. DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  95. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  96. DMA_Init ( DMA1_Channel2, &DMA_InitStructure );
  97. }