历史上的今天
返回首页

历史上的今天

今天是:2024年12月21日(星期六)

2018年12月21日 | STM32中断数据回调函数接收处理

2018-12-21 来源:eefocus

1.定义一个空的指针函数 指针函数的参数是uint8_t 类型ch


typedef void (* usart_recv_callback)(uint8_t ch);



2.声明这个类型


usart_recv_callback  usart1_recv_cb;



3.串口配置时,一个形参为串口中断接收回调


void Usart_Config(USART_TypeDef* USARTx, uint32_t baudRate, usart_recv_callback cb)


{


 GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    if(USARTx == USART1)

    {

        usart1_recv_cb = cb;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

        /* Configure USART1 Tx (PA.09) as alternate function push-pull */

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* Configure USART1 Rx (PA.10) as input floating */

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

        USART_InitStructure.USART_BaudRate = baudRate;

        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(USART1, &USART_InitStructure);

        if(cb)

        {

            USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


            /* Enable the USARTy Interrupt */

            NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

            NVIC_Init(&NVIC_InitStructure);

        }

        USART_Cmd(USART1, ENABLE);

    }


}




分析:usart1_recv_cb = cb;这句语句是将形参指针函数 cb 赋值给 usart1_recv_cb


            if(cb):是判断回调函数指针是否为空,如果不为空则中断初始化




4.串口中断函数


void USART1_IRQHandler(void)

{

     uint8_t ch;

     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

     {

         /* Read one byte from the receive data register */

         ch = USART_ReceiveData(USART1);

         usart1_recv_cb(ch);

         USART_ClearITPendingBit(USART1, USART_IT_RXNE);

     }

}


分析:将串口1中断接收到的值赋值给ch,然后ch作为usart1_recv_cb函数的输入参数


5.


void HCHO_Test(uint8_t recv_data)

{

if((sensorstr.hcho_addr == 0) && (recv_data != 0xff))

{

        sensorstr.hcho_addr = 0;

return;

}

if((sensorstr.hcho_addr == 1) && (recv_data != 0x17))

{

   sensorstr.hcho_addr = 0;

return;

}

if((sensorstr.hcho_addr == 2) && (recv_data != 0x04))

{

        sensorstr.hcho_addr = 0;

return;

}

    

sensorstr.hcho_packet[sensorstr.hcho_addr++] = recv_data;

}


分析:void HCHO_Test(uint8_t recv_data)函数就是我们所说的回调函数,此函数和 1.里所定义的void (* usart_recv_callback)(uint8_t ch)函数指针是对应的。


6.


int main(void)


{


Usart_Config(PM_UART, 9600, PM_Test);


}


PM_Test函数首地址就是usart_recv_callback cb的形参


推荐阅读

史海拾趣

ADI(亚德诺半导体)公司的发展小趣事

亚德诺半导体(Analog Devices Inc.,简称ADI)是一家全球领先的模拟技术公司,以下是该公司发展的五个相关故事:

  1. 公司成立与初期发展: 亚德诺半导体成立于1965年,总部位于美国马萨诸塞州。公司最初的业务主要集中在研发和生产模拟集成电路(ICs),为各种应用提供信号处理解决方案。其产品包括放大器、数据转换器、功率管理器等。

  2. 技术创新与产品推出: 亚德诺半导体在模拟领域持续进行技术创新,并不断推出具有竞争力的产品。公司在数据转换器、放大器、射频器件等方面处于领先地位,并不断扩展业务范围,涉足汽车、工业、通信等多个领域。

  3. 并购与战略合作: 亚德诺半导体通过并购和战略合作不断扩大规模和增强实力。公司先后收购了一系列企业,包括Hittite Microwave Corporation、Linear Technology Corporation等,进一步拓展了产品线和市场份额。

  4. 市场拓展与国际化发展: 亚德诺半导体积极拓展国内外市场,并实现了国际化发展。公司产品远销全球各地,与全球范围内的主要客户建立了长期合作关系。同时,公司在全球范围内设有研发中心、销售办事处和生产基地,为客户提供本地化服务和支持。

  5. 未来展望与持续发展: 亚德诺半导体将继续致力于技术创新和产品开发,加强与客户的合作,满足不断变化的市场需求。公司将继续扩大在汽车、工业、通信等领域的市场份额,并积极布局新兴市场,保持行业领先地位,实现业务的持续增长和发展。

GD Rectifiers Ltd公司的发展小趣事

面对电子行业日益激烈的市场竞争,GD Rectifiers Ltd通过并购整合的方式加速了自身的发展步伐。公司精心挑选了几家在细分领域具有领先地位的竞争对手,通过友好协商和合理估值,成功完成了对这些企业的并购。并购后,GD Rectifiers Ltd充分利用被并购企业的技术优势和市场份额,实现了产品线的进一步丰富和销售渠道的拓展。同时,公司还加强了对内部资源的整合和优化,提高了整体运营效率和市场竞争力。

