历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2019年02月13日 | stm32f030超时定时器+Dma的配置

2019-02-13 来源:eefocus

经常我们会用到空闲中断IDLE,但是空闲中断默认一个BIT接收不到就是超时,而在超时中断中,超时时间是可以自己设定的, 


 超时时间根据波特率以及超时规定的字节个数来确定。此处的超时时间是 40 * (1/19200).


#define USART_ReceiverTimeOut 40

 

void DMA_Configuration(void)

{

    DMA_InitTypeDef DMA_InitStructure;

    

  /* DMA1 Channe3 (triggered by UART1 Rx event) Config */

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //启动DMA时钟

    DMA_DeInit(DMA1_Channel3);  //DMA1通道3配置

   

    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->RDR);          //外设地址  

    DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)RecvBuf;   //内存地址    

    DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;       //DMA传输方向单向:SRC 外设到内存 DST内存到外设

    DMA_InitStructure.DMA_BufferSize         = MODBUS_BUF_LEN;      //设置DMA在传输时缓冲区的长度

    DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;   //设置DMA的外设递增模式,一个外设   

    DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;        //设置DMA的内存递增模式  

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据字长 

    DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;     //内存数据字长  

    DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;             //设置DMA的传输模式  

    DMA_InitStructure.DMA_Priority           = DMA_Priority_VeryHigh;       //设置DMA的优先级别  

    DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;             //设置DMA的2个memory中的变量互相访问  

    DMA_Init(DMA1_Channel3,&DMA_InitStructure);     

    DMA_Cmd(DMA1_Channel3,ENABLE);  //使能通道3

}

void USART_DMA_Configuration(u32 ModbusBound){

   //定义串口初始化结构体

        USART_InitTypeDef  USART_InitStructure;

        GPIO_InitTypeDef    GPIO_InitStructure;

 

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); 

 

        /* USART1 Pins configuration ******/  

        /* Connect pin to Periph */

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); 

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);  

 

        /* Configure pins as AF pushpull */

 

        // USART1_TX -> PA9 , USART1_RX -> PA10             

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

        GPIO_Init(GPIOA, &GPIO_InitStructure);


        DMA_Configuration();   

        

        /*串口通讯参数设置*/

        USART_InitStructure.USART_BaudRate = ModbusBound;//波特率的设置

        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_Rx | USART_Mode_Tx;//收发模式  

   

       

       USART_SetReceiverTimeOut(USART1,            USART_ReceiverTimeOut);//=========================

       USART_ReceiverTimeOutCmd(USART1, ENABLE);//======================================

        USART_Init(USART1,&USART_InitStructure);        //初始化串口

 

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

        USART_ITConfig(USART1,USART_IT_TC,DISABLE);

        USART_ITConfig(USART1,USART_IT_RXNE,DISABLE); //关闭接收中断

 

        USART_ITConfig(USART1, USART_IT_RTO, ENABLE);//接收超时中断

//采用DMA方式发送 USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); 

//采用DMA方式接收 

        USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);   // 使能 USART1接收DMA        

        USART_Cmd(USART1, ENABLE); //使能串口

 

        /* USART1的NVIC中断配置 */

        NVIC_Configuration( );

}

 

/**

* @file USART1_IRQHandler

* @brief USART1中断处理A

* @param 无

* @retval 无

*/  

 

//串口1接收中断 

void USART1_IRQHandler(void) 

    u8 i = 0;

    if(USART_GetITStatus (USART1, USART_IT_RTO) != RESET)//一帧结束后进入中断

    { 

USART_ClearITPendingBit(USART1, USART_IT_RTO); //清除RTO中断 ,否则会一直进入中断

        DMA_Cmd(DMA1_Channel3,DISABLE); //关闭DMA,也就是说一帧接收完后就不再接收数据

        RecvDataflag = 1;

        RecvLen = MODBUS_BUF_LEN - DMA_GetCurrDataCounter(DMA1_Channel3); //得到本次接收数据帧的长度 

        /* DMA_GetCurrDataCounter(DMAn_Channelx):在当前的DMA Channelx中保留剩余的数据单元的数量*/    

                                。

                                。

                        。

        //设置DMA通道DMA缓存大小,必须在DMA关闭的情况下才能设置,设置好后打开DMA

        DMA_SetCurrDataCounter(DMA1_Channel3,MODBUS_BUF_LEN);                       

        //打开DMA 

        DMA_Cmd(DMA1_Channel3,ENABLE); //恢复DMA指针,等待下一次的接收

    }

推荐阅读

史海拾趣

Davico Industrial Ltd公司的发展小趣事

Davico Industrial Ltd公司发展故事一:技术突破与创新

