久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2595|回復: 0
打印 上一主題 下一主題
收起左側

STM32 USART DMA方式配置

[復制鏈接]
跳轉到指定樓層
樓主
ID:821217 發表于 2020-9-20 18:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #define USART1_BUFF_SIZE 1024

  2. uint8_t  usart1_tx_buffer[USART1_BUFF_SIZE];   /* 串口發送緩存 */

  3. uint8_t  usart1_rx_buffer[USART1_BUFF_SIZE];   /* 串口接受緩存 */

  4. uint16_t usart1_tx_flag = 0;       /* 接收一幀數據標志,并記錄接收數據個數 */



  5. /********************************************************************************************************

  6. ** 函數: USART1_Init,  串口1初始化

  7. **------------------------------------------------------------------------------------------------------

  8. ** 參數:bound 波特蘭

  9. ** 返回: 無                                                                                          

  10. ********************************************************************************************************/

  11. void USART1_Init(uint32_t bound)

  12. {

  13.         GPIO_InitTypeDef GPIO_InitStructure;

  14.         USART_InitTypeDef USART_InitStructure;

  15.         NVIC_InitTypeDef NVIC_InitStructure;



  16.         /* 打開GPIO和USART部件的時鐘 */

  17.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

  18.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);



  19.         /* 配置GPIO的模式和IO口 */

  20.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;                       // 串口輸出PA9(TX)

  21.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    // IO口頻率

  22.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;           // 復用推挽輸出

  23.         GPIO_Init(GPIOA,&GPIO_InitStructure);                             // 初始化

  24.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;                   // 串口輸入PA10(RX)

  25.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;// 浮空輸入

  26.         GPIO_Init(GPIOA,&GPIO_InitStructure);                            // 初始化



  27.         /* 配置串口硬件參數 */

  28.         USART_InitStructure.USART_BaudRate = bound;    /* 波特率 */

  29.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  30.         USART_InitStructure.USART_StopBits = USART_StopBits_1;

  31.         USART_InitStructure.USART_Parity = USART_Parity_No ;

  32.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  33.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  34.         USART_Init(USART1, &USART_InitStructure);



  35.         USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);    /* 使能串口空閑中斷 */

  36.         USART_ClearFlag(USART1, USART_FLAG_TC | USART_FLAG_IDLE);

  37.         USART_Cmd(USART1, ENABLE);        /* 使能串口 */

  38.         /* 開啟串口收發DMA請求 */

  39.         USART_DMACmd(USART1,USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);



  40.         /* 使能串口1中斷 */

  41.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  42.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  43.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  44.         NVIC_Init(&NVIC_InitStructure);

  45. }



  46. /********************************************************************************************************

  47. ** 函數: USART1_DMA_Init,  串口1初始化。 配置串口1的DMA,并開啟DMA接收中斷。

  48. **------------------------------------------------------------------------------------------------------

  49. ** 參數: 無

  50. ** 返回: 無                                                                                          

  51. ********************************************************************************************************/

  52. void USART1_DMA_Init(void)

  53. {

  54.         DMA_InitTypeDef DMA_InitStructure;



  55.         /* 打開DMA通道時鐘 */

  56.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);



  57.         DMA_DeInit(DMA1_Channel4);//TX 通道

  58.         DMA_DeInit(DMA1_Channel5);//RX 通道



  59.         /* TX 通道 配置*/

  60.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);

  61.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)usart1_tx_buffer;

  62.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  63.         DMA_InitStructure.DMA_BufferSize = 0;

  64.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  65.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  66.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  67.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  68.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

  69.         DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

  70.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  71.         DMA_Init(DMA1_Channel4,&DMA_InitStructure);



  72.         /* RX 通道 配置*/

  73.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);

  74.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)usart1_rx_buffer;

  75.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  76.         DMA_InitStructure.DMA_BufferSize = USART1_BUFF_SIZE;

  77.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  78.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  79.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  80.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  81.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

  82.         DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

  83.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  84.         DMA_Init(DMA1_Channel5,&DMA_InitStructure);



  85.         /* 使能DMA收發通道 */

  86.         DMA_Cmd(DMA1_Channel4,ENABLE);

  87.         DMA_Cmd(DMA1_Channel5,ENABLE);



  88.         /* 這里沒有使用DMA接收完成或者發送完成中斷,如需要,可以在這里添加 */

  89. }



  90. /**

  91.   * @brief  This function handles usart1 interrupt request.

  92.   * @param  None

  93.   * @retval None

  94.   */

  95. void USART1_IRQHandler(void)

  96. {

  97.         uint8_t  ClearFlag;

  98.         uint16_t Count = 0;



  99.         /* 處理接收空閑中斷  */

  100.         if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)

  101.         {

  102.                 /* 清除標志:先讀SR,再讀DR */

  103.                 ClearFlag = USART1->SR;

  104.                 ClearFlag = USART1->DR;

  105.                

  106.                 /* 獲取接收數據個數 */

  107.                 Count = DMA_GetCurrDataCounter(DMA1_Channel5);

  108.                 usart1_tx_flag = USART1_BUFF_SIZE - Count;



  109.                 /* 處理數據,這里用于演示,將收到的數據使用DMA發送出去 */

  110.                 memcpy((uint8_t *)usart1_tx_buffer, (uint8_t *)usart1_rx_buffer, usart1_tx_flag);



  111.                 /* DMA接收復位 */

  112.                 DMA_Cmd(DMA1_Channel5,DISABLE);

  113.                 DMA_SetCurrDataCounter(DMA1_Channel5,USART1_BUFF_SIZE);

  114.                 DMA_Cmd(DMA1_Channel5,ENABLE);

  115.         }

  116. }

復制代碼




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产成人精品在线 | 黄色大片视频 | 国产精品美女久久久久久免费 | h片在线看 | 国产精品一区一区 | 在线观看午夜视频 | 麻豆视频国产在线观看 | 欧美一级视频在线观看 | 精品二区| 日本三级电影在线免费观看 | 99久久久国产精品 | 欧美激情第一区 | 男女羞羞在线观看 | avhd101在线成人播放 | 在线欧美小视频 | 日韩精品一区二区三区老鸭窝 | 91精品国产综合久久婷婷香蕉 | 日韩在线小视频 | 福利片在线看 | 免费a网 | 粉色午夜视频 | 欧美成人a∨高清免费观看 91伊人 | 久久亚洲精品国产精品紫薇 | 69福利影院 | 中文字幕亚洲一区二区三区 | 久久精品日产第一区二区三区 | 国产一区二区免费 | 91中文视频 | 日一区二区三区 | 日韩综合网| 激情毛片 | 一区二区三区av | 午夜国产一级片 | 国产一二三区电影 | 欧美色专区 | 不卡一区二区三区四区 | 玖玖精品视频 | 欧美激情视频一区二区三区在线播放 | 婷婷福利视频导航 | 亚洲资源站| 日日久|