Foxboro I C T Inc公司的发展小趣事

面对电子行业日益激烈的市场竞争,GD Rectifiers Ltd通过并购整合的方式加速了自身的发展步伐。公司精心挑选了几家在细分领域具有领先地位的竞争对手,通过友好协商和合理估值,成功完成了对这些企业的并购。并购后,GD Rectifiers Ltd充分利用被并购企业的技术优势和市场份额,实现了产品线的进一步丰富和销售渠道的拓展。同时,公司还加强了对内部资源的整合和优化,提高了整体运营效率和市场竞争力。

CINTERION公司的发展小趣事

2010年,电子支付与身份识别技术领域的领军企业金雅拓,全资收购了CINTERION。这一资本动作不仅为CINTERION带来了更多的资金支持,更使其在金雅拓的物联网事业部中获得了更广阔的发展空间。收购完成后,CINTERION继续保持其技术领先地位,并在金雅拓的推动下,进一步拓宽了产品线和应用领域。

Entegris公司的发展小趣事

2019年1月底,Entegris与Versum Materials宣布合并。合并后的公司由Entegris占据五席董事,而Versum占四席。Versum是一家主要生产半导体的化学、气体及输送系统的公司,两家公司的前三大客户均为台积电、英特尔、三星电子。合并后,新公司在半导体材料市场的影响力显著增强,同时也面临着来自德国默克等竞争对手的挑战。

Ford Aerospace & Communications Corp公司的发展小趣事

在汽车制造领域,福特一直是技术创新的领导者。20世纪60年代,福特开始将电子设备集成到汽车中,包括车载电话、导航系统以及早期的娱乐系统。这些创新不仅提升了驾驶的便捷性和舒适性,也预示着未来汽车电子化、智能化的趋势。虽然这些技术并不直接属于航空通信范畴,但它们展示了福特在电子技术应用方面的前瞻性和实力。

问答坊 | AI 解惑

飞思卡尔智能汽车比赛

本来是要参加明天的飞思卡尔智能汽车比赛的,前段时间被老师叫去帮他完成一些东西,就退出来了。下面是一些飞思卡尔的资料,或许有用。 …

查看全部问答>

总线方式布线是怎样的方式!?

在pcb布线的过程中,总线方式布线是怎样的方式!?在县卡,主板上看到其布线很漂亮,经询问说是总线方式布线,不懂。请教。在protel中用shift+空格转换…

查看全部问答>

vxworks usrRoot任务起不来!

    各位vxworks的前辈们,小弟刚刚接触vxworks,目前使用一块MPC852的板子,自带了bootrom,无源码,无仿真器,板子启动后bootrom可以正常运行,现在我自己修改了一个MPC852的BSP,并基于此做了个vxworks镜像。       ...…

查看全部问答>

关于一个单片机串口接收FPGA配置文件的问题,希望大家不吝赐教

各位高手,小弟有疑问相求,最近被安排做个小东西,目的是把几个FPGA的配置文件利用串口发给单片机,单片机接收后将其存入几片EEPROM里,再根据需求选择用哪个文件来配置FPGA,感觉上位机程序的功能和串口调试助手有点像。疑问就在于: 1.是否可以 ...…

查看全部问答>

网络综合布线系统概述

综合布线是一种模块化的、灵活性极高的建筑物内或建筑群之间的信息传输通道。它既能使语音、数据、图像设备和交换设备与其它信息管理系统彼此相连, 也能使这些设备与外部相连接。它还包括建筑物外部网络或电信线路的连接点与应用系统设备之间的所有 ...…

查看全部问答>

新手求助啊 ccs5.1延时程序中asm("nop")

当加一个asm(\"nop\")到延时程序中,无任何问题,当有2个以上延时程序时则会出现错误,如何解决啊?  附图 …

查看全部问答>

FL2440屏幕初始化

我看了FL2440屏幕初始化的代码,在bootloader,eboot还有wince驱动中都有,但是只有bootloader中的初始化调用了,eboot还有wince驱动中都没有调用初始化函数。。但是我现在用spi接口的屏幕照样做,bootloader中可以点亮,但是到了wince中就会熄灭, ...…

查看全部问答>

430仿真器的驱动装不上去win7 32位的,指点一下吧

430仿真器的驱动装不上去win7 32位的,每次都安装不成功,出现下面这种情况…

查看全部问答>

BB-Black到货啦!

BB-Black 到货啦!上图 接下来就是arm linux移植以及交叉编译的问题了,之前在OK6410板子上做过。也是一番痛苦的经历。再来一次吧!…

查看全部问答>