中级会员
- 积分
- 204
- 金钱
- 204
- 注册时间
- 2017-8-20
- 在线时间
- 49 小时
|
发表于 2018-8-17 18:26:06
|
显示全部楼层
我这有个DMA传输的实际工程程序,你参考一下,将USART1_TX的关联参数改到USART2_TX就能运行的
u8 usart_tx_data[18]; //发送寄存器
u8 usart_rx_data[18]; //接收寄存器
void usart_tx_rx_init(void)
{
usart_io_lever_init();
//USART_DeInit(USART1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//最高输出速率50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化外设GPIOx寄存器
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//最高输出速率10MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化外设GPIOx寄存器
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;//波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1;//在帧结尾传输1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制失能
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送和接收都使能
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1, ENABLE);//使能或者失能USART外设
}
void usart_tx_rx_dma_init(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//usart_dma_tx 部分INIT
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(USART1->DR);//(USART1_BASE + 0X04);//外设基地址 (u32)&(USART1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)usart_tx_data;//内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设作为数据传输的来源
DMA_InitStructure.DMA_BufferSize = 18;//指定DMA通道的DMA缓存的大小,单位为数据单位
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_Low;//非常高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//非内存到内存传输
DMA_Init(DMA1_Channel4, &DMA_InitStructure);//初始化外设CAN的寄存器
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); //发送USART1 发送请求
DMA_SetCurrDataCounter(DMA1_Channel4,18);//从新设置缓冲大小,指向数组0
//DMA_Cmd(DMA1_Channel4,ENABLE);//使能或者失能指定的通道x(DMA1 通道4)
//android TX DMA 中断配置
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
//usart_dma_RX 部分INIT
//DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(USART1->DR);//(USART1_BASE + 0X04);//外设基地址 (u32)&(USART1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)usart_rx_data;//内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//内存作为数据传输的来源
DMA_InitStructure.DMA_BufferSize = 18;//指定DMA通道的DMA缓存的大小,单位为数据单位
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_PeripheralDataSize_Byte;//数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//工作在正常模式.
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;//非常高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//非内存到内存传输
DMA_Init(DMA1_Channel5, &DMA_InitStructure);//初始化外设DMA的寄存器
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); //发送USART1 发送请求
DMA_SetCurrDataCounter(DMA1_Channel5,18);//从新设置缓冲大小,指向数组0
DMA_Cmd(DMA1_Channel5,ENABLE);//使能或者失能指定的通道x(DMA1 通道4)
//android RX DMA 中断配置
//NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
}
/* DMA_USART1 TX 传输完成中断服务函数 */
void DMA1_Channel4_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_FLAG_TC4)) /* 获取 DMA_USART1传输完成中断标志 */
{
DMA_Cmd(DMA1_Channel4, DISABLE); /* 失能 DMA_USART1 */
DMA_ClearITPendingBit(DMA1_IT_GL4); /* 清除 DMA_USART1 传输完成中断标志位,否则程序会无限陷入中断 */
DMA_SetCurrDataCounter(DMA1_Channel4,18);//从新设置缓冲大小,指向数组0
//DMA_Cmd(DMA1_Channel4, ENABLE); /* 重新使能 DMA_USART1 */
//不能加以上这句,不然它会连续发送.
}
}
/* DMA_USART1 RX 传输完成中断服务函数 */
void DMA1_Channel5_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_FLAG_TC5)) /* 获取 DMA_USART1传输完成中断标志 */
{
DMA_Cmd(DMA1_Channel5, DISABLE); /* 失能 DMA_USART1 */
DMA_ClearITPendingBit(DMA1_IT_GL5); /* 清除 DMA_USART1 传输完成中断标志位,否则程序会无限陷入中断 */
DMA_SetCurrDataCounter(DMA1_Channel5,18);//从新设置缓冲大小,指向数组0
DMA_Cmd(DMA1_Channel5, ENABLE); /* 重新使能 DMA_USART1 */
//接收的可以加以上这句,随时准备接收.
}
}
具体自己理解,反正我这是正常的程序,一次要连续发18个字节数据,当然你可改为你想要的数量字节 |
|