Davico Industrial Ltd公司自创立以来,始终将技术创新作为企业发展的核心动力。在公司成立初期,面对电子行业竞争激烈的局面,Davico凭借对市场的敏锐洞察和对技术的不断追求,成功研发出了一款具有划时代意义的电子元器件。这款产品以其高性能、低能耗的特点,迅速在市场中占据了一席之地。此后,Davico不断加大对研发的投入,通过引进高端人才、建立先进的研发实验室等举措,持续推出了一系列具有竞争力的新产品,为公司的发展奠定了坚实的基础。

Davico Industrial Ltd公司发展故事二:市场拓展与品牌建设

随着技术实力的不断增强,Davico开始积极拓展国内外市场。公司通过与国内外知名企业的合作,不断提升产品的知名度和美誉度。同时,Davico还积极参与各类行业展会和论坛,展示公司的最新成果和技术实力,赢得了广大客户的认可和信赖。在品牌建设方面,Davico注重塑造企业形象和文化内涵,通过广告宣传、公益活动等方式,提高了品牌的社会影响力和知名度。

Davico Industrial Ltd公司发展故事三:质量管理与持续改进

Davico深知产品质量对于企业生存和发展的重要性。因此,公司始终将质量管理放在首位,建立了完善的质量管理体系和检测手段。通过对生产过程的严格控制和对产品质量的不断追求,Davico的产品在市场中赢得了良好的口碑。同时,公司还积极开展持续改进活动,通过引进先进的生产设备和工艺、优化生产流程等措施,不断提高生产效率和产品质量。

Davico Industrial Ltd公司发展故事四:人才战略与团队建设

Davico高度重视人才队伍建设,通过制定合理的人才战略和激励机制,吸引了一批批优秀的人才加入公司。公司注重员工的培训和发展,通过定期的技能培训、知识更新等活动,不断提升员工的综合素质和专业技能。同时,Davico还建立了完善的团队协作机制,鼓励员工之间的沟通和合作,形成了一支高效、团结、富有战斗力的团队。

Davico Industrial Ltd公司发展故事五:绿色发展与社会责任

随着全球环保意识的不断提高,Davico积极响应国家绿色发展的号召,将环保理念融入到企业的生产经营中。公司通过引进环保设备、改进生产工艺等措施,降低了生产过程中的能耗和污染排放。同时,Davico还积极参与社会公益事业,通过捐款捐物、扶贫济困等方式,回馈社会、造福人民。这些举措不仅提升了企业的社会形象,也为公司的长远发展注入了新的动力。

Holtek(合泰)公司的发展小趣事

Holtek(合泰)公司电子行业的五个发展故事

故事一:初创与台湾半导体产业的崛起

1983年,合德集成电路的成立标志着Holtek(合泰)的前身正式踏入半导体行业,为台湾半导体产业开启了新篇章。随着技术的不断积累和市场需求的增长,1988年,合泰半导体在新竹科学园区的建立,成为公司在晶圆制造领域的重要里程碑。这一时期,合泰半导体专注于技术创新与品质提升,逐步在竞争激烈的半导体市场中站稳脚跟,为后续的快速发展奠定了坚实基础。

故事二:晶圆制造与全球市场的拓展

进入90年代,合泰半导体迎来了快速发展期。1990年,五英寸VLSI晶圆厂的完工并开始生产,标志着公司在晶圆制造方面迈出了坚实的一步。随着生产能力的提升,合泰半导体开始积极拓展全球市场。2000年,公司股票公开发行,并通过国际ISO9001质量系统认证,进一步巩固了其在行业内的地位。同年,香港分公司的成立,以及随后在美国和上海设立的子公司,使得合泰半导体的业务版图迅速扩展至全球,加强了其在北美和大陆地区的销售与技术服务能力。

故事三:技术创新与产品研发

合泰半导体始终将技术创新视为企业发展的核心动力。进入21世纪后,公司不断推出具有竞争力的新产品,以满足市场的多样化需求。例如,在MCU(微控制器)领域,合泰半导体凭借其在低功耗、高性能方面的技术优势,成功开发出多款适用于触控、健康量测、工业控制等多个领域的MCU产品。这些产品的推出不仅丰富了公司的产品线,也进一步提升了公司在全球市场的竞争力。

故事四:物联网市场的布局与深耕

随着物联网市场的兴起,合泰半导体敏锐地捕捉到了这一新兴市场的巨大潜力。公司开始积极布局物联网领域,致力于为客户提供从硬件到软件、从芯片到解决方案的一站式服务。在智能家居、健康医疗、智慧城市等物联网应用场景中,合泰半导体凭借其专业的MCU产品和强大的技术服务能力,赢得了众多客户的信赖与合作。通过不断的技术创新和产品优化,合泰半导体在物联网市场中占据了重要地位。

