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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7466|回復: 5
收起左側

STM32F030-UART1_DMA使用提示

[復制鏈接]
ID:276663 發表于 2018-6-27 18:45 | 顯示全部樓層 |閱讀模式
STM32F030-UART1_DMA使用提示前言:
         今天把STM32F030C8T6的串口DMA學習了一下,為了加快各位研發人員的開發進度,避免浪費大量的時間在硬件平臺上,寫出個人代碼調試的經驗。個人水平有限,如有錯誤,還請指正mr.li.ming@qq.com
提示:使用的內部RC時鐘,最大速度48MHz;使用USART1-PA9/PA10.
第一步:初始化端口
/*******************************************************************************
  *@brief  串口1端口初始化
  *@param  None
  * @retvalNone
****************************************************************Author:Liming**/
void USART1_GPIO_Init(void)
{
   GPIO_InitTypeDef   GPIO_Initstructure;
   RCC_AHBPeriphClockCmd(USART1_GPIO_CLK,ENABLE);   
    /*Connect pin to Periph */
   GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);   // 注意這里是GPIO_PinSource9
   GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
   GPIO_Initstructure.GPIO_Pin=USART1_TX_PIN;
   GPIO_Initstructure.GPIO_Mode=GPIO_Mode_AF;
   GPIO_Initstructure.GPIO_OType=GPIO_OType_PP;  // 推挽輸出
   GPIO_Initstructure.GPIO_PuPd=GPIO_PuPd_UP;
   GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;   
   GPIO_Init(USART1_GPIO_PORT,&GPIO_Initstructure);
   GPIO_Initstructure.GPIO_Pin = USART1_RX_PIN;  // 浮空輸入  
   GPIO_Init(USART1_GPIO_PORT,&GPIO_Initstructure);
}
第二步:初始化UART1
/*******************************************************************************
  * @brief  串口1初始化
  * @param  None
  * @retval None
****************************************************************Author:Liming**/
void USART1_Init(uint32_t BaudRate)
{
    USART_InitTypeDef   USART_Initstructure;
   RCC_APB2PeriphClockCmd(USART1_CLK,ENABLE);
   
    USART1_GPIO_Init(); // 調用了上面的端口初始化,故主函數里調用此函數即可。
     
   USART_Initstructure.USART_BaudRate = BaudRate;
   USART_Initstructure.USART_Parity  =USART_Parity_No;
   USART_Initstructure.USART_WordLength =USART_WordLength_8b;  
   USART_Initstructure.USART_StopBits =USART_StopBits_1;
   USART_Initstructure.USART_Mode    = USART_Mode_Rx|USART_Mode_Tx;
   USART_Initstructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
   USART_Init(USART1,&USART_Initstructure);
   USART_ClearFlag(USART1,USART_FLAG_TC);
   USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
   USART_Cmd(USART1,ENABLE);      // 使能串口
}

第三步:DMA1中斷配置
/*******************************************************************************
  * @brief  DMA1中斷配置
  * @param  None
  * @retval None
****************************************************************Author:Liming**/
void DMA1_NVIC_Init(void)
{
    NVIC_InitTypeDef    NVIC_InitStructure;
   
   NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
   
   NVIC_Init(&NVIC_InitStructure);
}
注意事項:1.    USART1發送數據使用的是DMA1的第二通道。查表可知,為什么還有第四通道呢,那是給USART1端口重映射了之后使用的。
                              

第四步:DMA1配置
/*******************************************************************************
  *@brief  DMA1配置
  *@param  None
  *@retval None
****************************************************************Author:Liming**/
void DMA1_Init(void)
{
   DMA_InitTypeDef DMA_InitStructure;
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
   
   DMA_InitStructure.DMA_BufferSize = 12; // 緩存大小
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;    // 內存到內存關閉
   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;   // 普通模式
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  // 內存到外設
   DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMA通道優先級
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 內存地址遞增
   DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&USART1->TDR;   // 外設地址   
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 外設地址不變
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 內存數據長度
   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)UART1_TXBUFFER;   // 定義內存基地址
   DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte;//外設數據長度
   
   DMA_Init(DMA1_Channel2,&DMA_InitStructure);
   DMA_ClearITPendingBit(DMA1_IT_TC2); // 清除一次DMA中斷標志
   DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);// 使能DMA傳輸完成中斷
   
