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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2520|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32 USART DMA方式配置

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:821217 發(fā)表于 2020-9-20 18:39 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #define USART1_BUFF_SIZE 1024

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

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

  4. uint16_t usart1_tx_flag = 0;       /* 接收一幀數(shù)據(jù)標(biāo)志,并記錄接收數(shù)據(jù)個(gè)數(shù) */



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

  6. ** 函數(shù): USART1_Init,  串口1初始化

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

  8. ** 參數(shù):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部件的時(shí)鐘 */

  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;           // 復(fù)用推挽輸出

  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.         /* 配置串口硬件參數(shù) */

  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.         /* 開啟串口收發(fā)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. ** 函數(shù): USART1_DMA_Init,  串口1初始化。 配置串口1的DMA,并開啟DMA接收中斷。

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

  49. ** 參數(shù): 無

  50. ** 返回: 無                                                                                          

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

  52. void USART1_DMA_Init(void)

  53. {

  54.         DMA_InitTypeDef DMA_InitStructure;



  55.         /* 打開DMA通道時(shí)鐘 */

  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收發(fā)通道 */

  86.         DMA_Cmd(DMA1_Channel4,ENABLE);

  87.         DMA_Cmd(DMA1_Channel5,ENABLE);



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

  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.                 /* 清除標(biāo)志:先讀SR,再讀DR */

  103.                 ClearFlag = USART1->SR;

  104.                 ClearFlag = USART1->DR;

  105.                

  106.                 /* 獲取接收數(shù)據(jù)個(gè)數(shù) */

  107.                 Count = DMA_GetCurrDataCounter(DMA1_Channel5);

  108.                 usart1_tx_flag = USART1_BUFF_SIZE - Count;



  109.                 /* 處理數(shù)據(jù),這里用于演示,將收到的數(shù)據(jù)使用DMA發(fā)送出去 */

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



  111.                 /* DMA接收復(fù)位 */

  112.                 DMA_Cmd(DMA1_Channel5,DISABLE);

  113.                 DMA_SetCurrDataCounter(DMA1_Channel5,USART1_BUFF_SIZE);

  114.                 DMA_Cmd(DMA1_Channel5,ENABLE);

  115.         }

  116. }

復(fù)制代碼




評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 97精品国产97久久久久久免费 | 久久久久久久网 | 国产成人综合在线 | 国产三级精品三级在线观看四季网 | 黄色av免费 | 亚洲精选久久 | 日本激情视频中文字幕 | 亚洲成人在线视频播放 | 亚洲精品久久久久久久久久久久久 | 国产精品日韩欧美一区二区三区 | 久久久久成人精品亚洲国产 | 中文精品视频 | 超碰在线网站 | 亚洲三级免费看 | 亚洲夜射 | 久久国产日韩 | 久久久久久久久久久久91 | 亚洲精品1区 | www.国产一区 | 成人精品一区二区三区中文字幕 | 亚洲高清视频在线观看 | 免费一区二区 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 九九热这里| 久久高清国产视频 | 亚洲精品一区中文字幕乱码 | 一区二区三区视频在线观看 | 黄a在线观看 | 午夜影院 | 蜜桃av一区二区三区 | 免费一区二区三区 | 日韩一区二区在线播放 | 欧洲性生活视频 | 国外成人在线视频网站 | 久久久免费少妇高潮毛片 | 成人综合久久 | 日韩一区二区福利视频 | 九九久久在线看 | 亚洲一区二区三区免费视频 | 日韩中字幕 | 91精品国产综合久久久动漫日韩 |