|
最近做了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
2020-7-28 22:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
237.06 KB, 下載次數: 44, 下載積分: 黑幣 -5
-
-
DMA實驗-DMA串口接收.7z
2020-7-28 22:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
237.91 KB, 下載次數: 24, 下載積分: 黑幣 -5
|