金牌会员
 
- 积分
- 1436
- 金钱
- 1436
- 注册时间
- 2016-7-6
- 在线时间
- 161 小时
|
50金钱
本帖最后由 guiguziqin 于 2020-5-1 17:44 编辑
我在FreeRTOS系统新建了一个任务,每100ms往USART2打印10个字节的数组。数组的第1、第2个元素是个变量,每100ms加1。
// 以下是用for循环输出的源代码:- void datasnd_task(void *pvParameters)
- {
- u8 t;
- uint8_t TxData[10] = {0};
- uint16_t tick = 0;
- u32 lastWakeTime = getSysTickCnt();
- while(1)
- {
- vTaskDelayUntil(&lastWakeTime, 100); //100ms运行频率
- TxData[0] = BYTE1(tick); //把tick的高字节放在第0个元素
- TxData[1] = BYTE0(tick); //把tick的低字节放在第1个元素
- for(t=0;t<10;t++)
- {
- USART_SendData(USART2, TxData[t]); //向串口2发送数据
- while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET); //等待发送结束
- }
- if(tick == 65535) tick = 0;
- else tick++;
- }
- }
复制代码
当使用for循环打印时,输出是正确的,即100ms打印一次。可以看到打印出的变量是每次加1的。
// 以下是用DMA输出的代码:
- void datasnd_task(void *pvParameters)
- {
- u8 t;
- uint8_t TxData[10] = {0};
- uint16_t tick = 0;
- u32 lastWakeTime = getSysTickCnt();
- MYDMA_Config((u32)TxData,10); //初始化DMA1的数据流6,通道4
- USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE); //使能串口2的DMA发送
- while(1)
- {
- vTaskDelayUntil(&lastWakeTime, 100); //100ms运行频率
- TxData[0] = BYTE1(tick); //把tick的高字节放在第0个元素
- TxData[1] = BYTE0(tick); //把tick的低字节放在第1个元素
- DMA_Cmd(DMA1_Stream6, ENABLE); //启动一次DMA传输
- if(DMA_GetFlagStatus(DMA1_Stream6,DMA_FLAG_TCIF6)!=RESET) //等待DMA1_Stream6传输完成
- {
- DMA_ClearFlag(DMA1_Stream6,DMA_FLAG_TCIF6); //清除DMA1_Stream6传输完成标志
- }
- if(tick == 65535) tick = 0;
- else tick++;
- }
- }
复制代码
但是当使用DMA方式输出的时候,发现是200ms打印一次,每次打印出的变量是加2。请问有大神能解答吗?
以下是DMA初始化代码:
- void MYDMA_Config(u32 memory_adr,u16 data_lenth)
- {
- DMA_InitTypeDef DMA_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE); //DMA1时钟使能
- DMA_DeInit(DMA1_Stream6);
-
- while (DMA_GetCmdStatus(DMA1_Stream6) != DISABLE){} //等待DMA可配置
-
- /* 配置 DMA Stream */
- DMA_InitStructure.DMA_Channel = DMA_Channel_4; //通道选择
- DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR; //DMA外设地址
- DMA_InitStructure.DMA_Memory0BaseAddr = memory_adr; //DMA 存储器0地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //存储器到外设模式
- DMA_InitStructure.DMA_BufferSize = data_lenth; //数据传输长度
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设非增量模式
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储器增量模式
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据长度:8位
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //存储器数据长度:8位
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //使用普通模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //中等优先级
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //存储器突发单次传输
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //外设突发单次传输
- DMA_Init(DMA1_Stream6, &DMA_InitStructure); //初始化DMA Stream
- }
复制代码
|
|