[其他ST产品] STM32F103C8T6 串口1 串口2 串口3 标准库 DMA

[复制链接]
2962|20
 楼主| 高级安全大使 发表于 2021-9-30 23:29 | 显示全部楼层 |阅读模式
 楼主| 高级安全大使 发表于 2021-9-30 23:30 | 显示全部楼层
 楼主| 高级安全大使 发表于 2021-9-30 23:43 | 显示全部楼层
 楼主| 高级安全大使 发表于 2021-9-30 23:44 | 显示全部楼层
 楼主| 高级安全大使 发表于 2021-9-30 23:46 | 显示全部楼层
 楼主| 高级安全大使 发表于 2021-9-30 23:47 | 显示全部楼层
 楼主| 高级安全大使 发表于 2021-9-30 23:47 | 显示全部楼层
 楼主| 高级安全大使 发表于 2021-9-30 23:48 | 显示全部楼层
1 串口1
  1. void uart_init( u32 bound )
  2. {
  3.         /* GPIO端口设置 */
  4.         GPIO_InitTypeDef        GPIO_InitStructure;
  5.         USART_InitTypeDef        USART_InitStructure;
  6.         NVIC_InitTypeDef        NVIC_InitStructure;

  7.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE );         /* 使能USART1,GPIOA时钟 */

  8.         /* USART1_TX   GPIOA.9 */
  9.         GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_9;                                           /* PA.9 */
  10.         GPIO_InitStructure.GPIO_Speed        = GPIO_Speed_50MHz;
  11.         GPIO_InitStructure.GPIO_Mode        = GPIO_Mode_AF_PP;                                      /*复用推挽输出 */
  12.         GPIO_Init( GPIOA, &GPIO_InitStructure );                                                /* 初始化GPIOA.9 */

  13.         /* USART1_RX          GPIOA.10初始化 */
  14.         GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_10;                                          /* PA10 */
  15.         GPIO_InitStructure.GPIO_Mode        = GPIO_Mode_IN_FLOATING;                                /* 浮空输入 */
  16.         GPIO_Init( GPIOA, &GPIO_InitStructure );                                                /* 初始化GPIOA.10 */

  17.         /* Usart1 NVIC 配置 */
  18.         NVIC_InitStructure.NVIC_IRQChannel                        = USART1_IRQn;
  19.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority        = 3;                            /* 抢占优先级3 */
  20.         NVIC_InitStructure.NVIC_IRQChannelSubPriority                = 3;                            /* 子优先级3 */
  21.         NVIC_InitStructure.NVIC_IRQChannelCmd                        = ENABLE;                       /* IRQ通道使能 */
  22.         NVIC_Init( &NVIC_InitStructure );                                                       /* 根据指定的参数初始化VIC寄存器 */

  23.         /* USART 初始化设置 */
  24.         USART_InitStructure.USART_BaudRate                = bound;                                /* 串口波特率 */
  25.         USART_InitStructure.USART_WordLength                = USART_WordLength_8b;                  /* 字长为8位数据格式 */
  26.         USART_InitStructure.USART_StopBits                = USART_StopBits_1;                     /* 一个停止位 */
  27.         USART_InitStructure.USART_Parity                = USART_Parity_No;                      /* 无奇偶校验位 */
  28.         USART_InitStructure.USART_HardwareFlowControl        = USART_HardwareFlowControl_None;       /* 无硬件数据流控制 */
  29.         USART_InitStructure.USART_Mode                        = USART_Mode_Rx | USART_Mode_Tx;        /* 收发模式 */

  30.         USART_Init( USART1, &USART_InitStructure );                                             /* 初始化串口1 */
  31.         USART_ITConfig( USART1, USART_IT_RXNE, ENABLE );                                        /* 开启串口接受中断 */
  32.         USART_Cmd( USART1, ENABLE );                                                            /* 使能串口1 */
  33. }

  34. void USART1_IRQHandler( void )                                                                          /* 串口1中断服务程序 */
  35. {
  36.         u8 res;

  37.         if ( USART_GetITStatus( USART1, USART_IT_RXNE ) != RESET )                                      /* 接收中断(接收到的数据必须是0x0d 0x0a结尾) */
  38.         {
  39.                 res = USART_ReceiveData( USART1 );                                                      /* 读取接收到的数据 */

  40.         }

  41. }
 楼主| 高级安全大使 发表于 2021-9-30 23:49 | 显示全部楼层
