如何采用STM32单片机读取可变长度数据到内存.doc

上传人:白大夫 文档编号:3429812 上传时间:2019-08-24 格式:DOC 页数:4 大小:24KB
返回 下载 相关 举报
如何采用STM32单片机读取可变长度数据到内存.doc_第1页
第1页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《如何采用STM32单片机读取可变长度数据到内存.doc》由会员分享,可在线阅读,更多相关《如何采用STM32单片机读取可变长度数据到内存.doc(4页珍藏版)》请在三一文库上搜索。

1、如何采用STM32单片机读取可变长度数据到内存首先要解决DMA怎么知道要接收的数据何时开始,何时结束的问题。而且每次传输完数据,要改变下一次数据长度。如果把DMA设成循环模式肯定是不行的,所以把DMA设置成正常模式。STM32的串口有监测总线是否处于空闲的功能,我们可以使用这个功能,当数据传输完总线变成空闲状态时产生中断,来对收到的数据进行处理。因此整个过程就变成:当一堆数据开始传输,DMA默默地把数据搬运到内存中,当这堆数据传输完成,总线变成空闲状态时,马上产生中断,在中断服务程序中去做相应处理。初始化程序:#defineDMA_Rec_Len10/数据缓冲区大小u8valueDMA_Rec

2、_Len;voiduart_init_DMA_IN(u32bound)/GPIO端口设置GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;DMA_InitTypeDefDMA_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);/使能USART1,GPIOA时钟RCC_AHBPeriphClockCmd(RCC

3、_AHBPeriph_DMA1,ENABLE);/使能DMA传输/RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);/使能USART2时钟USART_DeInit(USART1);/复位串口1/USART1_TXPA.9GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;/PA.9GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;/复用推挽输出GPIO_Init(GPIOA,/初始

4、化PA9/USART1_RXA.10GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;/浮空输入GPIO_Init(GPIOA,/初始化PA10/Usart1NVIC配置NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreempTIonPriority=3;/抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPri

5、ority=3;/子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;/IRQ通道使能NVIC_Init(/根据指定的参数初始化VIC寄存器/USART初始化设置USART_InitStructure.USART_BaudRate=bound;/一般设置为9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;/字长为8位数据格式USART_InitStructure.USART_StopBits=USART_StopBits_1;/一个停止位USART_InitStructur

6、e.USART_Parity=USART_Parity_No;/无奇偶校验位USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;/无硬件数据流控制USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;/收发模式USART_Init(USART1,/初始化串口USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);/开启空闲中断USART_DMACmd(USART1,USART_DMAReq_Rx,E

7、NABLE);/使能串口1DMA接收USART_Cmd(USART1,ENABLE);/使能串口/相应的DMA配置DMA_DeInit(DMA1_Channel5);/将DMA的通道5寄存器重设为缺省值串口1对应的是DMA通道5DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)/DMA外设ADC基地址DMA_InitStructure.DMA_MemoryBaseAddr=(u32)value;/DMA内存基地址DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;/数据传输方向,从外设读取发送到内存DMA_I

8、nitStructure.DMA_BufferSize=DMA_Rec_Len;/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_MemoryDataS

9、ize=DMA_MemoryDataSize_Byte;/数据宽度为8位DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;/工作在正常缓存模式DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;/DMA通道x拥有中优先级DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;/DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel5,/根据DMA_InitStruct中指定的参数初始化DMA的通道DMA_Cmd(DMA1_Channel5,ENABLE);/

10、正式驱动DMA传输中断服务程序:voidUSART1_IRQHandler(void)/串口1中断服务程序chari;if(USART_GeTITStatus(USART1,USART_IT_IDLE)!=RESET)/接收中断(接收到的数据必须是0x0d0x0a结尾)USART_ReceiveData(USART1);/读取数据注意:这句必须要,否则不能够清除中断标志位。Usart1_Rec_Cnt=DMA_Rec_Len-DMA_GetCurrDataCounter(DMA1_Channel5);/算出接本帧数据长度/*帧数据处理函数*/printf(“Thelenght:%drn”,Us

11、art1_Rec_Cnt);printf(“Thedata:rn”);for(i=0;iUSART_SendData(USART1,valuei);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)=RESET);printf(“rnOver!rn”);/*/USART_ClearITPendingBit(USART1,USART_IT_IDLE);/清除中断标志DMA_Cmd(DMA1_Channel5,DISABLE);/重新设置传输数据长度DMA_SetCurrDataCounter(DMA1_Channel5,DMA_Rec_Len);DMA_Cmd(DMA1_Channel5,ENABLE);/开始下一次DMA设置DMA为正常模式,即只传输一次,当完成一次数据传输后,进入中断,对接收到的数据进行处理。然后清除中断标志,重新启动DMA进行下一次传输。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1