历史上的今天
返回首页

历史上的今天

今天是:2024年10月09日(星期三)

正在发生

2020年10月09日 | STM32的串口采用DMA方式发送数据测试

2020-10-09 来源:eefocus

环境:


主机:WIN7


开发环境:MDK4.23


MCU:STM32F103CBT6



源代码:


配置:



//---------------------串口功能配置---------------------

//打开串口对应的外设时钟  

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);   

//启动DMA时钟

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

//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配置

DMA_DeInit(DMA1_Channel4);

//外设地址

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);

//内存地址

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Send_Buffer;

//dma传输方向单向

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

//设置DMA在传输时缓冲区的长度

DMA_InitStructure.DMA_BufferSize = 100;

//设置DMA的外设递增模式,一个外设

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

//设置DMA的内存递增模式

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

//外设数据字长

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

//内存数据字长

DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;

//设置DMA的传输模式

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

//设置DMA的优先级别

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

//设置DMA的2个memory中的变量互相访问

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

DMA_Init(DMA1_Channel4,&DMA_InitStructure);

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);

 

//使能通道4

//DMA_Cmd(DMA1_Channel4, ENABLE);

 

  

//初始化参数  

//USART_InitStructure.USART_BaudRate = DEFAULT_BAUD;  

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);  

//TXE发送中断,TC传输完成中断,RXNE接收中断,PE奇偶错误中断,可以是多个   

USART_ITConfig(USART1,USART_IT_RXNE,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方式发送

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);

//启动串口  

USART_Cmd(USART1, ENABLE);   

 

//设置IO口时钟      

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);    

//串口1的管脚初始化    

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                       //管脚9  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                //选择GPIO响应速度  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 //复用推挽输出  

GPIO_Init(GPIOA, &GPIO_InitStructure);                          //TX初始化  

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                      //管脚10  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                //选择GPIO响应速度  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;           //浮空输入  

GPIO_Init(GPIOA, &GPIO_InitStructure);                          //RX初始化                                                      

 

//设置IO口时钟      

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);   

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                       //管脚9  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                //选择GPIO响应速度  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 //复用推挽输出  


中断函数:


//串口1DMA方式发送中断

void DMA1_Channel4_IRQHandler(void)

{

//清除标志位

  DMA_ClearFlag(DMA1_FLAG_TC4);

//DMA_ClearITPendingBit(DMA1_FLAG_TC4);

  //DMA1->IFCR |= DMA1_FLAG_TC4;

//关闭DMA

DMA_Cmd(DMA1_Channel4,DISABLE);

  //DMA1_Channel4->CCR &= ~(1<<0);

 

//允许再次发送

Flag_Uart_Send = 0;

}


发送测试:


//串口DMA发送测试

Uart_Send_Buffer[0] = 1;

Uart_Send_Buffer[1] = 2;

Uart_Send_Buffer[2] = 3;

Uart_Send_Buffer[3] = 4;

Uart_Send_Buffer[4] = 5;

i = 1;

while (1)

{

//检查串口是否可以发送

while (Flag_Uart_Send);

Flag_Uart_Send = 1;

//设置传输数据长度

DMA_SetCurrDataCounter(DMA1_Channel4,i);

//打开DMA

DMA_Cmd(DMA1_Channel4,ENABLE);

i++;

if (i > 5)

{

i = 1;

}

}


推荐阅读

史海拾趣

Eska公司的发展小趣事

为了满足全球客户的需求,Eska公司实施了市场拓展和国际化战略。公司在欧洲各大主要城市及美国设立了服务中心,以便为当地客户提供快速可靠的服务。此外,Eska还利用先进的分切设备,为当地客户集中快速地提供载切大小格式灰板的服务。同时,Eska的产品也通过全球代理商、经销商及存货商网络,覆盖到更广泛的市场。

Circuit Technology Inc公司的发展小趣事

随着国内市场的饱和,CTI开始将目光投向海外市场。公司制定了国际化发展战略,积极开拓国际市场。通过设立海外分支机构、参加国际展会等方式,CTI的产品逐渐打入国际市场,并获得了良好的口碑。同时,公司还与国外企业开展技术合作和产品研发,进一步提升了公司的国际化水平。

Connor-Winfield公司的发展小趣事

在电子行业中,技术的创新和产品的品质是企业生存和发展的关键。Connor-Winfield深知这一点,因此在发展过程中始终注重技术创新和品质提升。公司投入大量资源进行研发,不断推出具有创新性和高性能的产品。同时,公司还建立了严格的质量管理体系,确保每一件产品都符合最高的品质标准。这些努力使得Connor-Winfield的产品在市场上赢得了良好的口碑。

