首页 > 编程知识 正文

dma是什么意思,grandma

时间:2023-05-06 21:12:30 阅读:174094 作者:3669

# include ' usart _ debug.h ' # include stdio.h/# define UART3_ rx _ len 256/*单个缓存字节数*/# defineuatr3_ data /*接收状态0x01:已接收数据0x0:接收缓冲区已满0x07:接收缓冲区已满*/uint32_t UART3_RX_NUM=0; /*接收到的数据数*//* DMA接收缓冲器*/uint8_t dma_buffer[256]; /*要处理的串行数据缓冲器*/uint8_t rx0_date_buf[256]; /*应处理数据数:大于1时有应处理的数据,为0时没有应处理的数据*/uint32_t USART_RX_NUM=0; #if1voidusarT3_config(void ) )/* enableusartclock */rcu _ per iph _ clock _ enable ) rcu_usart0); usart_deinit(usart0;/* connectporttousartx _ tx */gpio _ init (gpioa,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,gpio _ pin _ 9 GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,gpio _ Pio _ ping usart _ de init (usart 0; usart _ baudrate _ set (usart 0,115200 ); usart_receive_config(usart0,USART_RECEIVE_ENABLE ); usart_transmit_config(usart0,USART_TRANSMIT_ENABLE ); usart_enable(usart0; nvic_IRQ_enable(usart0_irqn,0,0 ); usart_interrupt_enable(usart0,USART_INT_RBNE ); //usart _ interrupt _ enable (usart 0,USART_INT_TBE ); }/* USART0中断服务函数*参数:无*返回值:无*//* USART0中断服务程序*/uint8_t Ins_Flag=0; uint8_t show_Flag1_BRUSH=RESET; uint8_ t show _ flag2_ side _ motor=reset; uint8_ t show _ flag3_ fun _ motor=reset; uint8_ t show _ flag4_ MB _ motor=reset; uint8_ t show _ flag5_ charger _ motor=reset; uint8_ t show _ flag6_ down _ motor=reset; uint8_ t show _ flag7_ bump _ motor=reset; uint8_ t show _ flag8_ soft _ motor=reset; voidusart0_IRQHandler(void ) { uint8_t tag; if (复位!=usart _ interrupt _ flag _ get (usart 0,USART_INT_FLAG_RBNE ) (/* readonebytefromthereceivedataregister * ) if(tag=='s ' ) { Ins_Flag=1; }if(ins_flag==1) switch ) tag ) { case 'E': Ins_Flag=0; 黑; case '1': show_Flag1_BRUSH=! show_Flag1_BRUSH; 黑; case '2' : show _ flag2_ side _ motor=! show_Flag2_SIDE_MOTOR; 黑; case '3' : show _ flag3_ fun _ motor=! show_Flag3_FUN_MOTOR; 黑; case '4' : show _ flag4_ MB _ motor=! show_Flag4_MB_MOTOR; 黑; case '5' : show _ flag5_ charger _ motor=! show_Flag5_CHARGER_MOTOR; break; case '6': show_Flag6_DOWN_MOTOR = !show_Flag6_DOWN_MOTOR; break; case '7': show_Flag7_BUMP_MOTOR = !show_Flag7_BUMP_MOTOR; break; case '8': show_Flag8_SOFT_MOTOR = !show_Flag8_SOFT_MOTOR; break; default: break; } } usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE); }}#endifvoid show_data(void){ if (show_Flag1_BRUSH == RESET) { } if (show_Flag2_SIDE_MOTOR == RESET) { } if (show_Flag3_FUN_MOTOR == RESET) { } if (show_Flag4_MB_MOTOR == RESET) { } if (show_Flag5_CHARGER_MOTOR == RESET) { } if (show_Flag6_DOWN_MOTOR == RESET) { } if (show_Flag7_BUMP_MOTOR == RESET) { } if (show_Flag8_SOFT_MOTOR == RESET) { }}#if 0void Usart3_Config(void){ /* enable USART clock */ rcu_periph_clock_enable(RCU_USART0); usart_deinit(USART0); /* connect port to USARTx_Tx */ gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); /* connect port to USARTx_Rx */ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); usart_deinit(USART0); usart_baudrate_set(USART0, 115200); usart_receive_config(USART0, USART_RECEIVE_ENABLE); usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); usart_enable(USART0);}/* UART3 中断服务函数 * 参数:无 * 返回值:无*//* 串口3中断服务程序 */void UART3_IRQHandler(void){ if (RESET != usart_interrupt_flag_get(UART3, USART_INT_FLAG_IDLE)) //空闲中断 { usart_interrupt_flag_clear(UART3, USART_INT_FLAG_IDLE); /* 清除空闲中断标志位 */ usart_data_receive(UART3); /* 清除接收完成标志位 */ dma_channel_disable(DMA1, DMA_CH2); /* 关闭DMA传输 */ USART_RX_NUM = sizeof(dma_buffer) - dma_transfer_number_get(DMA1, DMA_CH2); memcpy(rx0_date_buf, dma_buffer, USART_RX_NUM); /* 转存数据到待处理数据缓冲区*/ rx0_date_buf[USART_RX_NUM] = ''; /* 添加字符串结束符 */ /* 重新设置DMA传输 */ dma_memory_address_config(DMA1, DMA_CH2, (uint32_t)dma_buffer); dma_transfer_number_config(DMA1, DMA_CH2, sizeof(dma_buffer)); dma_channel_enable(DMA1, DMA_CH2); /* 开启DMA传输 */ }}#endifvoid UART3_Disable(void){ usart_deinit(USART0); usart_disable(USART0);}void UART3_DMA_INIT(){ dma_parameter_struct dma_init_struct; /* DMA配置参数结构体 */ rcu_periph_clock_enable(RCU_GPIOC); /* 使能 GPIOA 时钟 */ rcu_periph_clock_enable(RCU_UART3); /* 使能 USART0 时钟 */ rcu_periph_clock_enable(RCU_DMA1); /* 使能 DMA0 时钟 */ /* connect port to USARTx_Tx */ gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10); /* connect port to USARTx_Rx */ gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11); /* USART configure */ usart_deinit(UART3); usart_baudrate_set(UART3, 115200U); usart_receive_config(UART3, USART_RECEIVE_ENABLE); usart_transmit_config(UART3, USART_TRANSMIT_ENABLE); usart_enable(UART3); /* USART0 DMA 接收配置*/ dma_deinit(DMA1, DMA_CH2); dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; /* 外设到内存 */ dma_init_struct.memory_addr = (uint32_t)dma_buffer; /* 设置内存接收基地址 */ dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; /* 内存地址递增 */ dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; /* 8位内存数据 */ dma_init_struct.number = sizeof(dma_buffer); dma_init_struct.periph_addr = UATR3_DATA_ADDRESS; /* 外设基地址,USART数据寄存器地址 ((uint32_t)0x40004C08) (uint32_t)USART_DATA(UART3)*/ dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; /* 外设地址不递增 */ dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; /* 8位外设数据 */ dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; /* 最高DMA通道优先级 */ dma_init(DMA1, DMA_CH2, dma_init_struct); /* 按照结构体的配置初始化DMA */ dma_circulation_disable(DMA1, DMA_CH2); /* 关闭DMA循环模式 */ dma_memory_to_memory_disable(DMA1, DMA_CH2); /* DMA内存到内存模式不开启 */ dma_channel_enable(DMA1, DMA_CH2); /* 使能DMA传输 */ usart_dma_receive_config(UART3, USART_DENR_ENABLE); /* USART0 DMA接收模式开启 */ nvic_irq_enable(UART3_IRQn, 0, 0); /* USART中断设置,抢占优先级0,子优先级0 */ usart_interrupt_enable(UART3, USART_INT_IDLE); /* 使能USART0空闲中断 */}

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。