历史上的今天
今天是:2024年09月11日(星期三)
2018年09月11日 | STM32串口+DMA的使用2
2018-09-11 来源:eefocus
uint8_t UART4_Rx_buffer[512],UART4_Rx_num;
void UART4_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //选择NVIC优先级分组0
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
//串口4所使用管脚输出输入定义
//定义UART4 Tx (PC.10)脚为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //IO口的第2脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //IO口复用推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化串口1输出IO口
//定义 UART4 Rx (PC.11)为悬空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //IO口的第3脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//IO口悬空输入
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化串口1输入IO口
//串口4参数初始化定义部分,串口1参数为9600 , 8 ,1 ,N 接收中断方式
USART_InitStructure.USART_BaudRate = 9600; //设定传输速率
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(UART4, &USART_InitStructure); //初始化串口4
USART_ITConfig(UART4, USART_IT_IDLE,ENABLE); //使能串口4接收中断
USART_Cmd(UART4, ENABLE); //使能串口4
USART_ClearFlag(UART4, USART_FLAG_TC); // 清标志(后增加)
DMA_DeInit(DMA2_Channel3); //重置DMA 2通道配置
DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004C04; //外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)UART4_Rx_buffer; //内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据目的地
DMA_InitStructure.DMA_BufferSize = 512; //DMA缓存大小:BufferSize
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_Circular; //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //设置DMA通道优先级为高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止DMA通道设置为内存至内存传输
DMA_Init(DMA2_Channel3, &DMA_InitStructure); //初始化
DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE);
DMA_ITConfig(DMA2_Channel3, DMA_IT_TE, ENABLE);
USART_DMACmd(UART4, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA2_Channel3, ENABLE);
//使能串口4中断
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void UART4_IRQHandler(void)
{
uint16_t i;
uint16_t Data_Len;
if(USART_GetITStatus(UART4, USART_IT_IDLE) != RESET) //如果为中断
{
DMA_Cmd(DMA2_Channel3, DISABLE);
Data_Len=512-DMA_GetCurrDataCounter(DMA2_Channel3);
USART_PutStr(USART1,UART4_Rx_buffer,Data_Len);
UART4_Rx_num=0;
DMA_ClearFlag(DMA2_FLAG_GL3 | DMA2_FLAG_TC3 | DMA2_FLAG_TE3 | DMA2_FLAG_HT3); //清标志
DMA2_Channel3->CNDTR = 512; //重装填
DMA_Cmd(DMA2_Channel3, ENABLE); //处理完,重开DMA
//读SR后读DR清除IDLE
i = UART4->SR;
i = UART4->DR;
if(i) i=0;
if(Data_Len) Data_Len=0;
}
}
if(USART_GetITStatus(UART4, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)
{ //出错
USART_ClearITPendingBit(UART4, USART_IT_PE | USART_IT_FE | USART_IT_NE);
USART_ClearITPendingBit(UART4, USART_IT_TC);
USART_ClearITPendingBit(UART4, USART_IT_IDLE);
void DMA2_Channel3_IRQHandler(void)
USART_PutStr(USART1," DMA23:\r\n",9);
DMA_ClearITPendingBit(DMA2_IT_TC3);
DMA_ClearITPendingBit(DMA2_IT_TE3);
DMA_Cmd(DMA2_Channel3, DISABLE); //关闭DMA,防止处理其间有数据
DMA2_Channel3->CNDTR = 512; //重装填
DMA_Cmd(DMA2_Channel3, ENABLE); //处理完,重开DMA
}
上一篇:STM32库中几个重要的文件说明
下一篇:STM32串口+DMA使用1
史海拾趣
|
使用VxWorks时出现了问题,请教各位,给点儿建议!cpu是MPC862 自己编了个小程序,在Tornador里结合VxWorks一起. 程序很简单,就是读存储器! xd0 = *(unsigned int *)(SDRAM_ADR); xd1 = *(unsigned int *)(BOOTFLASH_ADR); xd2 = *(unsigned short int *)(FLASH_ADR); 我的存储器有三种,一个是SDRAM,32位;一 ...… 查看全部问答> |
|
最近开始学习\"劭贝贝\"的,里面的例子需要bc45,费了好大劲终于找到了.现提供连接如下: borland c++ v4.5 Part3 http://www.tomore.com/3/23811.html borland ...… 查看全部问答> |
|
热地:开关电源无需使用变压器,其开关电路的“地”和市电电网有关,既所谓的“热地”,它是带电的 冷地:由于开关电源的高频变压器将输入、输出端隔离;又由于其反馈电路常用光电耦合、既能传送反馈信号又将双方的“地”隔离;所以输出端的地称之 ...… 查看全部问答> |
|
STM32101VCT6SRAM(62256)cpld7128lcd12232测试版电路 attach]20052[/attach]原理图 这个是62256的电路,贴出来 下载 (950.99 KB) 2010-3-26 10:05 电路描述:FSMC_NADV经非门后接573的锁存脚,FSMC_NE1接62256的片选/CS,FSMC_NOE接62256的/OE,FSMC_NOE接62256的/WE STM ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 11:43 编辑 本帖主要回顾集成运放在电路中的使用,即集成运算放大电路,前两贴作为此贴的基础,我采用循序渐进的阐述方法 1.F007放大电路 F007是通用型集成运放,它由正负15V两路电源供电。从+ ...… 查看全部问答> |
|
我是一个新人,对飞思卡尔单片机使用的不是很熟,最近在使用飞思卡尔128单片机和nrf905之间做一个无线传输的小协议,选择飞思卡尔为主机模式,并且作为接收终端,用于接收我的发送数据。我的发送端是用51做到已经好使了,没有问题了(发送端暂且不 ...… 查看全部问答> |
|
请求 继续团购 MSP430 LaunchPad MSP-EXP430G2 25元不用包邮啊 请求 继续团购 MSP430 LaunchPad MSP-EXP430G2 25元不用包邮啊 30元 也可以试试 [ 本帖最后由 ppiicc 于 2012-5-3 22:53 编辑 ]… 查看全部问答> |
|
这个算是个遗憾帖吧。 本来还准备了两个实验,但鉴于时间问题,不能在活动结束前完成了。不过等做完我会来让大家看看的。 其中一个是GPS的实验,模块已经买回来了,只 ...… 查看全部问答> |