宁波晨翔电子(CONNFLY)公司的发展小趣事

随着技术的不断积累和创新,晨翔电子在智能仪表、LED照明、无线网络等领域取得了显著的技术突破。公司不仅成功研发出多款具有竞争力的产品,还积极拓展国内外市场,与多家知名企业建立了长期稳定的合作关系。这一时期的成功,为晨翔电子的后续发展奠定了坚实的基础。

友盟(AP)公司的发展小趣事

在追求商业成功的同时,友盟(AP)公司也积极履行社会责任,致力于可持续发展。公司关注环境保护、公益事业等方面的问题,积极参与相关活动和项目。同时,友盟还通过技术创新和产品优化,推动电子行业的绿色发展和数字化转型。这些努力不仅提升了公司的社会形象,也为其未来的发展注入了新的动力。

以上是关于电子行业里友盟(AP)公司发展起来的5个相关故事。这些故事从不同角度展现了友盟在技术创新、合作伙伴关系、市场拓展、人才团队建设以及社会责任等方面的努力和成就。当然,每个公司的发展都是一个复杂而多元的过程,这些故事只是其中的一部分。

EDAL公司的发展小趣事

EDAL公司成立于XXXX年,由一群富有远见和创新精神的电子工程师创立。公司初期专注于电子设计自动化(EDA)工具的研发,致力于提升集成电路设计的效率和质量。EDAL公司凭借其独特的算法和高效的设计工具,在EDA领域崭露头角,吸引了众多客户的关注。

问答坊 | AI 解惑

射频识别技术原理分析

射频识别(RFID)技术相对于传统的磁卡及IC卡技术具有非接触、阅读速度快、无磨损等特点,在最近几年里得到快速发展。为加强中国工程师对该技术的理解,本文详细介绍了RFID技术的工作原理、分类、标准以及相关应用。 RFID技术利用无线射频方式在阅读 ...…

查看全部问答>

富士康问题,非我辈能解决的

和富士康XDJM一样我们都是打工的,但真心希望他们好好生活,不行就回家种田。现实就是这样,这样抗争也没法改变!…

查看全部问答>

Ecocoon

在紧张快节奏的生活中。外部的噪音常常使我们没措施静下心来享受生活。Ecocoon就是一个可以替你拦阻喧闹的设计。通过选择,高,中,低频率过滤环境噪音。用户甚至可能完整关闭所有的背景噪音。在这个嘈杂的环境中,偶尔也静静的凝听沉在心底的安静 ...…

查看全部问答>

摄像头图像黑边

   请问一下,我的摄像头像出来的图像左右2边有黑边。左边稍细,右边粗点。我是用的6410的开发板,摄像头数据是从saa7113输入的。问过开发板的技术支持,说有可能是行场不同步造成的,叫我们改下相关参数。我看了下saa7113的驱动,在头文 ...…

查看全部问答>

请问怎样能读取ieee1284接口(打印机接口)的信息,谢谢!

我这有台设备,由于设备的控制部分不是电脑,只是简单的工控机,所以外部接口只有打印机接口,请问有什么办法能将打印机接口的信息在电脑内读出来,谢谢!…

查看全部问答>

求助

我要做个很简单的东西 用个小数字键盘输入0000~9999这几个数字 中间用.隔开,之后保存成TXT文件 然后可以通过USB把这些数据与电脑传输 各位大哥有啥好建议 即将学校毕业 想做这个东西 …

查看全部问答>

atof()函数怎么用?

我写了一些代码:如下 TCHAR sAlarm[10]; m_alarmCo.GetWindowText(sAlarm,10); double alarm; alarm=atof(sAlarm); 编译报错。 --------------------Configuration: DJS - Win32 (WCE x86) Debug-------------------- Compiling... Alarm. ...…

查看全部问答>

请好心人帮忙解答 高分求助

---------------------------------------------------- entity frequencydivider is     Port ( clk : in  STD_LOGIC;            clk_div2 : out  STD_LOGIC;   ...…

查看全部问答>

STM8什么时候出个带USB的?

                                  …

查看全部问答>

开始试用MSP430 C2500套件

准备开始试用MSP430 C2500套件,先是要将平台搭建好,具体光盘资料上有详细。     虽然套件说明上有适用温度范围,但是咱还是自己测试下比较放心,先测试下最高能承受的温度,用火烤…… 下午再测试下最低温度…… 注意:本测试纯属娱 ...…

查看全部问答>