void usart_dma_init(void)

news/发布时间2024/5/3 4:08:15
void usart_dma_init(void)
{GPIO_InitTypeDef    GPIO_InitStructure;USART_InitTypeDef    USART_InitStructure;DMA_InitTypeDef        DMA_InitStructure;NVIC_InitTypeDef    NVIC_InitStructure;/*  配置GPIO的模式和IO口 */    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;                    //TXGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;            //复用推挽输出GPIO_Init(GPIOA,&GPIO_InitStructure);                    //初始化串口输入IOGPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;                //RXGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;        //模拟输入GPIO_Init(GPIOA,&GPIO_InitStructure);     /*初始化串口接收和发送函数*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);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_InitStructure.USART_BaudRate = DEFAULT_BAUD; /*初始化串口*/USART_Init(USART1,&USART_InitStructure);/*中断配置*/USART_ITConfig(USART1,USART_IT_TC,DISABLE);USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);USART_ITConfig(USART1,USART_IT_IDLE,ENABLE); //配置UART1中断  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;              //通道设置为串口1中断  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;      //中断占先等级0  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;             //中断响应优先级0  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //打开中断  NVIC_Init(&NVIC_InitStructure);/*DMA发送中断设置*/NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/*DMA1通道4配置发送*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel4);DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Send_Buffer;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStructure.DMA_BufferSize = 100;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel4,&DMA_InitStructure);DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);//DMA_Cmd(DMA1_Channel4, ENABLE);//使能通道4,一般发送的时候再使能/*DMA1通道5配置接收*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel5);DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Rx;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = UART_RX_LEN;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel5,&DMA_InitStructure);/*使能通道5*/DMA_Cmd(DMA1_Channel5,ENABLE);//采用DMA方式发送
    USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//采用DMA方式接收
    USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);//启动串口  
    USART_Cmd(USART1, ENABLE);
}
View Code
/**@ brief 使能发送数据** 启动DMA数据发送功能* * @param size表示需要发送的DMA中数据的个数*/
void uart_dma_send_enable(uint16_t size)
{DMA1_Channel4->CNDTR = (uint16_t)size; DMA_Cmd(DMA1_Channel4, ENABLE);       
}    /**@ brief串口1接收中断** 收到一帧数据进入一次,进行DMA的读取* */
void USART1_IRQHandler(void)                               
{   uint32_t temp = 0;uint16_t i = 0;if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET){//USART_ClearFlag(USART1,USART_IT_IDLE);temp = USART1->SR;temp = USART1->DR; //清USART_IT_IDLE标志
        DMA_Cmd(DMA1_Channel5,DISABLE);temp = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel5);for (i = 0;i < temp;i++){Data_Receive_Usart = Uart_Rx[i];//+++对收到的数据加一后回发出去        Uart_Send_Buffer[i]=Data_Receive_Usart+1;                        //+++            
        }//uart_dma_send_enable(temp);//设置传输数据长度
        DMA_SetCurrDataCounter(DMA1_Channel5,UART_RX_LEN);//打开DMA
        DMA_Cmd(DMA1_Channel5,ENABLE);} 
}     /**@ brief DMA发送中断** 发送数据,将DMA中的数据发送出去* */
void DMA1_Channel4_IRQHandler(void)
{if(DMA_GetITStatus(DMA1_FLAG_TC4)==SET){DMA_ClearFlag(DMA1_FLAG_GL4);        DMA_Cmd(DMA1_Channel4, DISABLE);  }
}
View Code
int main()
{    usart_dma_init();    while(1){uart_dma_send_enable(5);delay_ms(100);}
}
View Code

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/06612718.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

k8s-调度-taint

NoSchedule :表示k8s将不会将Pod调度到具有该污点的Node上 PreferNoSchedule :表示k8s将尽量避免将Pod调度到具有该污点的Node上 NoExecute :表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去去除污点 kubectl taint nodes k8s-node2 chec…

Cisco Nexus 9000 Series Switches, NX-OS Standalone 10.4(3)F and ACI Mode 16.0(5h)

Cisco Nexus 9000 Series Switches, NX-OS Standalone 10.4(3)F and ACI Mode 16.0(5h)Cisco Nexus 9000 Series Switches, NX-OS Standalone 10.4(3)F and ACI Mode 16.0(5h) include Application Policy Infrastructure Controller (APIC) Release 6.0(5h) 请访问原文链接:C…

003提供器(provider)

一、介绍 提供器是 Nest 中的一个基本概念。 许多基本的 Nest 类可以被视为提供器,例如: 服务、存储库、工厂、助手等等。 提供器的主要思想是它可以作为依赖注入;这意味着对象之间可以创建各种关系,并且 "接线" 这些对象的功能很大程度上可以委托给 Nest 运行时…

SQL事前巡检插件

背景: 事故频发 •每年都会看到SQL问题引发的线上问题 不易发觉 •对于SQL性能问题测试在预发环境不易发现 •saas系统隔离字段在SQL条件中遗漏,造成越权风险 •业务初期SQL没问题,业务增长容易出现事故 •DBS慢SQL不支持实时报警,无法及时发现 •靠大家review代码总会出现遗…

.NET MAUI开源免费的UI工具包 - Uranium

前言 一直有小伙伴在微信公众号后台留言让我分享一下.NET MAUI相关的UI框架,今天大姚分享一个.NET MAUI开源、免费的UI工具包:Uranium。Uranium介绍 Uranium是一个.NET MAUI开源免费的UI工具包。它提供了一组用于构建现代应用程序的控件和实用程序,它构建在.NET MAUI基础架构…

[转帖]Ctrip Network Architecture Evolution in the Cloud Computing Era

http://arthurchiao.art/blog/ctrip-network-arch-evolution/ Preface This article comes from my talk Ctrip Network Architecture Evolution in the Cloud Computing Era in GOPS 2019 Shenzhen (a tech conference in Chinese).中文版:云计算时代携程的网络架构变迁。Pr…