DMA1_NVIC_Init(); // 調用了上面的中斷配置,故主函數里調用此函數即可
   DMA_Cmd(DMA1_Channel2,ENABLE);
}
注意事項:1.    緩存大小:就是你一次要發送多長的數據。2.    DMA方向:因為是串口發送數據,所以是從內存到外設,USART1對于單片機來講是個外設。定義的發送數組是內存。3.    內存地址遞增:其實不難理解,從發送數組的UART1_TXBUFFER[0]- UART1_TXBUFFER[n]肯定是遞增的。4.    外設地址不遞增:所有的數據都是通過串口發送寄存器發出去,所以外設地址不變。5.    內存/外設數據長度:串口發送的數據都是字節為單位,所以長度是Byte6.    DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);注意這一句不要寫錯。

第五步:DMA1的中斷處理函數
/**
  *@brief  DMA1_Channel1中斷服務函數
  *@param  
  *@retval
  */
void DMA1_Channel2_3_IRQHandler(void)  
{  
         /*判斷DMA傳輸完成中斷*/
         if(DMA_GetITStatus(DMA1_IT_TC2)!= RESET)                        
         {
       UART1_STATE = 2;// send over
         }
         /*清除DMA中斷標志位*/   
         DMA_ClearITPendingBit(DMA1_IT_TC2);                     
}
這里使用了一個變量UART1_STATE作為標志位

第六步:使用DMA1發送串口數據
    USART1_Init(115200);
    DMA1_Init();
   
    while(1)
    {
        if(UART1_STATE==2)
        {
            UART1_STATE = 1;
           DMA_Cmd(DMA1_Channel2,DISABLE); // 發送完成先關掉DMA通道
           DMA_SetCurrDataCounter(DMA1_Channel2,12); // 設置需要發送的長度
           DMA_Cmd(DMA1_Channel2,ENABLE); // 再打開DMA通道
        }
       GPIO_SetBits(GPIOA,GPIO_Pin_4);Delay(500);
       GPIO_SetBits(GPIOA,GPIO_Pin_3);Delay(500);
        GPIO_ResetBits(GPIOA,GPIO_Pin_4);Delay(500);
       GPIO_ResetBits(GPIOA,GPIO_Pin_3);Delay(500);
        
    }
注意事項:1.    一定要注意,DMA的傳輸有個長度計數器,DMA傳輸完成后,計數器里的值就變成了0;數據是不傳了,但是通道并沒有關閉。所以想要再次傳輸就需要修改這個長度計數器的值,但是這個值的修改必須要關閉通道后修改。所以就有了上面的步驟,關閉通道修改計數值打開通道
希望對各位看官有所幫助,并能觸類旁通,對于外設到內存啊,內存到內存啊,ADCDMA啊,SPIDMA都能輕松的應用。
STM32F030-UART1_DMA使用提示.pdf (541.38 KB, 下載次數: 72)

評分

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

查看全部評分

回復

使用道具 舉報

ID:87079 發表于 2018-8-21 14:49 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:276663 發表于 2018-8-23 16:46 | 顯示全部樓層
還請大神勿噴啊!如果覺得哪里不對可以提出來,我做改正。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:446581 發表于 2018-12-14 22:22 | 顯示全部樓層
學習了
回復

使用道具 舉報

ID:622200 發表于 2019-10-16 10:27 | 顯示全部樓層
學習了
回復

使用道具 舉報

ID:594820 發表于 2019-10-16 13:40 | 顯示全部樓層
學習了,51黑不錯!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕av一区二区三区 | 老外黄色一级片 | pacopacomama在线 | 国产精品一区二区av | 久久久精品一区二区三区 | 日韩av在线不卡 | 真人女人一级毛片免费播放 | 日韩一区二区免费视频 | 国产欧美综合在线 | 亚洲国产精选 | 日韩成人 | 国产乡下妇女做爰 | 免费高潮视频95在线观看网站 | 国产片一区二区三区 | 久久国产成人 | 久久国产精品免费一区二区三区 | 欧美国产精品 | 日韩在线不卡 | 午夜激情免费视频 | 成人欧美一区二区三区在线播放 | 久久精品国产一区二区三区不卡 | 四虎免费视频 | 综合精品久久久 | 国产亚洲一区二区三区在线观看 | 女人牲交视频一级毛片 | 精品一区二区三区在线观看 | 免费国产一区 | 国产精品久久久久久久久久久久午夜片 | 色播久久久 | 久久久久久国产一区二区三区 | 中文字幕一区二区三区不卡 | 九九久久精品 | 午夜精品久久久久久久久久久久久 | 国产成人精品一区二区三区在线 | 狠狠狠干 | 欧美日韩国产一区二区三区 | 国产人免费人成免费视频 | 欧产日产国产精品视频 | 你懂的免费在线 | 亚洲视频免费在线观看 | 日韩精品视频网 |