|
很基础 例程,配置串口,配置dma,然后把数组的内容通过dma发送到串口调试助手,但是第一个字符就是0。很奇怪。
现象如下:
代码如下
- int main(void)
- {
- u32 i = 500;
-
- uint8_t TestBuff[20] = "testprintf我是中国人";
- // NVIC_DEBUG_Cfg();
- Debug_USART1_Cfg();
- USART1->SR;
- USART1_DMA_Cfg();
- for(i = 0;i<10;i++)
- {
- test[i] = 'A';
- }
- for(i = 10;i<20;i++)
- {
- test[i] = 'B';
- }
- for(i = 20;i<30;i++)
- {
- test[i] = 'C';
- }
- for(i = 30;i<40;i++)
- {
- test[i] = 'D';
- }
- for(i = 40;i<50;i++)
- {
- test[i] = 'E';
- }
-
- USART_DMACmd( USART1, USART_DMAReq_Tx,ENABLE);
- while(1)
- {
- // DEBUG_USART1_SendStr(TestBuff,20);
- if(DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7)==1)
- {
- // DEBUG_USART1_SendStr(RX_Buff,RXMAX);
- DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
- }
- }
- }
复制代码 usart1配置
- void Debug_USART1_Cfg(void)
- {
- USART_InitTypeDef USART_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- /*打开PA口和串口1的时钟*/
- RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- /*配置PA9 PA10的复用功能,不能按位或*/
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
- USART1->SR;
- /* USART1 Tx PA9的GPIO配置,参考官方库 */
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//速度这里比官方库慢
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- /* USART1 Rx PA10的GPIO配置,参考官方库 */
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- USART_InitStructure.USART_BaudRate = 115200;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- 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(USART1, &USART_InitStructure);
-
- USART_Cmd(USART1, ENABLE);
- // USART_ClearFlag( USART1, USART_FLAG_TC);
- // USART_ClearFlag( USART1, USART_FLAG_TXE);
- USART1->SR;
复制代码
dma配置
- void USART1_DMA_Cfg(void)
- {
- DMA_InitTypeDef DMA_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
-
- DMA_InitStructure.DMA_BufferSize = 50;//用宏定义,方便改
- /*usart1发送是数据流7通道4,接收是数据流2通道4*/
- DMA_InitStructure.DMA_Channel = DMA_Channel_4;
- DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;//FIFO没用,这个没影响
- DMA_InitStructure.DMA_Memory0BaseAddr = (u32)(&test);
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
- DMA_InitStructure.DMA_PeripheralBaseAddr= (u32)(USART1_BASE+0x04);//USART1->DR;
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
- DMA_InitStructure.DMA_PeripheralDataSize= DMA_PeripheralDataSize_Byte;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
-
- /*USART1接收在DMA2的通道4,数据流2,发送在通道4,数据流7*/
- DMA_Init(DMA2_Stream7, &DMA_InitStructure);
-
- DMA_Cmd(DMA2_Stream7, ENABLE);
-
- while(DMA_GetCmdStatus(DMA2_Stream7) != ENABLE);
- }
复制代码
|
|