2 串口2
730116155dc4dcde0f.png
 楼主| 高级安全大使 发表于 2021-9-30 23:50 | 显示全部楼层
把DMA用起来(发送)
564256155dca80dbe5.png
 楼主| 高级安全大使 发表于 2021-9-30 23:53 | 显示全部楼层

  1. #include "stdarg.h"
  2. #include "stdio.h"
  3. #include "string.h"
  4. /* 串口发送缓存区 */
 楼主| 高级安全大使 发表于 2021-9-30 23:54 | 显示全部楼层
此段不知道为什么说是包含不良信息放不上来,只能截图了。
864176155dd92ed2b8.png
 楼主| 高级安全大使 发表于 2021-9-30 23:55 | 显示全部楼层
  1. void UART_DMA_Config( DMA_Channel_TypeDef*DMA_CHx, u32 cpar, u32 cmar )
  2. {
  3.         DMA_InitTypeDef DMA_InitStructure;
  4.         RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1, ENABLE );                            /* 使能DMA传输 */
  5.         DMA_DeInit( DMA_CHx );                                                          /* 将DMA的通道1寄存器重设为缺省值 */
  6.         DMA_InitStructure.DMA_PeripheralBaseAddr        = cpar;                         /* DMA外设ADC基地址 */
  7.         DMA_InitStructure.DMA_MemoryBaseAddr                = cmar;                         /* DMA内存基地址 */
  8.         DMA_InitStructure.DMA_DIR                        = DMA_DIR_PeripheralDST;        /* 数据传输方向,从内存读取发送到外设 */
  9.         DMA_InitStructure.DMA_BufferSize                = 0;                            /* DMA通道的DMA缓存的大小 */
  10.         DMA_InitStructure.DMA_PeripheralInc                = DMA_PeripheralInc_Disable;    /* 外设地址寄存器不变 */
  11.         DMA_InitStructure.DMA_MemoryInc                        = DMA_MemoryInc_Enable;         /* 内存地址寄存器递增 */
  12.         DMA_InitStructure.DMA_PeripheralDataSize        = DMA_PeripheralDataSize_Byte;  /* 数据宽度为8位 */
  13.         DMA_InitStructure.DMA_MemoryDataSize                = DMA_MemoryDataSize_Byte;      /* 数据宽度为8位 */
  14.         DMA_InitStructure.DMA_Mode                        = DMA_Mode_Normal;              /* 工作在正常缓存模式 */
  15.         DMA_InitStructure.DMA_Priority                        = DMA_Priority_Medium;          /* DMA通道 x拥有中优先级 */
  16.         DMA_InitStructure.DMA_M2M                        = DMA_M2M_Disable;              /* DMA通道x没有设置为内存到内存传输 */
  17.         DMA_Init( DMA_CHx, &DMA_InitStructure );                                        /* 根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器 */
  18. }


  19. /* 开启一次DMA传输 */
  20. void UART_DMA_Enable( DMA_Channel_TypeDef*DMA_CHx, u8 len )
  21. {
  22.         DMA_Cmd( DMA_CHx, DISABLE );                                                    /* 关闭 指示的通道 */
  23.         DMA_SetCurrDataCounter( DMA_CHx, len );                                         /* DMA通道的DMA缓存的大小 */
  24.         DMA_Cmd( DMA_CHx, ENABLE );                                                     /* 开启DMA传输 */
  25. }


  26. /*
  27. * 初始化IO 串口2
  28. * pclk1:PCLK1时钟频率(Mhz)
  29. * bound:波特率
  30. */
  31. void USART2_Init( u32 bound )
  32. {
  33.         NVIC_InitTypeDef        NVIC_InitStructure;
  34.         GPIO_InitTypeDef        GPIO_InitStructure;
  35.         USART_InitTypeDef        USART_InitStructure;

  36.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );                                 /* GPIOA时钟 */
  37.         RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );

  38.         USART_DeInit( USART2 );                                                                 /*复位串口2 */
  39.         /* USART2_TX   PA.2 */
  40.         GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_2;                                           /* PA.2 */
  41.         GPIO_InitStructure.GPIO_Speed        = GPIO_Speed_50MHz;
  42.         GPIO_InitStructure.GPIO_Mode        = GPIO_Mode_AF_PP;                                      /*复用推挽输出 */
  43.         GPIO_Init( GPIOA, &GPIO_InitStructure );                                                /* 初始化PA2 */

  44.         /* USART2_RX          PA.3 */
  45.         GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_3;
  46.         GPIO_InitStructure.GPIO_Mode        = GPIO_Mode_IN_FLOATING;                                /* 浮空输入 */
  47.         GPIO_Init( GPIOA, &GPIO_InitStructure );                                                /* 初始化PA3 */

  48.         USART_InitStructure.USART_BaudRate                = bound;                                /* 一般设置为9600; */
  49.         USART_InitStructure.USART_WordLength                = USART_WordLength_8b;                  /* 字长为8位数据格式 */
  50.         USART_InitStructure.USART_StopBits                = USART_StopBits_1;                     /* 一个停止位 */
  51.         USART_InitStructure.USART_Parity                = USART_Parity_No;                      /* 无奇偶校验位 */
  52.         USART_InitStructure.USART_HardwareFlowControl        = USART_HardwareFlowControl_None;       /* 无硬件数据流控制 */
  53.         USART_InitStructure.USART_Mode                        = USART_Mode_Rx | USART_Mode_Tx;        /* 收发模式 */
  54.         USART_Init( USART2, &USART_InitStructure );                                             /* 初始化串口        2 */

  55.         /*
  56.          * 波特率设置
  57.          * USART2->BRR=(pclk1*1000000)/(bound);// 波特率设置
  58.          * USART2->CR1|=0X200C;         //1位停止,无校验位.
  59.          */
  60.         USART_DMACmd( USART2, USART_DMAReq_Tx, ENABLE );                                        /* 使能串口2的DMA发送 */
  61.         UART_DMA_Config( DMA1_Channel7, (u32) & USART2->DR, (u32) USART2_TX_BUF );              /* DMA1通道7,外设为串口2,存储器为USART2_TX_BUF */
  62.         USART_Cmd( USART2, ENABLE );                                                            /* 使能串口 */


  63.         /* 使能接收中断 */
  64.         USART_ITConfig( USART2, USART_IT_RXNE, ENABLE );                                        /* 开启中断 */
  65.         NVIC_InitStructure.NVIC_IRQChannel                        = USART2_IRQn;
  66.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority        = 2;                            /* 抢占优先级3 */
  67.         NVIC_InitStructure.NVIC_IRQChannelSubPriority                = 3;                            /* 子优先级3 */
  68.         NVIC_InitStructure.NVIC_IRQChannelCmd                        = ENABLE;                       /* IRQ通道使能 */
  69.         NVIC_Init( &NVIC_InitStructure );                                                       /* 根据指定的参数初始化VIC寄存器 */
  70. }


  71. /*
  72. * 串口2,printf 函数
  73. * 确保一次发送数据不超过USART2_MAX_SEND_LEN字节
  74. */
  75. void u2_printf( char* fmt, ... )
  76. {
  77.         va_list ap;
  78.         va_start( ap, fmt );
  79.         vsprintf( (char *) USART2_TX_BUF, fmt, ap );
  80.         va_end( ap );
  81.         while ( DMA_GetCurrDataCounter( DMA1_Channel7 ) != 0 )
  82.                 ;                                                                       /* 等待通道7传输完成 */
  83.         UART_DMA_Enable( DMA1_Channel7, strlen( (const char *) USART2_TX_BUF ) );       /* 通过dma发送出去 */
  84. }

  85. void USART2_IRQHandler( void )
  86. {
  87.         u8 res;
  88.         if ( USART_GetITStatus( USART2, USART_IT_RXNE ) != RESET ) /* 接收到数据 */
  89.         {
  90.                 res = USART_ReceiveData( USART2 );
  91.                
  92.         }
  93. }
 楼主| 高级安全大使 发表于 2021-9-30 23:56 | 显示全部楼层
把DMA用起来的程序的使用:
初始化:
  1. USART2_Init(115200);
 楼主| 高级安全大使 发表于 2021-9-30 23:58 | 显示全部楼层
打印数据:
  1. u2_printf("aa");
  2. u2_printf("%d",123);
 楼主| 高级安全大使 发表于 2021-9-30 23:59 | 显示全部楼层
接收数据:
  1. void USART2_IRQHandler( void )
labasi 发表于 2021-10-14 15:46 | 显示全部楼层
还行吧  代码风格不错
tpgf 发表于 2021-10-14 15:48 | 显示全部楼层
如何启动dma呢
heimaojingzhang 发表于 2021-10-14 15:50 | 显示全部楼层
感觉不如普通模式好调试
keaibukelian 发表于 2021-10-14 15:51 | 显示全部楼层
三个串口一起用起来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

445

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部