完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
最近项目开发要求用到近距离红外通信,需要实现两个红外设备的数据传输。于是开发完成后,简单对过程进行一个记录。
一、关于IRDA红外串口通信 IrDA是红外数据组织(Infrared Data Association)的简称。IrDA制定了一系列的红外通信标准,支持异步,半双工的同步系统,传输速率为2400bps到115200bps,传输范围1m。 和其他无线电磁波传输方式相比,红外线传输有方向性,一般不支持移动,且极容易收到墙壁的阻碍,收发双方必须相互对准才能进行通信,但是它的安全性更好。 二、STM32对IRDA的支持及配置 接口硬件电路 由于使用的是STM32F7系列单片机,它自身是支持IRDA通信协议的,因此,在通过STM32CubeMx配置的时候,我们只需要在工作模式上选择IDRA模式即可。 串口波特率设置为115200。 这里由于我考虑接收处理方便,采用的串口DMA+空闲中断的方式实现红外数据的接收,因此在配置的时候,还需要配置串口DMA。 生成代码后,实现关键部分的数据接收发送处理,最后烧写代码。我本身有一个红外的数据发送设备(大家测试的时候,也可以通过串口线,一头接串口调试助手,一头接红外头),这里单片机是作为接收端在使用。 三、验证测试 当两个红外头对准后,终端发送数据,单片机正常接收发送过来的一帧数据,且发送数据和接收数据一致。 四、代码 初始化配置 void MX_USART6_IRDA_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_USART6_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF8_USART6; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); hirda6.Instance = USART6; hirda6.Init.BaudRate = 115200; hirda6.Init.WordLength = IRDA_WORDLENGTH_8B; hirda6.Init.Parity = IRDA_PARITY_NONE; hirda6.Init.Mode = IRDA_MODE_TX_RX; hirda6.Init.Prescaler = 10; hirda6.Init.PowerMode = IRDA_POWERMODE_NORMAL; if (HAL_IRDA_Init(&hirda6) != HAL_OK) { } /* USART6_RX Init */ hdma_usart6_rx.Instance = DMA2_Stream1; hdma_usart6_rx.Init.Channel = DMA_CHANNEL_5; hdma_usart6_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_usart6_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart6_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart6_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_usart6_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_usart6_rx.Init.Mode = DMA_NORMAL; hdma_usart6_rx.Init.Priority = DMA_PRIORITY_LOW; hdma_usart6_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_usart6_rx) != HAL_OK) { } __HAL_LINKDMA(&hirda6,hdmarx,hdma_usart6_rx); HAL_IRDA_Receive_DMA(&hirda6,usart6_dat.rx_buf,USART_MAX_LEN); /* USART6 interrupt Init */ HAL_NVIC_SetPriority(USART6_IRQn, 6, 2); HAL_NVIC_EnableIRQ(USART6_IRQn); __HAL_UART_ENABLE_IT(&hirda6,UART_IT_IDLE); __HAL_UART_CLEAR_IDLEFLAG(&hirda6); } 数据接收 void USART6_IRQHandler(void) { uint8_t i=0; BaseType_t xHigherPriorityTaskWoken; if(Get_DCahceSta())SCB_CleanInvalidateDCache(); if((__HAL_UART_GET_FLAG(&hirda6,UART_FLAG_IDLE)!=RESET)) { __HAL_UART_CLEAR_IDLEFLAG(&hirda6); HAL_IRDA_DMAStop(&hirda6); usart6_dat.len = USART_MAX_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart6_rx); if(usart6_dat.len>0) { xEventGroupSetBitsFromISR(UsartEventGourpHandler,USART_EVENT3_IRDA,&xHigherPriorityTaskWoken); } __HAL_DMA_SET_COUNTER(&hdma_usart6_rx,USART_MAX_LEN); HAL_IRDA_Receive_DMA(&hirda6,usart6_dat.rx_buf,USART_MAX_LEN); } HAL_IRDA_IRQHandler(&hirda6); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1802 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1096 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
735 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1685 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
747浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
580浏览 3评论
602浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 08:05 , Processed in 0.889032 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号