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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32f103 DMA接收定長數據和不定長數據 源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:511461 發表于 2020-7-28 19:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近做了DMA接收定長數據和不定長數據的程序,現在來分享一下定長:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "dma.h"


#define USART1_RXBUF_SIZE 200        //發送數據長度,最好等于sizeof(TEXT_TO_SEND)+2的整數倍.

u8 u1rxbuf[USART1_RXBUF_SIZE];        //發送數據緩沖區1
u8 u2rxbuf[USART1_RXBUF_SIZE];        //發送數據緩沖區2
u8 witchbuf=0;                  //標記當前使用的是哪個緩沖區,0,使用u1rxbuf;1,使用u2rxbuf;

u16 rxcnt=0;

//處理DMA1 通道5的接收完成中斷
void DMA1_Channel5_IRQHandler(void)
{
                if(DMA_GetITStatus(DMA1_IT_TC5)!= RESET)//DMA接收完成標志
                {
                                DMA_Cmd(DMA1_Channel5, DISABLE );   //關閉USART1 TX DMA1 所指示的通道  
                                if(witchbuf)                        //之前用的u2rxbuf,切換為u1rxbuf
                                {
                                                //printf("use u1rxbuf\r\n");
                                                DMA1_Channel5->CMAR=(u32)u1rxbuf;
                                                witchbuf=0;                     //下一次切換為u2rxbuf
                                }else                               //之前用的u1rxbuf,切換為u2rxbuf
                                {
                                                //printf("use u2rxbuf\r\n");
                                                DMA1_Channel5->CMAR=(u32)u2rxbuf;
                                                witchbuf=1;                     //下一次切換為u1rxbuf
                                }
                                rxcnt+=200;
                                DMA_SetCurrDataCounter(DMA1_Channel5,USART1_RXBUF_SIZE);//DMA通道的DMA緩存的大小
                                DMA_Cmd(DMA1_Channel5, ENABLE);     //使能USART1 TX DMA1 所指示的通道        
                                DMA_ClearITPendingBit(DMA1_IT_TC5); //清除中斷標志  
                }
}
//初始化IO 串口2
//pclk1:PCLK1時鐘頻率(Mhz)
//bound:波特率         
void USART2_Init(u32 bound)
{  
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOA,D時鐘
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時鐘

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;        //PA2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //復用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//復位串口2
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止復位

         
    USART_InitStructure.USART_BaudRate = bound;//波特率設置
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位數據長度
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校驗位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收發模式

    USART_Init(USART2, &USART_InitStructure); ; //初始化串口

    USART_Cmd(USART2, ENABLE);                    //使能串口

}


int main(void)
{         
        u16 i;
        u16 pro=0;//進度
  u8 oldsta=0;
  u8 *p;

        delay_init();                     //延時函數初始化         
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
        uart_init(115200);                 //串口初始化為115200
  USART2_Init(115200);
        LED_Init();                                  //初始化與LED連接的硬件接口
        LCD_Init();                                   //初始化LCD         
//        KEY_Init();                                //按鍵初始化
  POINT_COLOR=RED;//設置字體為紅色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");         

  USART1_DMA_RX_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)u1rxbuf,USART1_RXBUF_SIZE);//設置串口1的DMA接收
  USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);    //使能串口1的DMA接收     

         
        LCD_ShowString(30,70,200,16,16,"DMA TEST");                  
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/15");        
         LCD_ShowString(30,130,200,16,16,"KEY0:Start");
                  
        i=0;
        while(1)
        {   
      if(oldsta!=witchbuf)
                        {
                                        oldsta=witchbuf;
                                        if(oldsta)p=u1rxbuf;    //當前正在使用u2rxbuf接收,所以u1rxbuf是有數據的
                                        else p=u2rxbuf;
                                        for(i=0;i<USART1_RXBUF_SIZE;i++)
                                        {
                                                        USART2->DR=p;  
                                                        while((USART2->SR&0X40)==0);//循環發送,直到發送完畢   
                                        }  
                        }               
        }
}



不定長:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "dma.h"

/************************************************
ALIENTEK戰艦STM32開發板實驗22
DMA 實驗
技術支持:www.openedv.com
淘寶店鋪:http://eboard.taobao.com
關注微信公眾平臺微信號:"正點原子",免費獲取STM32資料。
廣州市星翼電子科技有限公司  
作者:正點原子 @ALIENTEK
************************************************/



#define USART1_RXBUF_SIZE 200        //發送數據長度,最好等于sizeof(TEXT_TO_SEND)+2的整數倍.

extern u8 receive_data[128];        //發送數據緩沖區1
extern u8 receive_flag;

int main(void)
{         
        delay_init();                     //延時函數初始化         
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
        uart_init(115200);                 //串口初始化為115200
        LED_Init();                                  //初始化與LED連接的硬件接口
        LCD_Init();                                   //初始化LCD         

  USART1_DMA_RX_Config();//設置串口1的DMA接收
        
  POINT_COLOR=RED;//設置字體為紅色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");                     
        LCD_ShowString(30,70,200,16,16,"DMA TEST");                  
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/15");        
         LCD_ShowString(30,130,200,16,16,"KEY0:Start");
        while(1)
        {   
                while(receive_flag == 0);
                receive_flag = 0;
                printf("%s",receive_data);
        }
}



串口DMA接收不定長數據.7z

237.06 KB, 下載次數: 44, 下載積分: 黑幣 -5

DMA實驗-DMA串口接收.7z

237.91 KB, 下載次數: 24, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲日本激情 | 欧美成人精品 | 国产精品毛片一区二区三区 | 欧美黑人激情 | 国产日日操 | 日本一二三区在线观看 | 国产特级毛片aaaaaa | 国产成人99av超碰超爽 | 九九热在线免费观看 | eeuss国产一区二区三区四区 | 成人福利在线 | ww亚洲ww亚在线观看 | 国产精品视频在线播放 | 欧美日韩视频网站 | 91精品国产高清一区二区三区 | 国产一级免费视频 | 一级欧美| 天堂在线www | www日本在线播放 | 日韩三级电影一区二区 | 欧美中文字幕在线观看 | 中文字幕日韩一区二区 | 日本高清视频网站 | 国产精产国品一二三产区视频 | 日韩在线视频免费观看 | 成人在线电影在线观看 | 国产激情精品一区二区三区 | 国产在线观 | 毛片链接 | 国产日韩精品一区 | 成年人在线观看 | 在线成人免费视频 | 久久福利| 亚洲国产精品一区二区久久 | 日韩精品1区2区3区 成人黄页在线观看 | 成人网在线观看 | 干干干操操操 | 久久午夜影院 | 国产一级片 | 亚洲人在线观看视频 | 超碰免费在线 |