故事五:人才培养与校企合作

人才是企业发展的根本。合泰半导体深知这一点,因此一直将人才培养视为企业发展的重要战略之一。公司不仅为员工提供丰富的在职培训计划和职涯提升管道,还积极与高校开展校企合作,共同培养具有创新精神和实践能力的专业人才。例如,与某高校共建单片机应用开发联合实验室,不仅为学生提供了实践锻炼的平台,也为企业输送了大量优秀人才。这种校企合作模式不仅促进了企业的技术创新和产品研发,也为行业培养了大量高素质的专业人才。

DIPTRONICS MANUFACTURING INC公司的发展小趣事

为了降低成本、提高生产效率,圜达实业不断进行垂直整合。公司自主设计和生产自动组装机、模具和工具等生产设备,实现了从原材料采购到成品供应的全程控制。这种垂直整合的模式使公司在保证产品品质的同时,也降低了生产成本,提高了市场竞争力。

Cretex Companies Inc公司的发展小趣事

为了降低成本、提高生产效率,Cretex开始对产业链进行整合与优化。他们与上游供应商建立长期稳定的合作关系,确保原材料的稳定供应和质量可靠。同时,公司还加强了对下游客户的服务与支持,通过提供个性化的解决方案和优质的售后服务,增强了客户黏性。这些举措使得Cretex在激烈的市场竞争中保持了领先地位。

E-Z-HOOK公司的发展小趣事

随着全球化进程的加速推进,E-Z-HOOK公司开始积极拓展国际市场。他们通过参加国际展会、建立海外销售网络等方式,将产品推向全球各地。同时,公司还积极寻求与国际知名企业的合作机会,共同开发新技术和新产品。这些努力使得E-Z-HOOK公司的品牌影响力逐渐扩大,在全球范围内树立了良好的声誉和形象。

ELM Technology Corporation公司的发展小趣事

ELM Technology Corporation一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格把控。这种对品质的坚持不仅赢得了客户的信任,还为ELM赢得了良好的口碑。在激烈的市场竞争中,ELM凭借卓越的产品品质赢得了市场份额。

问答坊 | AI 解惑

请教:windows下PCI卡的DMA传输问题

本人最近在Windows下用Tiger320芯片来写一个PCI卡的通信驱动程序,使用到了Tiger320的DMA传输,现遇到一些问题,望各位大侠赐教: 问题描述:在对硬件及DMA初始化完成后,启动DMA,此时未进行任何读写操作,可是读写中断信号就一直的发个不停,不 ...…

查看全部问答>

微软社区精英计划深圳地区招募

微软社区精英计划的目标是培养和聚合优秀博客或书籍作者、技术视频录制者、技术讲师,提供发展平台。微软会为社区精英提供相应的培训,并为活动提供各种支持。 目前社区精英计划的上海,北京,深圳组织已近成立,相对于上海和北京的众多参与者,深 ...…

查看全部问答>

DM9000A网络芯片中断脚INT无输出信号

代码用的是Uboot的dm9000x驱动,按照需要做了适当修改。初始化函数如下: /* Initilize dm9000 board */ int eth_init( const char *ps_mac ) {         int i, oft, lnk;     unsigned char u8_byte = 0;   & ...…

查看全部问答>

vxWorks中与dos中的gotoxy和cprintf等价函数是什么?谢谢

由于程序显示的内容较多,用printf翻屏太快,无法看清。 但是也不想利用WindML开发图形。所以想寻找一个类似MSC中的“textout”或者标准C中的gotoxy和cprintf,实现数据在屏幕固定地方的输出。 谢谢各位提供帮助!…

查看全部问答>

单片机时钟误差怎么改正

晶振为12MHZ  方式0 TH为D8F0 中断100次为1s 测试了11小时13分07秒      误差为3分11秒 那么TH改为多少比较准确点呢??怎么算的!…

查看全部问答>

改进封装技术 提高HB LED光通量

replyreload += \',\' + 713755;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

关于blackhawk的USB2000仿真器使用问题??

DSP:28027 仿真器:BH-USB-2000 软件:CCS4.2.1 问题:在使用BH-USB-2000进行仿真的时候发现不能设置断点(就是双击后为灰色,报警提示“Target not run as breakpoint could not be set: Error programming AET Job: Register write failed” ...…

查看全部问答>

WINCE WIFI

各位高手,请问我有个CE的CF接口的WIFI无线网卡 但是没有5.0的驱动,只有3.0的驱动 请问可以修改使用吗?…

查看全部问答>